我尝试将Java插件写入ImageJ,它应该:
我的阈值操作有问题。我的部分代码如下所示:
Opener opener = new Opener();
ImagePlus imp = opener.openImage(source);
// Preprocessing
IJ.run("Threshold..." , method);
// Other operations e.g. "open", "outline" etc.
IJ.saveAs(destination);
我的目标是以各种方法获得二值化图像(例如"默认","黄"," Intermodes"," IsoData" ,"李"等)。 只有我可以获得二值化图像的方法是运行:
IJ.run(imp, "8-bit", "");
IJ.run(imp, "Make Binary", "");
然而,我只用一种方法得到一个二值化的图像。 如何通过运行Java代码(ImageJ插件)来实现自动阈值?
答案 0 :(得分:1)
您似乎以错误的方式使用IJ.run
方法。第一个参数是包含ImageJ命令的字符串,第二个参数是包含此命令选项的字符串。来自文档:
public static void run(java.lang.String命令, java.lang.String options)
运行一个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-----------------
答案 1 :(得分:1)
Threshold dialog中的自动阈值方法都是处理单通道(8位或16位)图像的算法。在Color Threshold对话框中,它们专门应用于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位只不过是使用亮度通道,丢弃色调和饱和度信息。除非您真正使用颜色阈值中的其他滑块对话框,您也可以在应用阈值之前将图像转换为8位。)