我需要删除二进制图像中所有小于指定大小的小连续区域,相当于 matlab 的bwareaopen
函数。我尝试安装一些库来做到这一点,但我没有找到合适的解决方案。
ImageJ的ParticleAnalyzer可以根据它们的大小分割连续区域(=粒子)。
为了获得必要的代码,只需在 ImageJ GUI 中运行插件>宏> 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);
在执行此操作之前,您可能需要在二进制映像上设置阈值。
你应该尝试将像ImageJ这样的处理系统集成到你的Java代码中。我以前做过,而且相当简单。它有很多其他人创建的插件,然后您可以将其集成到您的 java 代码中。
有关如何将 ImageJ 嵌入应用程序的示例,请查看此链接。他们给出了一个关于如何做到这一点的明确例子。
然后,它只是找到正确的步骤来实现您想要的内容的情况。您可以先练习 GUI,然后对步骤进行编码。
直接从java程序调用MATLAB函数: http://www.cs.virginia.edu/~whitehouse/matlab/JavaMatlab.html
搜索形态学操作。在这种情况下,您对Open
操作感兴趣。这是Erosion
和Dilation
的混合.
首先,我可以向您推荐本指南。实现这些过滤器非常容易。如果您担心性能,您应该研究过滤器的可分离性。
另一种选择是使用OpenCV,它具有Java API。但我只使用了C++ API,所以你应该查阅文档。
我宁愿建议使用MATLAB Builder JA。它将 MATLAB 函数包装在 MATLAB 之外的 Java 程序中;之后你不需要 MATLAB 来运行 Java 程序。
请参阅此链接: http://www.mathworks.com/discovery/java-math.html
你需要做一个 MATLAB 函数:如果只有 BWAREAOPEN,那么把它包装在你自己的函数中,例如:
''function out = mybwareaopen(in)
out = bwareaopen(in)'
然后使用 MATLAB Builder JA 创建一个 JAR 文件,并在 Java 中调用 "mybwareaopen" 方法。