两个连接边界的形态分离
我有关于以下场景的问题。 当我对图像进行后期处理时,我获得了一个轮廓,不幸的是两次连接如您在底线所看到的那样。 为了明确我想要的只是外线。 所以我放大并标出了这一行,我想要大图。
我想从这个选择中得到的只是外部的部分,我在下一张照片中标记为绿色。 对不起,我的绘画技巧不好。 ;)
我正在使用MatLab和IPT。 所以我也尝试着用bwmorph
和hbreak
选项,但是它抛出了一个错误。
我如何解决这个问题? 如果你成功了,你能告诉我更多一点吗? 先谢谢你!
诚挚
看起来你的输入图像与你发布的输入图像有点不同,因为我不能直接收集分支点(其中有太多分支点)。 所以,为了开始处理您的问题,我考虑进行细化,然后进行分支点检测。 我也扩大他们,并从稀疏的图像中删除,这保证了实际上在初始图像的不同段之间没有连接(4或8)。
f = im2bw(imread('http://i.imgur.com/yeFyF.png'), 0);
g = bwmorph(f, 'thin', 'Inf');
h = g & ~bwmorph(bwmorph(g, 'branchpoints'), 'dilate');
由于h
拥有断开的段,因此以下操作将收集所有段的终点:
u = bwmorph(h, 'endpoints');
现在要真正解决你的问题,我对你想要放弃的东西做了一些快速分析。 考虑h
两个不同的段a
和b
。 我们说a
和b
重叠,如果一个的结束点包含在另一个中。 通过包含,我只是表示如果一个的开始x点小于或等于另一个,并且结束x点也大于或等于。 就你而言,“山”与你想要移除的段重叠。 要确定每个他们删除,考虑他们的区域。 但是,由于这些是细分市场,所以区域是一个没有意义的术语。 为了解决这个问题,我连接了一个段的端点,并将其用作区域内部的点。 正如你可以清楚地看到的那样,底部重叠片段的面积非常小,所以我们说它基本上是一条线,并在保持“山”片段的同时丢弃它。 要做到这一步,图像u
具有根本的重要性,因为使用它您可以清楚地指示开始和停止跟踪轮廓的位置。 如果按照原样使用图像h
,则无法确定开始和停止采集轮廓点的位置(即,光栅顺序会给您不正确的重叠指示)。
为了重建段作为一个单一的一个(目前你有3台),考虑你丢弃点g
于h
,并使用那些不属于现在去掉底段。
我也会使用bwmorph
%# find the branch point
branchImg = bwmorph(img,'branchpoints');
%# grow the pixel to 3x3
branchImg = imdilate(branchImg,ones(3));
%# hide the branch point
noBranchImg = img & ~branchImg;
%# label the three lines
lblImg = bwlabel(noBranchImg);
%# in the original image, mask label #3
%# note that it may not always be #3 that you want to mask
finalImg = img;
finalImg(lblImg==3) = 0;
%# show the result
imshow(finalImg)
链接地址: http://www.djcxy.com/p/11529.html