我需要删除二进制图像中小于指定大小的所有小的连续区域,相当于matlab的bwareaopen
功能。我已经尝试安装一些库来做到这一点,但我没有找到合适的解决方案。
5 回答
ImageJ 的ParticleAnalyzer可以根据大小对连续区域(= 粒子)进行分割。
为了获得必要的代码,只需在 ImageJ GUI 中运行Plugins > Macros > Record...并将Record:模式切换为Java。然后运行分析 > 分析粒子...,记录器将显示重现粒子分析所需的 Java 代码。
import ij.IJ;
import ij.ImagePlus;
[...]
ImagePlus imp = // you have to know how to get your image
IJ.run(imp, "Analyze Particles...", "size=500-Infinity circularity=0.00-1.00 show=Masks in_situ");
这会将图像中的图像替换为imp
结果图像,相当于将那些超出指定范围的粒子移除size=500-Infinity
。
在较低级别上,您还可以ParticleAnalyzer
直接使用该类,如下所示:
import ij.ImagePlus;
import ij.measure.ResultsTable;
import ij.plugin.filter.ParticleAnalyzer;
[...]
ImagePlus imp = // you have to know how to get your image
ResultsTable rt = new ResultsTable();
Double min_size = 50.0;
Double max_size = Double.POSITIVE_INFINITY;
ParticleAnalyzer pa = new ParticleAnalyzer(ParticleAnalyzer.SHOW_MASKS + ParticleAnalyzer.IN_SITU_SHOW, 0, rt, min_size, max_size);
pa.analyze(imp);
在执行此操作之前,您可能需要在二进制图像上设置阈值。
我宁愿建议使用 MATLAB Builder JA。它将 MATLAB 函数包装在 Java 程序中,以便在 MATLAB 之外使用;之后你就不需要 MATLAB 来运行 Java 程序了。
请参阅此链接: http: //www.mathworks.com/discovery/java-math.html
您需要制作一个MATLAB函数:如果只有BWAREAOPEN,则将其包装在您自己的函数中,例如:
'`函数输出 = mybwareaopen(in)
out = bwareaopen(in)`
然后使用 MATLAB Builder JA 制作一个 JAR 文件,并在 java 中调用“mybwareaopen”方法。
您可以直接从您的 java 程序中调用 MATLAB 函数:http ://www.cs.virginia.edu/~whitehouse/matlab/JavaMatlab.html
搜索形态学操作。在这种情况下,您对Open
操作感兴趣。这是Erosion
和的混合Dilation
。
首先,我可以向您推荐本指南。实现这些过滤器非常容易。如果您担心性能,您应该研究过滤器可分离性。
另一种选择是使用具有 Java API 的 OpenCV。但我只使用过 C++ API,所以你应该查阅文档。