Home › Forums › Scripts › Problem with Create Fix size ROI from barycenter script › Reply To: Problem with Create Fix size ROI from barycenter script
April 26, 2019 at 11:55 am
#65656
Keymaster
Hi,
Since last version of Icy, you don’t need to pass anymore by a script to do that, you can use the new ‘to Circle’ and ‘to Square’ ROI operations :
But just in case, here’s the fixed script (i tried to update it on the website but i couldn’t do it for now) :
importClass(Packages.icy.roi.ROIUtil)
importClass(Packages.icy.roi.ROIDescriptor)
importClass(Packages.icy.gui.dialog.MessageDialog)
importClass(Packages.icy.sequence.Sequence)
importClass(Packages.java.util.ArrayList)
importClass(Packages.plugins.fab.spotDetector.detector.UDWTWavelet)
importClass(Packages.plugins.kernel.roi.roi2d.ROI2DRectangle)
importClass(java.awt.geom.Point2D)
// this is the parameters you asked for: considering the center of mass,
// the algo will look in a box of side boxSize*2+1 where the center of mass is the center of this box
//
// for boxSize = 2
//
// *****
// *****
// **X**
// *****
// *****
//
// with * : pixel considered for Rectangle ROI
// X: location of center of mass
boxSize = 1
removePreviousRois = false
// get the current sequence focused by the user
sequence = getSequence()
// check if the sequence exists
if ( sequence == null )
{
MessageDialog.showDialog("Please open an image first", MessageDialog.INFORMATION_MESSAGE);
throw "no sequence"; // stops the script and say why
}
w = sequence.getSizeX()
h = sequence.getSizeY()
// get all rois
rois = sequence.getROIs()
// get the number of rois
roiCount = rois.size()
println("Number of rois: " + roiCount)
// remove all existing ROI if requested
if (removePreviousRois)
sequence.removeAllROI()
// cycle over all rois
for (i = 0; i < roiCount; i++)
{
roi = rois.get(i) // get the spot
x = ROIUtil.computeDescriptor("Mass center X", roi, sequence).doubleValue()
y = ROIUtil.computeDescriptor("Mass center Y", roi, sequence).doubleValue()
keepSpot = true
// filtering
surface = ROIUtil.computeDescriptor("Interior", roi, sequence).doubleValue()
meanIntensity = ROIUtil.computeDescriptor("Mean intensity", roi.getSubROI(-1, -1, 0), sequence).doubleValue()
//
// if (surface < 10) keepSpot = false // remove too small spots // if (surface > 60) keepSpot = false // remove too big spots
// if (meanIntensity < 100) keepSpot = false // remove too big spots
xmin = x - boxSize
ymin = y - boxSize
xmax = x + boxSize + 1
ymax = y + boxSize + 1
// remove spot if mass center too close from borders
if (xmin < 0) keepSpot = false
if (ymin < 0) keepSpot = false if (xmax > w) keepSpot = false
if (ymax > h) keepSpot = false
if (!keepSpot) continue
// create the Rectangle ROI
newRoi = new ROI2DRectangle(xmin, ymin, xmax, ymax)
// preserve some settings from original ROI
ROIUtil.copyROIProperties(roi, newRoi, false)
newRoi.setName(roi.getName() + " - fixed")
// add the ROI to the sequence
sequence.addROI(newRoi)
}
About inserting image from the forum, you can do it using the toolbar :
Note that sometime you need to refresh the page to get the toolbar to display (we are working on fixing that).
Best,