Here’s an implementation of the Shi-Tomasi corner-detector.

#!/usr/bin/env ruby require 'hornetseye' include Hornetseye raise "Syntax: s_t.rb <input file> <output file>" if ARGV.size != 2 grad_sigma = 1 cov_sigma = 1 img = MultiArray.load_ubyte( ARGV[0] ).to_dfloat x, y = img.gauss_gradient( grad_sigma, 0 ), img.gauss_gradient( grad_sigma, 1 ) a = ( x ** 2 ).gauss_blur cov_sigma b = ( y ** 2 ).gauss_blur cov_sigma c = ( x * y ).gauss_blur cov_sigma tr = a + b det = a * b - c * c # "major" is needed to deal with numerical errors. dissqrt = Math.sqrt( ( tr * tr - det * 4 ).major( 0.0 ) ) # Take smallest eigenvalue. Eigenvalues are "0.5 * ( tr +- dissqrt)" result = 0.5 * ( tr - dissqrt ) result.normalise( 0xFF .. 0 ).save_ubyte ARGV[1]