Here is an example session with interactive Ruby (irb). It shows how HornetsEye can be used interactively.

interactive.rb(main):001:0> require 'hornetseye' => true interactive.rb(main):002:0> include Hornetseye => Object interactive.rb(main):003:0> img = MultiArray.load_rgb24( "../data/images/fubk.png" ) # read an image => MultiArray.ubytergb(384,288): [ [ RGB( 77, 77, 77 ), RGB( 77, 77, 77 ), RGB( 77, 77, 77 ), ... ], [ RGB( 77, 77, 77 ), RGB( 77, 77, 77 ), RGB( 77, 77, 77 ), ... ], [ RGB( 77, 77, 77 ), RGB( 77, 77, 77 ), RGB( 77, 77, 77 ), ... ], [ RGB( 255, 255, 255 ), RGB( 255, 255, 255 ), ... ], [ RGB( 77, 77, 77 ), RGB( 77, 77, 77 ), RGB( 77, 77, 77 ), ... ], [ RGB( 77, 77, 77 ), RGB( 77, 77, 77 ), RGB( 77, 77, 77 ), ... ], [ RGB( 77, 77, 77 ), RGB( 77, 77, 77 ), RGB( 77, 77, 77 ), ... ], [ RGB( 77, 77, 77 ), RGB( 77, 77, 77 ), RGB( 77, 77, 77 ), ... ], [ RGB( 77, 77, 77 ), RGB( 77, 77, 77 ), RGB( 77, 77, 77 ), ... ], [ RGB( 77, 77, 77 ), RGB( 77, 77, 77 ), RGB( 77, 77, 77 ), ... ], ... interactive.rb(main):004:0> region = img[ 71...312, 43...244 ] # copy a region from this image => MultiArray.ubytergb(241,201): [ [ RGB( 255, 255, 255 ), RGB( 255, 255, 255 ), ... ], [ RGB( 255, 255, 255 ), RGB( 192, 192, 192 ), ... ], [ RGB( 255, 255, 255 ), RGB( 192, 192, 192 ), ... ], [ RGB( 255, 255, 255 ), RGB( 192, 192, 192 ), ... ], [ RGB( 255, 255, 255 ), RGB( 192, 192, 192 ), ... ], [ RGB( 255, 255, 255 ), RGB( 192, 192, 192 ), ... ], [ RGB( 255, 255, 255 ), RGB( 192, 192, 192 ), ... ], [ RGB( 255, 255, 255 ), RGB( 192, 192, 192 ), ... ], [ RGB( 255, 255, 255 ), RGB( 192, 192, 192 ), ... ], [ RGB( 255, 255, 255 ), RGB( 192, 192, 192 ), ... ], ... interactive.rb(main):005:0> channels = [ region.r, region.g, region.b ] => [MultiArray.ubyte(241,201): [ [ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, ... ], [ 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, ... ], [ 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, ... ], [ 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, ... ], [ 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, ... ], [ 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, ... ], [ 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, ... ], [ 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, ... ], [ 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, ... ], [ 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, ... ], ..., MultiArray.ubyte(241,201): [ [ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, ... ], [ 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, ... ], [ 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, ... ], [ 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, ... ], [ 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, ... ], [ 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, ... ], [ 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, ... ], [ 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, ... ], [ 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, ... ], [ 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, ... ], ..., MultiArray.ubyte(241,201): [ [ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, ... ], [ 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, ... ], [ 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, ... ], [ 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, ... ], [ 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, ... ], [ 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, ... ], [ 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, ... ], [ 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, ... ], [ 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, ... ], [ 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, ... ], ...] interactive.rb(main):006:0> edges = channels.collect do |channel| # apply Sobel operator to each channel interactive.rb(main):007:1* tmp = channel.to_type( MultiArray::SINT ) interactive.rb(main):008:1> ( tmp.sobel_x ** 2 + tmp.sobel_y ** 2 ).sqrt.normalise interactive.rb(main):009:1> end => [MultiArray.dfloat(241,201): [ [ 221.99189174382, 186.350476253752, 171.730020671984, ... ], [ 186.350476253752, 59.7670477771824, 56.3489130329947, ... ], [ 171.730020671984, 56.3489130329947, 0.0, 0.0, 0.0, 0.0, 0.0, ... ], [ 171.730020671984, 56.3489130329947, 0.0, 0.0, 0.0, 0.0, 0.0, ... ], [ 171.730020671984, 56.3489130329947, 0.0, 0.0, 0.0, 0.0, 0.0, ... ], [ 171.730020671984, 56.3489130329947, 0.0, 0.0, 0.0, 0.0, 0.0, ... ], [ 171.730020671984, 56.3489130329947, 0.0, 0.0, 0.0, 0.0, 0.0, ... ], [ 171.730020671984, 56.3489130329947, 0.0, 0.0, 0.0, 0.0, 0.0, ... ], [ 171.730020671984, 56.3489130329947, 0.0, 0.0, 0.0, 0.0, 0.0, ... ], [ 171.730020671984, 56.3489130329947, 0.0, 0.0, 0.0, 0.0, 0.0, ... ], ..., MultiArray.dfloat(241,201): [ [ 221.99189174382, 186.350476253752, 171.730020671984, ... ], [ 186.350476253752, 59.7670477771824, 56.3489130329947, ... ], [ 171.730020671984, 56.3489130329947, 0.0, 0.0, 0.0, 0.0, 0.0, ... ], [ 171.730020671984, 56.3489130329947, 0.0, 0.0, 0.0, 0.0, 0.0, ... ], [ 171.730020671984, 56.3489130329947, 0.0, 0.0, 0.0, 0.0, 0.0, ... ], [ 171.730020671984, 56.3489130329947, 0.0, 0.0, 0.0, 0.0, 0.0, ... ], [ 171.730020671984, 56.3489130329947, 0.0, 0.0, 0.0, 0.0, 0.0, ... ], [ 171.730020671984, 56.3489130329947, 0.0, 0.0, 0.0, 0.0, 0.0, ... ], [ 171.730020671984, 56.3489130329947, 0.0, 0.0, 0.0, 0.0, 0.0, ... ], [ 171.730020671984, 56.3489130329947, 0.0, 0.0, 0.0, 0.0, 0.0, ... ], ..., MultiArray.dfloat(241,201): [ [ 221.99189174382, 186.350476253752, 171.730020671984, ... ], [ 186.350476253752, 59.7670477771824, 56.3489130329947, ... ], [ 171.730020671984, 56.3489130329947, 0.0, 0.0, 0.0, 0.0, 0.0, ... ], [ 171.730020671984, 56.3489130329947, 0.0, 0.0, 0.0, 0.0, 0.0, ... ], [ 171.730020671984, 56.3489130329947, 0.0, 0.0, 0.0, 0.0, 0.0, ... ], [ 171.730020671984, 56.3489130329947, 0.0, 0.0, 0.0, 0.0, 0.0, ... ], [ 171.730020671984, 56.3489130329947, 0.0, 0.0, 0.0, 0.0, 0.0, ... ], [ 171.730020671984, 56.3489130329947, 0.0, 0.0, 0.0, 0.0, 0.0, ... ], [ 171.730020671984, 56.3489130329947, 0.0, 0.0, 0.0, 0.0, 0.0, ... ], [ 171.730020671984, 56.3489130329947, 0.0, 0.0, 0.0, 0.0, 0.0, ... ], ...] interactive.rb(main):010:0> # Combine the edge images and save the result. interactive.rb(main):011:0* cedges = MultiArray.new( MultiArray::UBYTERGB, *region.shape ) => MultiArray.ubytergb(241,201): [ [ RGB( 0, 0, 0 ), RGB( 0, 0, 0 ), RGB( 0, 0, 0 ), RGB( 0, 0, 0 ), ... ], [ RGB( 0, 0, 0 ), RGB( 0, 0, 0 ), RGB( 0, 0, 0 ), RGB( 0, 0, 0 ), ... ], [ RGB( 0, 0, 0 ), RGB( 0, 0, 0 ), RGB( 0, 0, 0 ), RGB( 0, 0, 0 ), ... ], [ RGB( 0, 0, 0 ), RGB( 0, 0, 0 ), RGB( 0, 0, 0 ), RGB( 0, 0, 0 ), ... ], [ RGB( 0, 0, 0 ), RGB( 0, 0, 0 ), RGB( 0, 0, 0 ), RGB( 0, 0, 0 ), ... ], [ RGB( 0, 0, 0 ), RGB( 0, 0, 0 ), RGB( 0, 0, 0 ), RGB( 0, 0, 0 ), ... ], [ RGB( 0, 0, 0 ), RGB( 0, 0, 0 ), RGB( 0, 0, 0 ), RGB( 0, 0, 0 ), ... ], [ RGB( 0, 0, 0 ), RGB( 0, 0, 0 ), RGB( 0, 0, 0 ), RGB( 0, 0, 0 ), ... ], [ RGB( 0, 0, 0 ), RGB( 0, 0, 0 ), RGB( 0, 0, 0 ), RGB( 0, 0, 0 ), ... ], [ RGB( 0, 0, 0 ), RGB( 0, 0, 0 ), RGB( 0, 0, 0 ), RGB( 0, 0, 0 ), ... ], ... interactive.rb(main):012:0> cedges.r, cedges.g, cedges.b = *edges => [MultiArray.dfloat(241,201): [ [ 221.99189174382, 186.350476253752, 171.730020671984, ... ], [ 186.350476253752, 59.7670477771824, 56.3489130329947, ... ], [ 171.730020671984, 56.3489130329947, 0.0, 0.0, 0.0, 0.0, 0.0, ... ], [ 171.730020671984, 56.3489130329947, 0.0, 0.0, 0.0, 0.0, 0.0, ... ], [ 171.730020671984, 56.3489130329947, 0.0, 0.0, 0.0, 0.0, 0.0, ... ], [ 171.730020671984, 56.3489130329947, 0.0, 0.0, 0.0, 0.0, 0.0, ... ], [ 171.730020671984, 56.3489130329947, 0.0, 0.0, 0.0, 0.0, 0.0, ... ], [ 171.730020671984, 56.3489130329947, 0.0, 0.0, 0.0, 0.0, 0.0, ... ], [ 171.730020671984, 56.3489130329947, 0.0, 0.0, 0.0, 0.0, 0.0, ... ], [ 171.730020671984, 56.3489130329947, 0.0, 0.0, 0.0, 0.0, 0.0, ... ], ..., MultiArray.dfloat(241,201): [ [ 221.99189174382, 186.350476253752, 171.730020671984, ... ], [ 186.350476253752, 59.7670477771824, 56.3489130329947, ... ], [ 171.730020671984, 56.3489130329947, 0.0, 0.0, 0.0, 0.0, 0.0, ... ], [ 171.730020671984, 56.3489130329947, 0.0, 0.0, 0.0, 0.0, 0.0, ... ], [ 171.730020671984, 56.3489130329947, 0.0, 0.0, 0.0, 0.0, 0.0, ... ], [ 171.730020671984, 56.3489130329947, 0.0, 0.0, 0.0, 0.0, 0.0, ... ], [ 171.730020671984, 56.3489130329947, 0.0, 0.0, 0.0, 0.0, 0.0, ... ], [ 171.730020671984, 56.3489130329947, 0.0, 0.0, 0.0, 0.0, 0.0, ... ], [ 171.730020671984, 56.3489130329947, 0.0, 0.0, 0.0, 0.0, 0.0, ... ], [ 171.730020671984, 56.3489130329947, 0.0, 0.0, 0.0, 0.0, 0.0, ... ], ..., MultiArray.dfloat(241,201): [ [ 221.99189174382, 186.350476253752, 171.730020671984, ... ], [ 186.350476253752, 59.7670477771824, 56.3489130329947, ... ], [ 171.730020671984, 56.3489130329947, 0.0, 0.0, 0.0, 0.0, 0.0, ... ], [ 171.730020671984, 56.3489130329947, 0.0, 0.0, 0.0, 0.0, 0.0, ... ], [ 171.730020671984, 56.3489130329947, 0.0, 0.0, 0.0, 0.0, 0.0, ... ], [ 171.730020671984, 56.3489130329947, 0.0, 0.0, 0.0, 0.0, 0.0, ... ], [ 171.730020671984, 56.3489130329947, 0.0, 0.0, 0.0, 0.0, 0.0, ... ], [ 171.730020671984, 56.3489130329947, 0.0, 0.0, 0.0, 0.0, 0.0, ... ], [ 171.730020671984, 56.3489130329947, 0.0, 0.0, 0.0, 0.0, 0.0, ... ], [ 171.730020671984, 56.3489130329947, 0.0, 0.0, 0.0, 0.0, 0.0, ... ], ...] interactive.rb(main):013:0> cedges.to_type(MultiArray::UBYTERGB).save_rgb24( "interactive.png" ) => 241x201 RGB24-image interactive.rb(main):014:0> (end code)