图像处理 - ImageJ(插件Java):自动阈值方法不起作用



我试着给ImageJ写Java插件,它应该是:

  • 加载图像(24位)
  • 进行一些预处理操作
  • 通过多种方法对图像设置阈值
  • 做一些其他操作

我对阈值操作有问题。我的部分代码如下:

Opener opener = new Opener();
ImagePlus imp = opener.openImage(source);
// Preprocessing
IJ.run("Threshold..." , method);
// Other operations e.g. "open", "outline" etc.
IJ.saveAs(destination);

我的目标是用各种方法(例如"Default"、"Huang"、"Intermodes"、"IsoData"、"Li"等)获得二值化图像。我能得到二值化图像的唯一方法是运行:

IJ.run(imp, "8-bit", "");
IJ.run(imp, "Make Binary", "");

然而,我只通过一种方法获得了二值化的图像。如何通过运行Java代码(ImageJ插件)来实现自动阈值?

阈值对话框中的自动阈值方法都是针对单通道(8位或16位)图像的算法。在"颜色阈值"对话框中,它们仅应用于24位彩色图像的亮度通道。

要在Java中重现这一点,请使用以下代码:

IJ.run(imp, "HSB Stack", "");
imp.setSlice(3);
IJ.setAutoThreshold(imp, "Triangle dark");
Prefs.blackBackground = true;
IJ.run(imp, "Convert to Mask", "only");

(将图像转换为8位无非是使用Brightness通道,丢弃Hue和Saturation信息。除非您真的使用Color Threshold对话框中的其他滑块,否则您也可以在应用阈值之前将图像转换成8位。)

您似乎用错了IJ.run方法。第一个参数是一个包含ImageJ命令的字符串,第二个参数是包含该命令选项的字符串。来自文件:

public static void run(java.lang.String命令,java.lang.String选项)

运行ImageJ命令,其中包含传递给GenericDialog和OpenDialog类。直到命令已完成执行。要生成run()调用,请启动记录器(插件/宏/记录),并从ImageJ菜单运行命令酒吧

您还可以使用GUI记录宏Plugins->Macros->Record...将记录模式设置为Java,并选择所需的方法和阈值。你会得到这样的东西:

// Color Thresholder 1.49i
// Autogenerated macro, single images only!
min=newArray(3);
max=newArray(3);
filter=newArray(3);
a=getTitle();
run("HSB Stack");
run("Convert Stack to Images");
selectWindow("Hue");
rename("0");
selectWindow("Saturation");
rename("1");
selectWindow("Brightness");
rename("2");
min[0]=139;
max[0]=254;
filter[0]="pass";
min[1]=48;
max[1]=110;
filter[1]="pass";
min[2]=189;
max[2]=255;
filter[2]="pass";
for (i=0;i<3;i++){
  selectWindow(""+i);
  setThreshold(min[i], max[i]);
  run("Convert to Mask");
  if (filter[i]=="stop")  run("Invert");
}
imageCalculator("AND create", "0","1");
imageCalculator("AND create", "Result of 0","2");
for (i=0;i<3;i++){
  selectWindow(""+i);
  close();
}
selectWindow("Result of 0");
close();
selectWindow("Result of Result of 0");
rename(a);
// Colour Thresholding-----------------