【发布时间】:2025-12-08 04:25:01
【问题描述】:
我使用连通分量标记算法 (bwconncomp) 来标记二进制图像 (MATLAB) 的不同部分。现在我需要计算不同标签的面积并删除面积较小的标签。我可以使用默认的区域查找命令还是在matlab中有任何特定的命令...帮助..
【问题讨论】:
-
这个link 是我真正想要的。谢谢比尔
我使用连通分量标记算法 (bwconncomp) 来标记二进制图像 (MATLAB) 的不同部分。现在我需要计算不同标签的面积并删除面积较小的标签。我可以使用默认的区域查找命令还是在matlab中有任何特定的命令...帮助..
【问题讨论】:
CC = bwconncomp(BW) 返回在 BW 中找到的连通分量 CC。 二值图像BW可以具有任意维度。 CC是一个结构 四个字段...
CC中最后一个字段是PixelIdxList,即:
[a] 1×NumObjects 元胞数组,其中元胞数组中的第 k 个元素是 包含第 k 个对象中像素的线性索引的向量。
您可以通过查看元胞数组中相应条目的长度来找到每个标签的区域。比如:
areas_in_pixels = cellfun(@length, CC.PixelIdxList);
PixelIdxList 是一个元胞数组,其中的每个成员都包含存在于该连接组件中的像素的线性索引。上面的代码行查找元胞数组中每个元胞的长度——即每个连通分量中的像素数。
我使用cellfun 来保持代码简短高效。写同一件事的另一种方式是:
areas_in_pixels = nan(1, length(CC.PixelIdxList);
for i = 1:length(CC.PixelIdxList)
areas_in_pixels(i) = length(CC.PixelIdxList{i});
end
对于每个连接的组件,您可以通过访问 area_in_pixels 中的元素来找到该组件的大小(以像素为单位):
areas_in_pixels(34) %# area of connected component number 34
【讨论】:
如果您不想像上面那样编写大量代码,只需使用 MATLAB 的内置函数来检测该区域。标记您的组件并从组件的属性中找出该组件的区域。假设 Bw 是二值图像:
[B,L] = bwboundaries(Bw,'noholes');
stats = regionprops(L,'Area','perimeter');
for k = 1:length(B)
area(k)=stats.Area;
end
【讨论】:
您可以通过以下方式避免 for 循环来使这一点变得更好:
[B,L] = bwboundaries(Bw,'noholes');
stats = regionprops(L,'Area','perimeter');
area = [stats.Area];
最好, -会
【讨论】: