2009-09-08 170 views
4

我正在寻找关于如何在Canny边缘检测中执行的算法 - Wikipedia entry - 的工作的一些澄清。使用2D高斯滤波器进行降噪似乎很简单,但我听说使用两个1D滤波器 - 这是如何实现的?计算梯度和边缘方向也很简单。然而,在执行非最大抑制时,是否有一个巧妙的方法来获得圆角?我目前所做的是将边缘方向(θ)值除以pi/4,将其转换为整数并使用switch语句。但是,如何处理负的θ值 - 也就是说,π/ 4的处理方式与3 *π/ 4相同还是与π/ 4相同?Canny边缘检测器C

任何意见/链接非常感谢!

谢谢, 奔

回答

7

高斯分布

G2D(X,Y)= EXP(-x XY Y)[常数为了简化而省略] = EXP (-x^2)* exp(-y^2)= g1d(x)* g1d(y)

因此可以分成1d-分布的乘法。如果角度为[0以外

:并且因此过滤可以首先在x方向上进行(独立地对每一行),然后在y方向(独立地对每一列)

圆形角。 .pi)在这种情况下,根据需要多次添加/减少pi(或使用函数fmod)是正确的,对于[0..pi),所有都是清楚的。

同样取决于平台,最好避免arctan的使用:你可以绘制一个圆,将它分成4个区域,并为梯度分量生成一组条件,它只使用算术运算,并给出答案面积方向是。

1

我认为-pi/4应该和3 * pi/4一样处理,因为它们都定义了相同的对角线。

如果可以正常化渐变的角度,使得它位于[0,PI),则可以使用一个简单的函数像下面以量化角:

enum Angle 
{ 
    HORIZONTAL, 
    DIAG_UP, 
    VERTICAL, 
    DIAG_DOWN 
}; 

Angle quantizeAngle(double theta) 
{ 
    if (0 <= theta && theta < PI/8.0) || (7.0*PI/8.0 <= theta && theta < PI)) 
     return HORIZONTAL; 
    else if (PI/8.0 <= theta && theta < 3.0*PI/8.0) 
     return DIAG_UP; 
    else if (3.0*PI/8.0 <= theta && theta < 5.0*PI/8.0) 
     return VERTICAL; 
    else 
     return DIAG_DOWN; 
}