7

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

我从这个选择中想要的只是外部部分,我在下一张图片中将其标记为绿色。对不起我的绘画技巧不好。;)

我正在使用带有 IPT 的 MatLab。所以我也尝试使用bwmorphandhbreak选项,但它抛出了一个错误。

我该如何解决这个问题?如果你成功了,你能告诉我更多关于它的信息吗?先感谢您!

真挚地

4

2 回答 2

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。我们说ab如果一个端点包含在另一个端点中,则重叠。包含我的意思是,如果一个的起始 x 点小于或等于另一个,并且结束 x 点也大于或等于。在您的情况下,“山”与您要删除的部分重叠。要确定您删除的每一个,请考虑它们的区域。但是,由于这些是段,因此面积是一个没有意义的术语。为了解决这个问题,我连接了一个段的端点,并将内部点用作区域。您可以清楚地注意到,底部重叠部分的面积非常小,所以我们说它基本上是一条线并丢弃它,同时保留“山”部分。要执行此步骤,图像u至关重要,因为有了它,您可以清楚地指示从哪里开始和停止跟踪轮廓。如果您按h原样使用图像,您将难以确定从哪里开始和停止收集轮廓点(即,光栅顺序会给您不正确的重叠指示)。

要将段重建为单个段(目前您有三个),请考虑您从g中丢弃的点h,并使用不属于现在删除的底部段的点。

于 2012-12-19T18:26:43.433 回答
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)
于 2012-11-28T01:31:10.293 回答