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");
}