help-octave
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: cross-correlation for image registration


From: Matthew Nicholas
Subject: Re: cross-correlation for image registration
Date: Thu, 16 Feb 2012 12:04:25 -0500

> Quoting Carnë Draug <address@hidden>:
> 
>> On 15 February 2012 21:15, Matt Nicholas <address@hidden> wrote:
>>> Hello list,
>>> I'm a reasonably experienced MATLAB user who is trying to move to Octave.
>>> One task I frequently need to perform is image registration via cross
>>> correlation, which I used to do in MATLAB using the normxcorr2. Basically, I
>>> found the index of the maximum value in the correlation matrix, subtracted
>>> the width and height of the template image from these coordinates, and this
>>> gave me the shift of the template relative to the test image.  I have tried
>>> using xcorr2 in Octave with the 'coeff' flag, but the results are not what I
>>> would expect, and not very similar to normxcorr2 for the same images in
>>> MATLAB (to be honest, I am not terribly surprised, because for some reason I
>>> was never able to get this to work with xcorr2 in MATLAB either, but I
>>> simply switched to normxcorr2 years ago and forgot about it). So I am a
>>> little stuck. I've seen some previous discussion of this topic, with one
>>> user even offering to write an Octave version of normxcorr2, but it doesn't
>>> seem to have come to completion.
>>> 
>>> Just to be clear, this is not a complaint that normxcorr2 is 'missing' in
>>> Octave. I am happy to change my approach if I can achieve similar results
>>> with another method. Since it's a common task, I figured I would ask for
>>> suggestions before trying to reinvent the wheel. Is there some appropriate
>>> method of normalizing the output of xcorr2 to achieve what I want? Honestly,
>>> I doubt this is a normalization issue, since the maximum value in the
>>> correlation matrix is not *located* where I would expect (regardless of its
>>> absolute magnitude). So a related question might be, does anyone know the
>>> difference between xcorr2 and normxcorr2 in MATLAB?
>>> 
>>> Many thanks in advance for your help,
>>> Matt
>> 
>> Hi Matt
>> 
>> I had a need for that function a while ago (for exactly the same
>> purpose, image registration). I have an implementation of it on the
>> development version of the image package. you can see it here:
>> 
>> http://octave.svn.sourceforge.net/viewvc/octave/trunk/octave-forge/main/image/inst/normxcorr2.m?revision=9630&view=markup
>> 
>> This makes the image package dependent on the signal package.
>> 
>> Carnë
>> 
> 
Thanks for your replies!

Carnë, from what I can tell, the normxcorr2 function you linked is a wrapper 
for xcorr2 using the coeff flag, correct? I'd tried this previously as well, 
but the results were not always what you would expect from 'normalized cross 
correlation' as defined in the link Jordi provided. I think the problem may be 
that the cross correlation is computed the same way even with the coeff flag, 
and simply scaled at the end (I have to admit to not looking at the source yet, 
however). Experimenting with the other available scaling flags did not change 
the result noticeably. This might work for image registration with a small set 
of cases (eg bright spot on a dark background), but in general does not give 
the desired results. As an example, consider this image of Clint Eastwood in a 
tuxedo:
http://4.bp.blogspot.com/_osrVjnPbdEM/SsECvF8o6-I/AAAAAAAAMRY/HpZrYdfazVI/s400/Too_Old_for_Action_clint-eastwood_2.jpg
> 
> I named it 'test.jpg', and ran the code below in MATLAB. It crops out his 
> nose and then correctly overlays it with the original photo. In Octave, 
> replacing normxcorr2 with xcorr2 (or using the normxcorr2 you provided), it 
> overlays the nose image on his shirt. I believe the problem is that since his 
> shirt is bright white, multiplying any part of the image with that region 
> will give a maximum unless it is scaled somehow. Whereas in MATLAB there is a 
> sharp maximum in the cross correlation near his nose, in Octave it is 
> diffusely bright and closely resembles the original image. Please let me know 
> if I am missing something.
> 
> Jordi, I would be happy to share anything I come up with, though I have to 
> admit that in the past, I have basically used these functions as an "end 
> user" and my background in digital signal processing is basically 
> non-existent. However, the algorithm in the link you provided seems 
> relatively straightforward. If I can find the time, I'll try to implement it 
> and see how far I get.
> 
> Many thanks again for your help.
> 
> -Matt
> 
> ----------
> 
> img = imread('test.jpg');
> img = rgb2gray(img);
> 
> tmp = img(120:180,150:190);
> 
> cc = normxcorr2(tmp, img);
> [Y X] = find(cc == max(cc(:)));
> S = size(tmp);
> 
> Yo = Y - S(1) + 1;
> Xo = X - S(2) + 1;
> 
> img2 = 0*img;
> img2(Yo:(Yo+S(1)-1), Xo:(Xo+S(2)-1)) = tmp;
> 
> im_overlay = cat(3,img, img+img2, img+img2);
> subplot(221), imshow(img)
> subplot(222), imshow(tmp);
> subplot(223), imshow(cc)
> subplot(224), imshow(im_overlay);


reply via email to

[Prev in Thread] Current Thread [Next in Thread]