计算图像中闭合轮廓的数量 - 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的主要内容,如果未能解决你的问题,请参考以下文章