Login  Register

Re: Paste and Blend only overlapping regions (MakeMontage variation)

Posted by Bruno on May 25, 2009; 8:55am
URL: http://imagej.273.s1.nabble.com/Paste-and-Blend-only-overlapping-regions-MakeMontage-variation-tp3692412p3692416.html

On Sat, 23 May 2009 11:05:20 +0200, Alan Hewat
<[hidden email]> wrote:

>I have looked at various montage macros for creating composite mosaics
>from overlapping images, and wanted to try something simpler using
>"imageJ/Stacks/Make Montage". Since my image offsets required for
>registration are constant, I can modify the MakeMontage.txt macro to
>offset the image rectangles before pasting.

I made a macro that converts a stack of images with an equal vertical
offset into a single image. The overlapping parts are blended. Maybe this
helps.

// This macro stiches images from a stack into a new image
//works only for 32 bit images (convert stack to 32 bit imege first).
// displacement+overlap defines distance in pixels between two images.
// overlap is the area that is blended via a wedge shape.

macro "Stich Stack" {

        displacement=20; // note: total displacement is 24+20 = 44 pixels
        overlap=24;

        width=getWidth();
        height=getHeight();

        imageTitle=getTitle();
        slices=nSlices;
        run("32-bit"); // force image to be 32 bit

        newTitle="Reconstructed "+imageTitle;
        newImage(newTitle, "32-bit Black", width, slices*
(displacement+overlap)+overlap, 1);
// reconstructed image
        newImage(imageTitle+"_wedge", "32-bit Black", width,
displacement+2*overlap, 1);
// create wedge shape blend type
        run("Min...", "value=1");
        dy=1/overlap;
        if(dy>0)
        { for(y=0;y<overlap;y++)
                        for(x=0;x<width;x++)
                                setPixel(x,y,dy*y);
                for(y=0;y<overlap;y++)
                        for(x=0;x<width;x++)
                                setPixel(x,y+overlap+displacement,1-dy*y);
        }
        newImage(imageTitle+"_buffer", "32-bit Black", width,
(displacement+2*overlap), 1);

        selectWindow(imageTitle); //stack image
        setBatchMode(true);
        for (slice=1; slice<=slices; slice++) {
                setSlice(slice);
                run("Specify...", "width="+ width +" height="+
displacement+2*overlap +" x=0 y="+ height/2-displacement/2-overlap+"
slice="+slice);
                run("Copy");
                selectWindow(imageTitle+"_buffer");
                run("Select None");
                setPasteMode("Copy");
                run("Paste");
                imageCalculator("Multiply",
imageTitle+"_buffer",imageTitle+"_wedge");
                selectWindow(imageTitle+"_buffer");
                run("Select All");
                run("Copy");
                setPasteMode("Add");
                selectWindow(newTitle);
                run("Select None");
                run("Specify...", "width="+ width +" height=" +
(displacement+2*overlap) +" x=0 y="+ ((overlap+displacement)*(slice-1)) );
                setPasteMode("Add");
                run("Paste");
                selectWindow(imageTitle);
        }
        setBatchMode(false);
        selectWindow(imageTitle+"_buffer");
        close();
        selectWindow(imageTitle+"_wedge");
        close();
        selectWindow(newTitle);
        run("Select None");
        run("Enhance Contrast", "saturated=0");
}