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).
Documentation
See description..
Versions
-
Version 3 • Released on: 2019-04-26 11:00:00DownloadDescription:
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:39DownloadDescription:
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:43DownloadDescription:
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) }