0

我有一个二进制图像(附加),其中连接的组件用 bwconncomps 隔离。我正在尝试识别这些组件中的每一个的轮廓,但我仍然可以参考填充的对象 - (我使用轮廓作为灰度图像上的蒙版来提取一些值,然后取决于那个对填充的原始感兴趣区域执行操作的值)

当我在附加图像上运行 bwconncomps 时,我识别出 814 个对象。我可以运行 bwmorph(D,'remove'); 我得到了对象的轮廓/周长,但是当我对此运行 bwconncomps 时,我得到了 827 个对象——(不确定这些额外的对象来自哪里,这会破坏我根据值 I 引用填充对象的能力从其轮廓中拉出)。

基本上我需要一个 bwmorph(D,'remove') 版本,它会留下与原始二进制图像的 bwconncomps 中看到的相同数量的连接分量。这样我就可以将原始二进制中的分量 #30 与轮廓进行比较bwconncomps 中的相同 #30。

希望这很清楚,有什么建议吗?

谢谢

在此处输入图像描述

4

1 回答 1

1

您可以使用 bwboundaries 查找白色连通分量的像素边界,这样每个连通分量都有一组对应的边界。

%calculate boundries and generate boundry mask
B = bwboundaries(im,'noholes');
boundriesImage = zeros(size(im));
boundriesPixels = cell2mat(B);
boundriesImage(sub2ind(size(im),boundriesPixels(:,1),boundriesPixels(:,2)))=1;

%finds the connected component in the original image and in the boundry
%mask
CC = bwconncomp(im);
CC2 = bwconncomp(boundriesImage);

结果:CC 和 CC2 包含相同数量的连通分量

CC = 

    Connectivity: 8
       ImageSize: [535 1571]
      NumObjects: 814
    PixelIdxList: {1x814 cell}

CC2 = 

    Connectivity: 8
       ImageSize: [535 1571]
      NumObjects: 814
    PixelIdxList: {1x814 cell}

此外,每个连接的组件 CC2{ii} 与它的 CC{ii} 匹配,如以下测试结果所示:

%tests that for each ii, CC{ii} is contained in CC{i}
CC2MatchesToCC1 = true;
for ii=1:length(CC.PixelIdxList)
    if length(intersect(CC2.PixelIdxList{ii},CC.PixelIdxList{ii}))~=length(CC2.PixelIdxList{ii})
        CC2MatchesToCC1 = false;
    end
end

结果:

CC2MatchesToCC1 =

 1
于 2016-06-14T16:57:21.923 回答