Using integral arrays and element-wise lookup (map) one can implement histogram equalisation.

#!/usr/bin/env ruby
require 'hornetseye'
include Hornetseye
raise "Syntax: equalise.rb <input file> <output file>" if ARGV.size != 2
class Sequence_
def average
sum / size
end
def equalise( n = 4096, c_max = 255 )
if typecode < RGB_
result = contiguous.class.new
max_average = [ r, g, b ].collect { |c| c.average }.max
result.r, result.g, result.b = *[ r, g, b ].collect do |c|
c.equalise n, c_max * c.average / max_average
end
result
else
quantised = normalise 0 .. n - 1
quantised.map quantised.hist( n ).integral.normalise( 0 .. c_max )
end
end
end
img = MultiArray.load_sfloatrgb ARGV[0]
img.equalise.save_ubytergb ARGV[1]