ImageJ API:如何在java代码中访问直线选择对象?

时间:2016-02-05 11:46:48

标签: java imagej

我在我的Java应用程序中使用ImageJ 1.x API,我以无形模式运行ImageJ:

ImageJ imageJApplication = new ImageJ(2);

在我的Java应用程序中,我生成了几个图像并打开它们以供用户交互:

Opener opener = new Opener();  
String imageFilePath = getLastImageFilePath();
ImagePlus imp = opener.openImage(imageFilePath);
imp.show();

我为用户提供了在任何打开的图像上进行直线选择的可能性:

IJ.setTool(4);

如果用户在图像上画了一条直线,那么我需要得到这条线的长度。为此,我尝试访问由用户交互产生的直线选择对象。不幸的是,我不知道ImageJ创建的位置并保留此对象。

我认为它应该是ij.gui.Line类的对象(扩展ij.gui.Roi的类)。我知道要在java程序中自己绘制一个Roi类型的对象,我会创建一个ij.gui.Overlay实例,将Roi对象添加到叠加层,然后将叠加层设置为我的目标实例ImagePlus。所以我试图在打开的图像的叠加层中寻找直线选择对象:

ImagePlus imp = WindowManager.getCurrentImage();
double lineLength = 0;

Overlay overlay = imp.getOverlay();
if (overlay!=null){
  for (int i = 0; i < overlay.size(); i++){
    if (overlay.get(i).isLine()){
      Line currentImageLine = (Line) overlay.get(i);
      lineLength = currentImageLine.getLength();
    }
  }
}

但是对于用户绘制直线的图像,上面代码中的调用imp.getOverlay()会返回null。因此,显然,叠加是查找用户生成的直线选择对象实例的错误位置。有人知道,如何访问直线选择对象?

1 个答案:

答案 0 :(得分:3)

有关ImageJ API的问题,通常ImageJ forum是最好的问题。

  

有人知道如何访问直线选择对象吗?

您走在正确的轨道上,但误导了ij.gui.Overlay类(可以包含任意数量的ij.gui.Roi个对象,但需要明确添加到ImagePlus)。

要从ImagePlus获取当前选择,只需致电imp.getRoi()(另请参阅javadoc):

ImagePlus imp = WindowManager.getCurrentImage();
double lineLength = 0;
Roi roi = imp.getRoi();

if (roi != null && roi.isLine()) {
    lineLength = roi.getLength();
}

还有一条评论:

ImageJ imageJApplication = new ImageJ(2);
 ...
IJ.setTool(4);

为了使代码更具可读性,请使用定义的常量而不是任意整数:

ImageJ imageJApplication = new ImageJ(ImageJ.NO_SHOW);
 ...
IJ.setTool(Toolbar.LINE);