Fred's ImageMagick Scripts



    Licensing:

    My scripts are available free of charge for non-commercial use, ONLY.

    For use of my scripts in commercial (for-profit) environments or non-free applications, please contact me (Fred Weinhaus) for licensing arrangements. My email address is fmw at alink dot net.

    If you: 1) redistribute, 2) incorporate any of these scripts into other free applications or 3) reprogram them in another scripting language, then you must contact me for permission, especially if the result might be used in a commercial or for-profit environment.

    Usage, whether stated in the script or not, is restricted to the above licensing arrangements. It is also subject to the ImageMagick license, which can be found at: http://www.imagemagick.org/script/license.php

NORMCROSSCORR


Computes the normalized cross correlation surface to find where a small image best matches within a larger image.

Download Script

last modified: November 28, 2011



USAGE: normcrosscorr [-s] [-p] [-m mode] [-c color] smallfile largefile corrfile [matchfile]
USAGE: normcrosscorr [-h or -help]

-s .............. stretch the correlation surface to full dynamic range so
................. that the best match is full white; default is unstretched
-p .............. apply a pseudocolor to the correlation surface image;
................. default is no pseudocoloring
-m .... mode .... mode for matchfile output; choices are: draw or overlay;
................. draw colored box at best match location or
................. overlay the small image at match location on a one half
................. transparent large image; default=draw
-c .... color ... color to use for drawing box on large image where best
................. matched subsection was found; default=black

PURPOSE: To compute the normalized cross correlation surface to find where a small image best matches within a larger image.

DESCRIPTION: NORMCROSSCORR compute the normalized cross correlation surface (image) to find where a small (first) image best matches within a larger (second) image. Since the matching may differ for each channel, the two input images will be converted to grayscale. Any alpha channel on either image will be removed automatically before processing.

WARNING: I believe due to the way ImageMagick normalizes images internally to a dynamic range of 0 to 1 before doing any processing, the correlation surface will not generally have a perfect match score of +1, but will be image dependent and smaller than 1. Nevertheless, it does seem to find the correct best match location.

ARGUMENTS:

-s ... Stretch the normalized cross correlation surface image to full dynamic range so that the best match is full white. Default is no stretch

-p ... Apply a pseudocoloring to the normalized cross correlation surface image where red corresponds to the highest values and purple to the lowest values. Default is no pseudocoloring.

-m mode ... MODE is the layout mode for the optional matchfile image. Choices are draw (or d) or overlay (or o). Draw simply draws a colored box outline at the best match subsection in the larger image. Overlay inserts the small image at the match location of a one-half transparent version of the larger image. The default="draw". Ignored if no matchfile specified.

-c color ... COLOR is the color to use to draw the outline of the best matching subsection in the larger image when mode=1. Any valid IM color specification may be used. The default=black.

REQUIREMENTS: IM version 6.5.4-7 or higher, but compiled with HDRI enabled in any quantum level of Q8, Q16 or Q32. Also requires the FFTW delegate library.

See Fourier Transform Processing with ImageMagick, for more details.

CAVEAT: No guarantee that this script will work on all platforms, nor that trapping of inconsistent parameters is complete and foolproof. Use At Your Own Risk.


EXAMPLES


Small Image
(subsection [64x64+32+27])

Large Image

Arguments:
-s
Match Coords: (32,27) And Score In Range 0 to 1: (0.664981)

Correlation Image

Match Location

Arguments:
-s -p
Match Coords: (32,27) And Score In Range 0 to 1: (0.664981)

Correlation Image

Match Location



Small Image
(subsection [23x14+152+22])

Large Image

Arguments:
-s -c white
Match Coords: (156,22) And Score In Range 0 to 1: (0.276753)

Correlation Image

Match Location



What the script does is as follows:

  • Normalizes the small image by subtracting its mean value and
    dividing by its standard deviation and padding with black to fill
    it out to the same size as the large image
  • Creates a small image containing all ones but padded
    with black to the same size as the large image
  • Creates the square of the large image
  • Computes the cross correlation between these images in
    the frequency domain and transforms the results back to the
    spatial domain
  • Combines the resulting images to form the correlation result

See the script for actual code details. Or for more mathematical detail
see Fourier Transform Processing With ImageMagick