turboreg stack transformation

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

turboreg stack transformation

Tony Lien
Hello ImageJ scientists,

I need to do image registration on a series of reasonably static movies.
There is very little movement within each movie, but the registration drifts
slightly when comparing movies to each other.  I found the TurboReg plugin
to work well for restoring the proper registration, but I am having some
problems.  What I am trying to do is write a macro that will:

1.  Take average z-projection of each movie, set one as the "target", and
compute affine transforms of each z-projection to the target.  Thus each
movie gets one transform.
2.  For each movie, apply the computed transform to every frame of the
movie.

#1 is easy enough to do with TurboReg and the parameters of the transforms
are saved by TurboReg in the form of landmark coordinates.

To implement #2, I call turboReg in the "transform" mode and load the source
and target landmark coordinates from the registration performed in #1.  This
does not work on a stack however, so I am doing it frame by frame.
Unfortunately the whole process is quite slow and I suspect it might be due
to the constant redrawing of windows and all the "duplicate" calls.  Is
there a way I can improve the speed?  I don't have much experience with
macro programming in ImageJ so any help is appreciated.  The code for my
function is at the end of the message.

-Tony Lien

function registerStack(originalStackID, width, height, sourceX1, sourceY1,
sourceX2, sourceY2, sourceX3, sourceY3, targetX1, targetY1, targetX2,
targetY2, targetX3, targetY3) {

run("Conversions...", " "); //don't re-scale when converting to 16bit
numSlices = nSlices;
for(i=1; i <=numSlices; i++) { //for each slice
    selectImage(originalStackID);
    setSlice(i);
    run("Duplicate...", "title=currentFrame"); //get the current slice
    run("TurboReg ", "-transform -window currentFrame " + width + " " +
height + " " + "-affine " + sourceX1 + " " + sourceY1 + " " + targetX1 + " "
+ targetY1 + " " + sourceX2 + " " + sourceY2 + " " + targetX2 + " " +
targetY2 + " " + sourceX3 + " " +  sourceY3 + " " + targetX3 + " " +
targetY3 + " -showOutput"); //run turboReg transform
    rename("turboRegOutput");
    run("Duplicate...", "title=registered"); //get the result
    run("16-bit");
    if(i == 1) { //if this is the first slice, start the "registeredStack"
        run("Duplicate...", "title=registeredStack");
        selectWindow("registered");
        close();
    } else { //otherwise, concatenate the result with the growing
"registeredStack"
        run("Concatenator ", "stack1=registeredStack stack2=registered
title=registeredStack");
    }

    selectWindow("currentFrame"); //close unneeded windows
    close();
    selectWindow("turboRegOutput");
    close();

}

    selectWindow("registeredStack");
}
Reply | Threaded
Open this post in threaded view
|

Re: turboreg stack transformation

seb-7
Tony Lien wrote:

[snip]

> To implement #2, I call turboReg in the "transform" mode and load the source
> and target landmark coordinates from the registration performed in #1.  This
> does not work on a stack however, so I am doing it frame by frame.
> Unfortunately the whole process is quite slow and I suspect it might be due
> to the constant redrawing of windows and all the "duplicate" calls.  Is
> there a way I can improve the speed?

Hello Tony,

I think you're right.

Have you tried the "setBatchMode" function?

http://rsb.info.nih.gov/ij/developer/macro/functions.html#setBatchMode

before your big loop:

setBatchMode(true);

for(i=1; i <=numSlices; i++) { //for each slice
....//do something
}
....
setBatchMode(false);
updateDisplay();

this might speed up your macro.

sebastien