连接组件的邻域

时间:2014-04-10 11:36:12

标签: algorithm matlab image-processing

我正在寻找一种方法来获得邻居(给定半径的圆)的连通分量(CC)。

我想根据连接组件的数量来计算一个给定的连接组件。

在示例中,目标是将绿色CC分类为红色,因为红色邻居的数量。

enter image description here

提前致谢。

2 个答案:

答案 0 :(得分:1)

使用Matlab的一种简单方法是在find之后使用regionprops。 计算二进制图像BW中所有CC的边界框:

CC_stats = regionprops(BW, 'BoundingBox');

然后,假设一个以[x0,y0]和半径r0为中心的圆圈,找到圆圈中(部分)的所有CC:

BB_CC = reshape([CC_stats.BoundingBox],4,[]);
idxCC_close = find((sqrt((BB_CC(2,:)-x0).^2+(BB_CC(1,:)-y0).^2)<r0) ...
| (sqrt(((BB_CC(2,:)+BB_CC(4,:)-x0).^2+(BB_CC(1,:)-y0).^2)<r0) ...
| (sqrt((BB_CC(2,:)-x0).^2+(BB_CC(1,:)+BB_CC(3,:)-y0).^2)<r0) ...
| (sqrt(((BB_CC(2,:)+BB_CC(4,:)-x0).^2+(BB_CC(1,:)+BB_CC(3,:)-y0).^2)<r0));

(编辑:)你必须重塑CC_stats.BoundingBox的元素,因为这个变量是所有边界框的基本元素,一个接一个地放置。

很长时间写,但基本上你想要CC的索引在圆圈内至少有一个角落,因此有4个测试。

最后,关闭CC的数量只是length(idxCC_close)

答案 1 :(得分:1)

您可以获得每个组的质心,并计算到所需组件的欧几里德距离小于或等于半径的连通组件数。

CC = regionprops(BW, 'Centroid');
dist = squareform(pdist(cell2mat({CC(:).Centroid}')));

dist将是NxN矩阵,其中N是连接组件的数量。 dist(a,b)为您提供组件a与组件b的距离(请注意,dist(a,a)始终为零)。

现在你可以得到最近的组件数量:

componentIndex = 14; % Example
numberOfNearest = nnz(dist(componentIndex ,:) <= radius) - 1;

radius是您的圆半径,而-1是为了避免计算当前组件。