Script

Create fixed size ROI from mass center / barycenter position

Publication ID: ICY-R5B3I3

Short Description

This script will iterate through all ROIs from the active Sequence and create for each ROI a new fixed size Rectangle ROI which is located at the mass center (barycenter).

Team: Bio Image Analysis
Institution: Institut Pasteur
Website: http://www.bioimageanalysis.org/

Documentation

See description..

Versions

  • Version 3 • Released on: 2019-04-26 11:00:00
    Download
    Description:

    Fixed some bugs and commented debug info

    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)
    }
  • Version 2 • Released on: 2016-07-22 17:22:39
    Download
    Description:

    fixed some bugs.

    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("MassCenterX", roi, sequence).doubleValue()
        y = ROIUtil.computeDescriptor("MassCenterY", roi, sequence).doubleValue()
        
        surface = ROIUtil.computeDescriptor("Interior", roi, sequence).doubleValue()
        meanIntensity = ROIUtil.computeDescriptor("MeanIntensity", roi.getSubROI(-1, -1, 0), sequence).doubleValue()
        
        keepSpot = true
    
        // filtering
    //    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)
    
        println(x)
        println(y)
        println(xmin)
        println(ymin)
        println(xmax)
        println(ymax)
        println(newRoi.getBounds2D())
    
        // preserve some settings from original ROI
        pos = roi.getPosition5D()
        newRoi.setName(roi.getName() + " - fixed")
        newRoi.setColor(roi.getColor())
        newRoi.setZ(pos.getZ())
        newRoi.setT(pos.getT())
        newRoi.setC(pos.getC())
    
        // add the ROI to the sequence
        sequence.addROI(newRoi)
    }
    
  • Version 1 • Released on: 2016-07-22 15:28:43
    Download
    Description:

    initial version

    importClass(Packages.plugins.adufour.roi.ROIBasicDescriptor)
    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.icy.roi.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 = 2;
    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("MassCenterX", roi, sequence)
        y = ROIUtil.computeDescriptor("MassCenterY", roi, sequence)
        
        surface = ROIUtil.computeDescriptor("Interior", roi, sequence)
        meanIntensity = ROIUtil.computeDescriptor("MeanIntensity", roi.getSubROI(-1, -1, 0), sequence)
        
        keepSpot = true
    
        // filtering
    //    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
    
        // remove spot if mass center too close from borders
        if (x - (boxSize+1) < 0) keepSpot = false
        if (y - (boxSize+1) < 0) keepSpot = false
        if (x + (boxSize+1) > w) keepSpot = false
        if (y + (boxSize+1) > h) keepSpot = false
    
        if (!keepSpot) continue
    
        // create the Rectangle ROI
        newRoi = new ROI2DRectangle(new Point2D.Double(x - boxSize, y - boxSize),
            new Point2D.Double(x + boxSize + 1, y + boxSize + 1),
            false)
        // preserve some settings from original ROI
        newRoi.setName(roi.getName() + " - fixed")
        newRoi.setColor(roi.getColor())
    
        // add the ROI to the sequence
        sequence.addROI(newRoi)
    }
    

Leave a Review