Posted by
Michael Schmid on
Dec 14, 2010; 8:44pm
URL: http://imagej.273.s1.nabble.com/Autocorrelation-using-Fourier-tp3686185p3686188.html
Hi Damon,
you are right, that's a fundamental property of the Fourier transform:
You have periodic boundary conditions, so, e.g., a shift right by 0.6
image widths is equivalent to a shift left by 0.4 image widths.
What you could try:
Enlarge the images, with a background equal to the average brightness
of the image, and preferably some smearing from the image border into
the background to avoid artifacts caused by the shap edge.
For the correlation image, you will typically need some highpass
filter or background subtraction to find the well-defined maximum.
Here is a quick example, using my 'Fast Filters' for highpass filtering
http://imagejdocu.tudor.lu/doku.php?
id=plugin:filter:fast_filters:start
run("Boats (356K)");
makeRectangle(117, 78, 333, 333);
run("Duplicate...", "title=boats-1.gif");
run("Canvas Size...", "width=512 height=512 position=Center zero");
makeRectangle(89, 89, 333, 333); //the previous size
run("Make Inverse");
run("Set...", "value=140"); //background: average of image
run("Gaussian Blur...", "sigma=5");
run("Gaussian Blur...", "sigma=4");
run("Gaussian Blur...", "sigma=3");
selectWindow("boats.gif");
makeRectangle(337, 226, 333, 333); //x shift 220, y shift 148
run("Duplicate...", "title=boats-2.gif");
run("Canvas Size...", "width=512 height=512 position=Center zero");
makeRectangle(89, 89, 333, 333);
run("Make Inverse");
run("Set...", "value=90");
run("Gaussian Blur...", "sigma=5");
run("Gaussian Blur...", "sigma=4");
run("Gaussian Blur...", "sigma=3");
run("FD Math...", "image1=boats-1.gif operation=Correlate
image2=boats-2.gif result=Result do");
run("Fast Filters", "link filter=[background from minima] x=20 y=20
preprocessing=none subtract offset=0");
run("Enhance Contrast", "saturated=0.001");
(remove any linebreaks caused by the mailer)
Michael
________________________________________________________________
On 14 Dec 2010, at 21:04, Damon Poburko wrote:
> Michael,
>
> This little gem looks like it should be very helpful with
> automated registration of paired, offset images. I am probably
> missing something simple, but the correlation for partially
> overlapping images seems to fail when the alignment offset of two
> images is more than half the width or height of the image. Could
> you suggest a method to work around this?
>
> Thanks,
> Damon
>
> On 12/14/2010 1:39 AM, Michael Schmid wrote:
>> Hi Norbert,
>>
>> here is a rough equivalent to the core of your correlation macro
>> using FFT:
>>
>> k100 = 100; //how far out we need the autocorrelation
>> run("FD Math...", "image1=AutoCorr.tif operation=Correlate
>> image2=AutoCorr.tif result=Result do");
>> width = getWidth();
>> run("Divide...", "value="+(width*width)); //FD Math gives sum over
>> all pixels; convert to mean
>> half = width/2; //origin is at the center
>> makeLine(half, half, half+k100, half);
>> run("Plot Profile");
>>
>> It won't be 100% exact because the FFT version extends the image
>> assuming periodic boundary conditions, not using a value of zero
>> as the 'translate' command in your macro.
>> This won't matter for your test image which has a rather large
>> border with zero value.
>> If periodic boundary conditions are a problem, simply enlarge the
>> image to the next power of 2 with zero background.
>>
>> Hope this helps.
>>
>> Michael
>> ________________________________________________________________
>>
>>
>> On 13 Dec 2010, at 23:19, Norbert Vischer wrote:
>>
>>> Hello all,
>>>
>>> I created a test macro that performs 1D autocorrelation.
>>> It runs well in a few seconds, but I wonder if the speed can be
>>> improved by Fourier techniques for larger data sets.
>>>
>>> The macro first creates a test image that is randomly covered
>>> with white horizontal lines with a mean length of 20 pixels. The
>>> image is then periodically multiplied with a horizontally shifted
>>> copy, so I get the autocorrelation plot from which I can derive
>>> the mean line length. The output looks like this:
>>>
>>> Simulated Length = 20.17
>>> Measured Length = 20.06
>>>
>>> Later in reality, the white lines will represent the fluorescent
>>> duration of molecules, and the data set will be much larger.
>>> I doubt that a native plugin will do the same thing much faster,
>>> but has anyone a suggestion how to use Fourier techniques?
>>>
>>> My demo macro can be downloaded from:
>>>
http://simon.bio.uva.nl/objectj/GenericMacros/AutoCorrelation/
>>> AutoCorrelation-2.txt
>>>
>>>
>>> Norbert Vischer