我可以从 Canny 边缘检测中消除这些 'jaggies' 吗?

Can I eliminate these 'jaggies' from Canny edge detection?

在我对 Canny 边缘检测器(来自 OpenCV)的应用中,我 运行 遇到了一个烦恼,我得到了轻微的锯齿状边缘,而我更喜欢直线边缘。下面是一个基于对情况的简单提炼的例子。我的实际应用包括 0/90/180/270 度以外其他角度的线,但只要线几乎平行于 X/Y 轴,效果就非常相似。

我的输入图像在垂直于直线的方向上经常有轻微的渐变,我认为这是问题的基本根源。我在 OpenCV 中对代码进行了一些挖掘和调试,并且基本上说服自己这个问题是 Canny 算法工作方式所固有的,而不是 OpenCV 对它的特定实现,但我仍然没有完全放弃 Canny。

我尝试了 Arrayfire 的 Canny 实现并得到了类似但更差的结果,并且我尝试对边缘输出应用模糊以使效果不那么明显,但结果仍然不理想。

from PIL import Image, ImageDraw
import numpy as np
import cv2 as cv

cross_img = Image.new('L', (500, 500))
d = ImageDraw.Draw(cross_img)
for i in range(500):
    c = 60 + i / 10
    d.line(((240, i), (260, i)), int(c))
    d.line(((i, 240), (i, 260)), int(c))
npimg = np.asarray(cross_img)
cannpimg = np.zeros_like(npimg)
cv.Canny(npimg, 200, 400, cannpimg)
canimg = Image.fromarray(cannpimg)

cross_img.save('/tmp/cross.png')
canimg.save('/tmp/can.png')

Input image Canny output

你是对的,锯齿是由于 Canny 边缘检测处理这种由梯度定义的边缘的方式造成的,该梯度与所述边缘的方向不同。您可以 运行 在 运行ning canny 之前对图像进行灰度级变换,它将所有渐变值压缩为白色,黑色值保持黑色。