我需要删除二进制图像中小于指定大小的所有小的连续区域,相当于matlab的bwareaopen
函数。我已经尝试安装一些库来做到这一点,但我找不到合适的解决方案。
答案 0 :(得分:1)
ImageJ的ParticleAnalyzer可以根据它们的大小对可变区域(=粒子)进行分割。
为了获得必要的代码,只需运行插件>宏>在ImageJ GUI中记录... 并将记录:模式切换到 Java 。然后运行Analyze > Analyze Particles...,记录器将显示重现粒子分析所需的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);
在执行此操作之前,您可能需要在二进制图像上设置阈值。
答案 1 :(得分:0)
您应该尝试将像ImageJ这样的处理系统集成到您的java代码中。我以前做过,而且相当直接。它有很多其他人创建的插件,然后可以集成到您的Java代码中。
有关如何将ImageJ集成到您的应用程序的示例,请查看this link。他们给出了一个如何做到这一点的明确例子。
然后它只是找到正确的步骤来实现你想要的。您可以先使用GUI进行练习,然后对步骤进行编码。
答案 2 :(得分:0)
您可以直接从您的java程序调用MATLAB函数:http://www.cs.virginia.edu/~whitehouse/matlab/JavaMatlab.html
答案 3 :(得分:0)
搜索形态学操作。在这种情况下,您对Open
操作感兴趣。这是Erosion
和Dilation
的混合。
首先,我可以向您推荐this guide。实现这些过滤器非常简单。如果您担心性能问题,则应考虑过滤器可分性。
另一种选择是使用OpenCV,它有Java API。但是我只使用了C ++ API,所以你应该参考文档。
答案 4 :(得分:0)
我宁愿建议使用MATLAB Builder JA。它包含了在MATLAB中用于Java程序的MATLAB函数;之后你不需要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”方法。