两个相连边界的形态分离

问题描述 投票:0回答:2

我对以下场景有疑问。 当我对图像进行后处理时,我获得了一个轮廓,不幸的是,正如您在底线中看到的那样,该轮廓被两次连接。为了明确我想要的只是外线。 因此我放大并标记了这条线,我想要大图像。

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

我正在将 MatLab 与 IPT 结合使用。所以我也尝试用

bwmorph
hbreak
选项来弄清楚,但它引发了错误。

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

真诚的

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

要将线段重建为单个线段(目前您有三个),请考虑从

g
中丢弃的点
h
,并使用那些不属于现在删除的底部线段的点。


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)
© www.soinside.com 2019 - 2024. All rights reserved.