我有一个二进制图像(附加),其中连接的组件与bwconncomps隔离。我试图找出每个组件的轮廓,但我仍然可以参考填充的对象 - (我使用轮廓作为灰度图像上的遮罩来拉取一些值,然后依赖于在填充的原始感兴趣区域上执行操作的值)
当我在附图上运行bwconncomps时,我会识别出814个物体。我可以运行bwmorph(D,'remove');我得到了对象的轮廓/周长,但是当我在这上面运行bwconncomps时,我得到了827个对象 - (不确定这些额外对象来自哪里,这搞砸了我根据值I返回填充对象的能力拉出它的轮廓。
基本上我需要一个版本的bwmorph(D,'remove'),它将留下与原始二进制图像的bwconncomps中所见相同数量的连接组件。因此我可以将原始二进制文件中的组件#30与bwconncomps中相同#30的轮廓。
希望这很清楚,有什么建议吗?
由于
答案 0 :(得分: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