Shi-Tomasi corner-detector

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

See also

#!/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]
Close