计算图像中闭合轮廓的数量 - MATLAB

Posted

技术标签:

【中文标题】计算图像中闭合轮廓的数量 - MATLAB【英文标题】:Count the amount of closed contours in an image - MATLAB 【发布时间】:2015-04-12 20:50:33 【问题描述】:

我正在努力寻找一个好的轮廓检测功能,它可以计算我使用以前的一些工具处理过的 bw 图像中的轮廓数量。如您所见,我的个人资料图片就是此类图片的示例,

,

在这张图片中,理想情况下,我希望有一个计算四个闭合轮廓的函数。

我不介意它是否也检测到介于两者之间的非常小的轮廓,或者将整个形状本身检测为额外的轮廓。只要计算中型的,我可以通过应用面积阈值来修复其余部分。我的问题是,我尝试过的任何功能都只能检测到一个轮廓 - 整个形状,因为它无法将其与相互连接的 su-conours 分开。

有什么建议吗?

【问题讨论】:

Counting number of Blobs via MatLab的可能重复 所以@GUY TALMOR 你看过我的回答了吗? 【参考方案1】:

这是我对此的看法,尽管您的问题可能会因为离题、太宽泛或可能重复而被关闭。无论如何,我提出了另一种计算轮廓数量的方法。您也可以使用bwboundaries 来执行此操作,如@knedlsepp 在可能的副本中提供的链接中所示。只是为了它,这里是另一种方式。

我们的想法是应用图像的形态闭合,并实际计算封闭表面的数量而不是轮廓。这可能最终是同一件事,但我认为可视化表面更容易。

由于图像中的形状看起来像圆形(有点……),因此用于闭合图像的结构元素是圆盘。大小(此处为 5)由您决定,但对于您提供的图像来说很好。之后,使用regionprops 定位图像区域(这里是斑点)并计算它们,我猜这又回到了计算轮廓。您可以提供Area 参数以根据形状的面积过滤掉形状。这里我要求函数提供质心来绘制它们。

完整代码:

clear
clc
close all

%// Read, threshold and clean up the image
Im = im2bw(imread('ImContour.png'));
Im = imclearborder(Im);

%// Apply disk structuring element to morphologically close the image.
%// Play around with the size to alter the output.
se = strel('disk',5);

Im_closed = imclose(Im,se);

%// Find centroids of circle-ish shapes. Youcan also get the area to filter
%// out those you don't want.
S = regionprops(~Im_closed,'Centroid','Area');

%// remove the outer border of the image (1st output of regioprops).
S(1) = [];

%// Make array with centroids and show them.
Centro = vertcat(S.Centroid);

imshow(Im)
hold on
scatter(Centro(:,1),Centro(:,2),40,'filled')

还有输出:

因此,当您看到算法检测到 5 个区域时,请尝试对参数进行一些调整,您将看到要更改哪些区域以获得所需的 4 输出。

玩得开心!

【讨论】:

非常好,我的朋友。 +1。 谢谢@rayryeng 我不确定这是一种有效的方法,但我会这样做:)

以上是关于计算图像中闭合轮廓的数量 - MATLAB的主要内容,如果未能解决你的问题,请参考以下文章

图像轮廓之查找并绘制轮廓

在matlab中,怎么把图片中的图像轮廓坐标找出来?

matlab怎么将图像处理的轮廓坐标连线起来

关于用matlab处理图像的问题,如何将下进行边缘提取,得到比较清晰的轮廓,最好是能寻找到偏心孔的坐标

求C++中利用opencv计算轮廓图像傅里叶描述子的代码

matlab 提取图像轮廓(图像边缘提取)