Image Montage
sjr51
// Menu item for easy execution
Menu "Macros"
"Make Montage...", MontageSetUp()
End
// Requires 8-bit images. Will accept RGB and grayscale.
// Triggers load of TIFF stack for making montage
Function MontageSetUp()
ImageLoad/O/Q/T=tiff/S=0/C=-1/LR3D/N=masterImage ""
WAVE/Z masterImage
if(!WaveExists(masterImage))
Abort "Image load error"
endif
Variable nSlices = V_numImages
if(nSlices < 2)
Abort "Must have two or more slices"
endif
Variable rr=1,cc=1,gg=0
String usrmsg = " (note that your stack has " + num2str(nSlices) + " slices)"
Prompt rr, "Rows:" + usrmsg
Prompt cc, "Columns:"
Prompt gg, "Grout (px):"
DoPrompt "Montage details", rr,cc,gg
if(V_Flag == 1)
Abort "The user pressed Cancel"
endif
if(rr == 0 || cc == 0)
Print "Rows or columns must be > 0"
return -1
elseif((rr * cc) < nSlices)
Print "Montage shows first", (rr * cc), "slices only."
elseif((rr * cc) > nSlices)
Print "Montage has", ((rr * cc) - nSlices), "blanks."
endif
MontageMaker(masterImage,rr,cc,gg,S_path)
End
//This procedure works in Igor 7.0 and later
//// @param masterImage TIFF stack to be split
//// @param nRows Montage will be nRows tall
//// @param nColumns Montage will be nColumns wide
//// @param grout Pixels of grouting between panels (no border)
//// @param pathString String containing path to original TIFF stack
Function MontageMaker(masterImage,nRows,nColumns,grout,pathString)
Wave masterImage
Variable nRows,nColumns,grout
String pathString
NewPath/O/Q imagePath, pathString
if(!WaveExists(masterImage))
Print "Image does not exist"
return 0
endif
Variable tSize = dimsize(masterImage,3)
Variable zSize = dimsize(masterImage,2)
Variable xSize = dimsize(masterImage,1)
Variable ySize = dimsize(masterImage,0)
Variable x1 = (xSize * nColumns) + (grout * (nColumns-1))
Variable y1 = (ySize * nRows) + (grout * (nRows-1))
Variable nLayers
if(tSize == 0)
// case where there are no chunks assume BW stack
nLayers = zSize
Make/B/U/O/N=(x1,y1) newMontage = 255
else
// if there are chunks then assume RGB stack
nLayers = tSize
Make/B/U/O/N=(x1,y1,zSize) newMontage = 255
endif
Variable xPos=0,ypos=0
Variable i,j
for(i = 0; i < nLayers; i += 1)
xPos = mod(i,nColumns)
yPos = floor(i/nColumns)
x1 = (xSize * xPos) + (grout * xPos)
y1 = (ySize * yPos) + (grout * yPos)
if(tSize == 0)
Duplicate/O/FREE/RMD=[][][i,i] masterImage, subImage
ImageTransform /INSI=subImage/INSX=(x1)/INSY=(y1) InsertImage newMontage
else
for(j = 0; j < 3; j += 1)
Duplicate/O/FREE/RMD=[][][j][i,i] masterImage, subImage
ImageTransform/P=(j)/INSI=subImage/INSX=(x1)/INSY=(y1) InsertImage newMontage
endfor
endif
endfor
KillWindow/Z result
NewImage/N=result newMontage
KillWaves masterImage
ImageSave/P=imagePath/T="tiff" newMontage
End
Menu "Macros"
"Make Montage...", MontageSetUp()
End
// Requires 8-bit images. Will accept RGB and grayscale.
// Triggers load of TIFF stack for making montage
Function MontageSetUp()
ImageLoad/O/Q/T=tiff/S=0/C=-1/LR3D/N=masterImage ""
WAVE/Z masterImage
if(!WaveExists(masterImage))
Abort "Image load error"
endif
Variable nSlices = V_numImages
if(nSlices < 2)
Abort "Must have two or more slices"
endif
Variable rr=1,cc=1,gg=0
String usrmsg = " (note that your stack has " + num2str(nSlices) + " slices)"
Prompt rr, "Rows:" + usrmsg
Prompt cc, "Columns:"
Prompt gg, "Grout (px):"
DoPrompt "Montage details", rr,cc,gg
if(V_Flag == 1)
Abort "The user pressed Cancel"
endif
if(rr == 0 || cc == 0)
Print "Rows or columns must be > 0"
return -1
elseif((rr * cc) < nSlices)
Print "Montage shows first", (rr * cc), "slices only."
elseif((rr * cc) > nSlices)
Print "Montage has", ((rr * cc) - nSlices), "blanks."
endif
MontageMaker(masterImage,rr,cc,gg,S_path)
End
//This procedure works in Igor 7.0 and later
//// @param masterImage TIFF stack to be split
//// @param nRows Montage will be nRows tall
//// @param nColumns Montage will be nColumns wide
//// @param grout Pixels of grouting between panels (no border)
//// @param pathString String containing path to original TIFF stack
Function MontageMaker(masterImage,nRows,nColumns,grout,pathString)
Wave masterImage
Variable nRows,nColumns,grout
String pathString
NewPath/O/Q imagePath, pathString
if(!WaveExists(masterImage))
Print "Image does not exist"
return 0
endif
Variable tSize = dimsize(masterImage,3)
Variable zSize = dimsize(masterImage,2)
Variable xSize = dimsize(masterImage,1)
Variable ySize = dimsize(masterImage,0)
Variable x1 = (xSize * nColumns) + (grout * (nColumns-1))
Variable y1 = (ySize * nRows) + (grout * (nRows-1))
Variable nLayers
if(tSize == 0)
// case where there are no chunks assume BW stack
nLayers = zSize
Make/B/U/O/N=(x1,y1) newMontage = 255
else
// if there are chunks then assume RGB stack
nLayers = tSize
Make/B/U/O/N=(x1,y1,zSize) newMontage = 255
endif
Variable xPos=0,ypos=0
Variable i,j
for(i = 0; i < nLayers; i += 1)
xPos = mod(i,nColumns)
yPos = floor(i/nColumns)
x1 = (xSize * xPos) + (grout * xPos)
y1 = (ySize * yPos) + (grout * yPos)
if(tSize == 0)
Duplicate/O/FREE/RMD=[][][i,i] masterImage, subImage
ImageTransform /INSI=subImage/INSX=(x1)/INSY=(y1) InsertImage newMontage
else
for(j = 0; j < 3; j += 1)
Duplicate/O/FREE/RMD=[][][j][i,i] masterImage, subImage
ImageTransform/P=(j)/INSI=subImage/INSX=(x1)/INSY=(y1) InsertImage newMontage
endfor
endif
endfor
KillWindow/Z result
NewImage/N=result newMontage
KillWaves masterImage
ImageSave/P=imagePath/T="tiff" newMontage
End
Forum
Support
Gallery
Igor Pro 9
Learn More
Igor XOP Toolkit
Learn More
Igor NIDAQ Tools MX
Learn More