从二进制映像中删除小区域



我需要删除二进制图像中所有小于指定大小的小连续区域,相当于 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操作感兴趣。这是ErosionDilation的混合.

首先,我可以向您推荐本指南。实现这些过滤器非常容易。如果您担心性能,您应该研究过滤器的可分离性。

另一种选择是使用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" 方法。

最新更新