我正在寻找一种方法来获得邻居(给定半径的圆)的连通分量(CC)。
我想根据连接组件的数量来计算一个给定的连接组件。
在示例中,目标是将绿色CC分类为红色,因为红色邻居的数量。
提前致谢。
答案 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
是为了避免计算当前组件。