从二值图像中删除小区域

时间:2013-10-11 11:16:55

标签: java image-processing

我需要删除二进制图像中小于指定大小的所有小的连续区域,相当于matlab的bwareaopen函数。我已经尝试安装一些库来做到这一点,但我找不到合适的解决方案。

5 个答案:

答案 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操作感兴趣。这是ErosionDilation的混合。

首先,我可以向您推荐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”方法。