http://imagej.273.s1.nabble.com/Autocorrelation-using-Fourier-tp3686185p3686189.html
Thanks for the tip. Padding the images up to the next power of two
worked nicely. I didn't try smoothing the transition from the image to
the padded region. Rather, I added a little bit of noise, then ran the
correlation image through a band pass filter. Seems like it works just
fine. Many thanks!!! I've been scheming for months over how to implement
> 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