【问题标题】:Finding area of the image查找图像的区域
【发布时间】:2025-12-08 04:25:01
【问题描述】:

我使用连通分量标记算法 (bwconncomp) 来标记二进制图像 (MATLAB) 的不同部分。现在我需要计算不同标签的面积并删除面积较小的标签。我可以使用默认的区域查找命令还是在matlab中有任何特定的命令...帮助..

【问题讨论】:

  • 这个link 是我真正想要的。谢谢比尔

标签: image matlab label area


【解决方案1】:

来自documentation

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

【讨论】:

  • 你能详细说明一下这个函数吗?
  • 我已经添加了更多细节。这就是你所说的函​​数吗?
【解决方案2】:

如果您不想像上面那样编写大量代码,只需使用 MATLAB 的内置函数来检测该区域。标记您的组件并从组件的属性中找出该组件的区域。假设 Bw 是二值图像:

[B,L] = bwboundaries(Bw,'noholes');
stats = regionprops(L,'Area','perimeter');

for k = 1:length(B) 
  area(k)=stats.Area;
end

【讨论】:

    【解决方案3】:

    您可以通过以下方式避免 for 循环来使这一点变得更好:

    [B,L] = bwboundaries(Bw,'noholes');
    stats = regionprops(L,'Area','perimeter');
    area = [stats.Area];
    

    最好, -会

    【讨论】:

      最近更新 更多