我对以下情况有疑问。 当我对图像进行后期处理时,我获得了一个轮廓,不幸的是两次连接,如您在底线所示。为了明确我想要的只是外线。 因此,我放大并标记了线条,我想要大图像。
我想从这个选择中得到的只是外面部分,我在下一张图片中标记为绿色。对不起我糟糕的绘画技巧。 ;)
我正在使用MatLab和IPT。所以我也尝试使用bwmorph
和hbreak
选项,但它引发了错误。
我该如何解决这个问题? 如果你成功了,请告诉我一些关于它的事情吗? 提前谢谢!
此致
答案 0 :(得分:2)
您的输入图像似乎与您发布的图像有点不同,因为我无法直接收集分支点(它们太多了)。因此,为了开始处理您的问题,我考虑进行细化,然后进行分支点检测。我也扩大它们并从稀疏图像中移除,这保证了实际上初始图像中不同段之间没有连接(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');
现在要真正解决你的问题,我对你要丢弃的内容做了一些快速分析。在a
中考虑两个不同的细分,b
和h
。如果一个的终点包含在另一个中,我们说a
和b
会重叠。通过包含,我只是意味着一个的起始x点小于或等于另一个,并且结束x点也大于或等于。在您的情况下,“山”与您要删除的段重叠。要确定您删除的每一个,请考虑他们的区域。但是,由于这些是细分市场,因此区域是无意义的术语。为了解决这个问题,我连接了一个段的端点,并将其用作区域内部点。正如你可以清楚地注意到的那样,底部重叠段的面积非常小,所以我们说它基本上是一条线并在保留“山峰”段的同时丢弃它。要执行此步骤,图像u
具有根本重要性,因为有了它,您就可以清楚地指示从何处开始和停止跟踪轮廓。如果您按原样使用图像h
,则无法确定从何处开始并停止收集轮廓点(即,栅格顺序会给您错误的重叠指示)。
要将细分重建为单个细分(目前您有三个细分),请考虑从g
h
中丢弃的点,并使用那些不属于现在删除的细分底部。
答案 1 :(得分:1)
我还会使用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)