首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ImageJ (插件Java):自动阈值方法不起作用

ImageJ (插件Java):自动阈值方法不起作用
EN

Stack Overflow用户
提问于 2015-06-22 13:18:37
回答 2查看 2.3K关注 0票数 2

我尝试将Java插件编写到ImageJ,它应该:

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

我有门限手术的问题。我代码的一部分如下所示:

代码语言:javascript
运行
复制
Opener opener = new Opener();
ImagePlus imp = opener.openImage(source);
// Preprocessing
IJ.run("Threshold..." , method);
// Other operations e.g. "open", "outline" etc.
IJ.saveAs(destination);

我的目标是在各种方法中获得二值化的图像。“默认”、“黄”、“中间模式”、"IsoData“、"Li”等)。获得二值化图像的唯一方法是运行:

代码语言:javascript
运行
复制
IJ.run(imp, "8-bit", "");
IJ.run(imp, "Make Binary", "");

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-22 19:24:45

门限对话中的自动阈值方法都是单通道(8位或16位)图像上的算法.在颜色阈值对话框中,它们只适用于24位彩色图像的亮度通道.

若要在Java中再现此代码,请使用以下代码:

代码语言:javascript
运行
复制
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位。)

票数 1
EN

Stack Overflow用户

发布于 2015-06-22 14:44:53

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

公共静态无效运行( java.lang.String命令,java.lang.String选项) 运行ImageJ命令,其中包含传递给GenericDialog和OpenDialog类的选项。在命令执行完毕后才返回。要生成run()调用,启动记录器(Plugins/Macro/Record)并从ImageJ菜单栏运行命令。

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

代码语言:javascript
运行
复制
// 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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30981006

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档