2009-09-08 214 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; 
}