2016-04-29 63 views
2

我想从图像上使用canny检测器在16灰度级图像上获取边缘(请参阅图像gray level image)。Canny分割产生未链接的边缘

尽管我已经越过了界限,但有些地区的界限已经断开(见图片)。 unlinked edges

任何人都知道如何才能获得完整的界限?

Thansk提前,海梅

回答

0

尝试使用锐化滤波器精明的轮廓检测器之前,以突出的边缘。

+0

欢迎来到Stack Overflow!虽然这可能会在理论上回答这个问题,[这将是更可取的](// meta.stackoverflow.com/q/8259)在这里包括答案的基本部分,并提供参考链接。 – manetsus

+0

Hi @ kalyf-abdalla,感谢您的建议,但我必须说我的图像不是一个通常的灰度图像,我的意思是,这是一个图像,每个区域都有一个特定的灰度级(内部没有可变性),所以我认为应用锐化对我来说没有帮助,因为界限非常明确。我希望你能理解我的观点,谢谢Jaime –

1

根据我的经验,Canny边缘检测算法通常会在用于处理低分辨率图像时留下这些类型的伪像。尽管听起来很奇怪,但通过简单地增加图像的大小(例如,使用双线性插值),您通常可以获得更好的结果。我不确定你使用的是什么工具,但在OpenCV中,这可以使用简单的resize函数来完成。通过4倍增加的宽度和高度,我可以得到下面的边界:

enter image description here

当然,如果你仔细观察,你还是会看到一些小的差距。解决它的一个可能的解决方案是使用morphological transformations。例如,如果我用上面的图像上的形态关闭操作,这将有助于连接缝隙:

enter image description here

值得一提的是,由于您的边缘图像看起来是白色背景上的黑边,你会可能需要使用形态打开操作。

此外,请注意,Canny操作的低阈值也可能对解决某些情况下看到的各种间隙有一些影响。在尝试更昂贵的计算方法之前,应该尝试降低低阈值以查看是否可以避开缺失的边缘。

+0

Hi @ Aenimated1 你的方法运作良好。我遵循的步骤如下: gray = cv2.imread('image.tif',0) big = cv2.resize(gray,(4 * gray.shape [0],4 * gray.shape [1] )) edges = cv2.Canny(big,5,10) w,h = edges.shape r = 500.0/h dim =(500,int(w * r)) small = cv2.resize(edges ,暗淡,插值= cv2.INTER_AREA) 小=〜小 小[小<250] = 0 io.imsave( 'small2.tif',小) 现在,我得到了我想要,谢谢,海梅 –

+0

很高兴它解决了。鉴于您的输入图像的性质,它可能也值得考虑一个更简单的算法。基本上,您需要的只是在输入图像具有不同值的相邻像素的任何位置绘制边缘。我不确定是否有任何OpenCV函数支持该功能,但编写起来很容易,速度也会提高几个数量级。 – Aenimated1

+0

嘿@Aenimated1,我没有这么想,这种新方法非常简单快捷。我也会试一试。您的想法将永远受欢迎。有人认为这个盒子有问题。 –