我使用连通分量标记算法(bwconncomp)来标记二进制图像的不同部分(MATLAB)。现在我需要计算不同标签的面积并删除面积较小的标签。我可以使用默认区域查找命令,还是在matlab中有任何特定命令...帮助..
答案 0 :(得分:9)
CC = bwconncomp(BW)返回BW中找到的连通分量CC。 二进制图像BW可以具有任何尺寸。 CC是一个结构 四个领域......
CC中的最后一个字段是PixelIdxList
,即:
[a] 1-by-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
对于每个连接的组件,您可以通过访问areas_in_pixels中的元素来查找该组件的大小(以像素为单位):
areas_in_pixels(34) %# area of connected component number 34
答案 1 :(得分:4)
如果您不想编写如上所述的大量代码,只需使用MATLAB的内置函数来检测区域。标记组件,并从组件的属性中找出该组件的区域。假设Bw是二进制图像:
[B,L] = bwboundaries(Bw,'noholes');
stats = regionprops(L,'Area','perimeter');
for k = 1:length(B)
area(k)=stats.Area;
end
答案 2 :(得分:2)
通过避免使用以下内容的for循环,您可以更好地做到这一点:
[B,L] = bwboundaries(Bw,'noholes');
stats = regionprops(L,'Area','perimeter');
area = [stats.Area];
最佳, - 将会