Home › Forums › Scripts › Problem with Create Fix size ROI from barycenter script › Reply To: Problem with Create Fix size ROI from barycenter script

#65656

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,