关于下面的场景,我有一个问题。当我对图像进行后处理时,我得到了一个轮廓,不幸的是,正如你在底线上看到的那样,它是两次连接的。为了让人明白,我想要的只是外围线。因此,我放大并标记了这条线,我想要大图像。

我想从这个选择中只需要外部的部分,我已经在下一张图片中标记为绿色。抱歉,我的绘画技术很差。;)

我正在使用IPT中的MatLab。因此,我也尝试使用bwmorph和hbreak选项,但它抛出了一个错误。
我该如何解决这个问题?如果你成功了,你能告诉我更多关于它的信息吗?提前谢谢你!
由衷地
发布于 2012-12-20 02:26:43
似乎你的输入图像与你发布的图像有点不同,因为我不能直接收集分支点(有太多的分支点)。因此,为了开始处理你的问题,我考虑在分支点检测之后进行细化。我还将它们放大并从细化的图像中删除,这确保了在初始图像中的不同段之间实际上没有连接(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,您将很难确定从何处开始和停止采集等高线的点(即,光栅顺序将给出不正确的重叠指示)。
要将线段重建为单个线段(当前有三个线段),请考虑在h中从g中丢弃的点,并使用那些不属于现在删除的底部线段的点。
发布于 2012-11-28 09:31:10
我也会使用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)https://stackoverflow.com/questions/13594367
复制相似问题