Filters

Sobel Operator

X-Gradient

This is an example on how to compute the Sobel x-gradient. A correlation of the input image with the following separable filter is performed.

require 'hornetseye_rmagick'
require 'hornetseye_xorg'
include Hornetseye
img = MultiArray.load_ubyte 'http://www.wedesoft.de/hornetseye-api/images/grey.png'
img.sobel( 0 ).normalise.show

Y-Gradient

This is an example on how to compute the Sobel y-gradient. A correlation of the input image with the following separable filter is performed.

require 'hornetseye_rmagick'
require 'hornetseye_xorg'
include Hornetseye
img = MultiArray.load_ubyte 'http://www.wedesoft.de/hornetseye-api/images/grey.png'
img.sobel( 1 ).normalise.show

Gaussian Blur

This is an example on how to apply a Gauss blur filter. The filter can be applied to colour images as well.

require 'hornetseye_rmagick'
require 'hornetseye_xorg'
include Hornetseye
img = MultiArray.load_ubytergb 'http://www.wedesoft.de/hornetseye-api/images/lena.jpg'
img.gauss_blur( 3.0 ).show

Van Cittert Deconvolution

Van Cittert deconvolution is an iterative algorithm for reversing a convolution with a known point spread function. To demonstrate the algorithm, the result of the Gaussian blur is used. The Van Cittert algorithm then is applied to this image to estimate the original input image. The first iteration of the algorithm uses the blurred image as an estimate.

require 'hornetseye_rmagick'
require 'hornetseye_xorg'
include Hornetseye
SIGMA = 3.0
N = 20
img = MultiArray.load_ubytergb( 'http://www.wedesoft.de/hornetseye-api/images/lena.jpg' ).gauss_blur( SIGMA ).to_ubytergb
g = img.to_sfloatrgb
N.times { g = img + g - g.gauss_blur( SIGMA ) }
g.clip.show

Wiener Filter

The Wiener filter is the optimal linear filter for denoising and deblurring. The filter requires prior knowledge about the autospectrum of the signal, the point spread function of the blur, and the autospectrum of the noise. In this example white noise is assumed. To demonstrate the algorithm, a Gaussian blur is applied to the input image and the Wiener filter is used to estimate the input signal.

require 'hornetseye_fftw3'
require 'hornetseye_rmagick'
require 'hornetseye_xorg'
include Hornetseye
class Node
  def radius
    w, h = *shape
    lazy w, h do |i,j|
      Math.sqrt( ( i - w / 2 ) **2 + ( j - h / 2 ) ** 2 )
    end
  end
  def spectrum( alpha )
    w, h = *shape
    ( 255.0 / ( 1.0 + ( radius / alpha ) ** 2 ) ).shift -w / 2, -h / 2
  end
  def blur( sigma )
    w, h = *shape
    retval = MultiArray.ubyte( w, h ).fill!
    retval[ w / 2, h / 2 ] = 1
    retval.gauss_blur( sigma ).shift -w / 2, -h / 2
  end
  def wiener( alpha, noise, sigma = nil )
    if typecode < RGB_
      result = MultiArray(typecode.float, dimension).new *shape
      result.r, result.g, result.b = [ r, g, b ].collect do |c|
        c.wiener alpha, noise, sigma
      end
      result
    else
      si = spectrum( alpha ) ** 2
      if sigma
        bf = blur( sigma ).fft
        ( bf.conj * si / ( bf.abs ** 2 * si + noise ** 2 ) * fft ).ifft.real
      else
        ( si / ( si + noise ** 2 ) * fft ).ifft.real
      end
    end
  end
end
NOISE = 2.0
SIGMA = 3.0
img = MultiArray.load_ubytergb( 'http://www.wedesoft.de/hornetseye-api/images/lena.jpg' ).gauss_blur( SIGMA ).to_ubytergb
img.wiener( img.shape[0] * 0.1, NOISE, SIGMA ).clip.show

Gauss Gradient

X-Gradient

This is an example on how to compute the Gaussian x-gradient.

require 'hornetseye_rmagick'
require 'hornetseye_xorg'
include Hornetseye
img = MultiArray.load_ubytergb 'http://www.wedesoft.de/hornetseye-api/images/lena.jpg'
img.gauss_gradient( 3.0, 0 ).normalise.show

Y-Gradient

This is an example on how to compute the Gaussian y-gradient.

require 'hornetseye_rmagick'
require 'hornetseye_xorg'
include Hornetseye
img = MultiArray.load_ubytergb 'http://www.wedesoft.de/hornetseye-api/images/lena.jpg'
img.gauss_gradient( 3.0, 1 ).normalise.show

Custom Filters

+------+------+------+
|  -k  |  -k  |  -k  |
+------+------+------+
|  -k  | 8k+1 |  -k  |
+------+------+------+
|  -k  |  -k  |  -k  |
+------+------+------+

HornetsEye supports fast convolution with custom filters. In this example a 3x3 sharpness filter is created and used to sharpen the input image (here k=0.4). Note that the filter in this example is not separable. If your filter is separable you should exploit this to improve the speed of the filtering operation.

require 'hornetseye_rmagick'
require 'hornetseye_xorg'
include Hornetseye
K = 0.4
filter = MultiArray[ [ -K, -K, -K ], [ -K,  8 * K + 1, -K ], [ -K, -K, -K ] ]
img = MultiArray.load_ubytergb 'http://www.wedesoft.de/hornetseye-api/images/lena.jpg'
result = img.convolve filter
result.clip.show

Connected Components Labeling

Connected component analysis assigns the same label to neighbouring pixel which have the same value.

require 'hornetseye_rmagick'
require 'hornetseye_xorg'
include Hornetseye
img = MultiArray.load_ubyte 'http://www.wedesoft.de/hornetseye-api/images/letters.png'
components = (img >= 0x7F).components
palette = Sequence.ubytergb components.max + 1
palette.r, palette.g, palette.b = *(1 .. 3).collect do
  Sequence(UBYTE).random palette.size, 256
end
palette[0] = 0
components.lut(palette).show

See Also