Posted by
aweitz on
Jun 23, 2009; 8:27pm
URL: http://imagej.273.s1.nabble.com/Place-elliptical-ROI-with-mouse-click-tp3691999p3692001.html
Hi everyone,
Thanks so much for all the suggestions. Unfortunately, I was looking for some pretty specific behavior. I needed a fast way to place and resize ROIs, since each one of my images has about 100 of them. I was able to modify some of the source code and create a plugin to give me the behavior I desired...
I ended up implementing a new class called SomaRoi that extends OvalRoi:
public class SomaRoi extends OvalRoi {
protected int region_size;
public SomaRoi (int x, int y, int diameter, ImagePlus imp) {
super(x, y, imp);
region_size = diameter;
}
protected void handleMouseDrag(int sx, int sy, int flags) {
if (state == CONSTRUCTING)
flags = flags|Event.CTRL_MASK;
super.handleMouseDrag(sx, sy, flags);
}
public void draw(Graphics g) {
if (width == 0 && height == 0) {
width = region_size;
height = region_size;
x = x - width/2;
y = y - height/2;
startX = x;
startY = y;
oldWidth = width;
oldHeight = height;
oldX = x;
oldY = y;
}
else if (state == CONSTRUCTING) {
x = x + width/2;
y = y + height/2;
oldX = x;
oldY = y;
}
state = CONSTRUCTING;
super.draw(g);
}
}
Then I added a function to ImagePlus that creates soma ROIs:
public void createNewSomaRoi(int sx, int sy, int diameter) {
killRoi();
roi = new SomaRoi(sx, sy, diameter, this);
}
Finally, I created a plugin that calls createNewSomaRoi() when the user clicks on the image:
public class Soma_Roi_Tool implements PlugInFilter {
protected static int region_size;
public int setup(String arg, ImagePlus imp) {
this.region_size = 16;
return DOES_ALL;
}
public void run(ImageProcessor ip) {
if (IJ.versionLessThan("1.37c")) return;
showSomaDialog();
String macro =
"macro 'Soma ROI Tool-C00cO11cc' {\n" +
" getCursorLoc(x, y, z, flags);\n" +
" call('Soma_Roi_Tool.mousePressed', x, y, z, flags);\n"+
"}";
new MacroInstaller().install(macro);
}
public static void mousePressed(String xs, String ys, String zs, String flags) {
int x = Integer.parseInt(xs);
int y = Integer.parseInt(ys);
ImagePlus img = WindowManager.getCurrentImage();
if (img!=null)
img.createNewSomaRoi(x, y, region_size);
}
public static void showSomaDialog() {
GenericDialog gd = new GenericDialog("Soma ROI Tool");
gd.addNumericField("Diameter:", region_size, 0, 2, "pixels");
gd.showDialog();
if (gd.wasCanceled()) return;
region_size = (int)gd.getNextNumber();
}
}
This gave me the exact behavior I was looking for. The only thing I'm not happy about is having to modify the ImagePlus class. If anyone has an idea for doing this without modifying ImagePlus, or if anyone can suggest a more elegant way of implementing this, I'd be happy to listen.
Thanks again!
Andrew
dpoburko wrote
aweitz wrote:
> Hi,
>
> I'd like to modify the elliptical ROI tool. Currently, the tool only places
> ROIs with click and drag (to specify ellipse size). A click without a drag
> does nothing. Instead, I'd like the click (without a drag) to place an ROI
> of set size (12x12) at the area of the mouse click. The click and drag
> behavior should remain unmodified.
>
> Can anyone tell me where I can look in the code to make this modification?
>
> Thanks!
> Andrew
>
You could try the Time Series Analyzer plugin. (
http://rsb.info.nih.gov/ij/plugins/time-series.html) It will provide a
GUI to let you select a give ROI size then create ROIs with a single
click. You can resize ROIs by selecting a given ROI and dragging to the
new size or position, then clicking on Update in the ROI manager.
Hope that helps,
Damon
--
Damon Poburko, PhD
Postdoctoral Research Fellow
Stanford University School of Medicine
Dept. of Molecular & Cellular Physiology
279 Campus Dr., Beckman B103, Stanford, CA 94305
Ph: 650 725 7564, fax: 650 725 8021