我正在尝试实现Canny Edge检测算法,并且我在此过程中遇到了一些问题。我想我理解Canny边缘检测的每一步,但是当与OpenCv实现给出的结果相比时,它们差异很大。
似乎我无法获得算法应该产生的1px宽边。以下是这个非常简单的二进制图像的步骤和结果:
正在处理的二进制图像:
使用Sobel算子计算的梯度幅度:
边缘方向:
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 <br>
1 / - - - - - - - - - - - \ 1 <br>
1 | / - - - - - - - - - \ | 1 <br>
1 | | / - - - - - - - \ | | 1 <br>
1 | | | / - - - - - \ | | | 1 <br>
1 | | | | | | | | | | | | | 1 <br>
1 | | | | | | | | | | | | | 1 <br>
1 | | | | | | | | | | | | | 1 <br>
1 | | | | | | | | | | | | | 1 <br>
1 | | | | | | | | | | | | | 1 <br>
1 | | | \ - - - - - / | | | 1 <br>
1 | | \ - - - - - - - / | | 1 <br>
1 | \ - - - - - - - - - / | 1 <br>
1 \ - - - - - - - - - - - / 1 <br>
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
非最大值抑制图像:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0<br>
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0<br>
0 0 255 0 0 0 0 0 0 0 0 0 255 0 0<br>
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0<br>
0 0 0 0 255 0 0 0 0 0 255 0 0 0 0<br>
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0<br>
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0<br>
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0<br>
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0<br>
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0<br>
0 0 0 0 255 0 0 0 0 0 255 0 0 0 0<br>
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0<br>
0 0 255 0 0 0 0 0 0 0 0 0 255 0 0<br>
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0<br>
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
如果我在此步骤执行滞后阈值处理,我会得到非常厚的结果。显而易见的问题是梯度幅度值,但我不知道如何解决它。如果有经验丰富且知识渊博的人愿意指出我正确的方向,我将非常感激。
答案 0 :(得分:2)
我不认为Sobel运营商对你的情况有好处。实际上,梯度幅度应该已经粗略地描绘了边缘。后面的步骤正在改进边缘提取。我不确定你是如何实现细化过程的,我所做的是使用插值来找到渐变范数最大的像素。当我使用Sobel算子时,我没有得到很厚的边缘,但边缘在某些点上不是很连续:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 270 270 270 270 270 270 270 270 0 0 0 0
0 0 0 270 0 0 0 0 0 0 270 270 0 0 0 0
0 0 270 0 0 0 0 0 0 0 0 0 0 0 270 0
0 0 270 0 0 270 270 270 270 0 0 270 0 0 270 0
0 0 270 0 0 270 0 0 0 0 0 270 0 0 270 0
0 0 270 0 0 270 0 0 0 0 0 270 0 0 270 0
0 0 270 0 0 270 0 0 0 0 0 270 0 0 270 0
0 0 270 0 0 0 0 0 0 0 0 270 0 0 270 0
0 0 270 270 0 0 0 0 0 0 0 270 0 0 270 0
0 0 270 270 0 270 270 270 270 270 270 270 0 0 270 0
0 0 0 0 0 0 0 0 0 0 0 0 0 270 270 0
0 0 0 0 0 0 0 0 0 0 0 0 270 270 0 0
0 0 0 0 270 270 270 270 270 270 270 270 270 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
当我使用高斯函数的标准偏差来卷积原始图像以获得渐变时,我终于可以获得清晰的细边:
0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 1 494 494 494 494 494 494 494 494 494 494 1 1
0 494 1 1 1 1 1 1 1 1 1 1 494 1
0 494 1 1 494 494 494 494 494 494 1 1 494 1
0 494 1 494 494 1 1 1 1 494 494 1 494 1
0 494 1 494 1 1 1 1 1 1 494 1 494 1
0 494 1 494 1 1 1 1 1 1 494 1 494 1
0 494 1 494 1 1 1 1 1 1 494 1 494 1
0 494 1 494 1 1 1 1 1 1 494 1 494 1
0 494 1 494 494 1 1 1 1 494 494 1 494 1
0 494 1 1 494 494 494 494 494 494 1 1 494 1
0 494 1 1 1 1 1 1 1 1 1 1 494 1
0 1 494 494 494 494 494 494 494 494 494 494 1 1
0 1 1 1 1 1 1 1 1 1 1 1 1 1