1

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

4

5 回答 5

1

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);

在执行此操作之前,您可能需要在二进制图像上设置阈值。

于 2013-10-11T13:07:55.727 回答
0

我宁愿建议使用 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”方法。

于 2013-10-11T15:14:17.627 回答
0

您应该尝试将ImageJ 之类的处理系统集成到您的 java 代码中。我以前做过,而且很简单。它有很多其他人创建的插件,然后您可以将其集成到您的 java 代码中。

有关如何将 ImageJ 集成到您的应用程序中的示例,请查看此链接。他们给出了一个明确的例子来说明如何做到这一点。

然后它只是找到正确的步骤来实现你想要的一个案例。您可以先使用 GUI 进行练习,然后对这些步骤进行编码。

于 2013-10-11T11:24:10.310 回答
0

您可以直接从您的 java 程序中调用 MATLAB 函数:http ://www.cs.virginia.edu/~whitehouse/matlab/JavaMatlab.html

于 2013-10-11T11:28:01.507 回答
0

搜索形态学操作。在这种情况下,您对Open操作感兴趣。这是Erosion和的混合Dilation

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

另一种选择是使用具有 Java API 的 OpenCV。但我只使用过 C++ API,所以你应该查阅文档。

于 2013-10-11T11:55:03.130 回答