您的输入图像似乎与您发布的图像有点不同,因为我无法直接收集分支点(它们太多了)。因此,要开始处理您的问题,我考虑先进行细化,然后进行分支点检测。我还扩大了它们并从细化图像中删除,这保证了初始图像中不同段之间实际上没有连接(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
,并使用不属于现在删除的底部段的点。