Canny边缘检测算法 - 实现问题

时间:2013-10-12 12:33:15

标签: algorithm image-processing edge-detection

我正在尝试实现Canny Edge检测算法,并且我在此过程中遇到了一些问题。我想我理解Canny边缘检测的每一步,但是当与OpenCv实现给出的结果相比时,它们差异很大。

似乎我无法获得算法应该产生的1px宽边。以下是这个非常简单的二进制图像的步骤和结果:

正在处理的二进制图像:

Binary Image that is being processed

使用Sobel算子计算的梯度幅度:

Gradient magnitudes

边缘方向:

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

如果我在此步骤执行滞后阈值处理,我会得到非常厚的结果。显而易见的问题是梯度幅度值,但我不知道如何解决它。如果有经验丰富且知识渊博的人愿意指出我正确的方向,我将非常感激。

1 个答案:

答案 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