2013-10-12 50 views
1

我想實現Canny邊緣檢測算法,並且我遇到了一些問題。我認爲我理解Canny邊緣檢測的每一步,但與OpenCv實現的結果相比,它們差異很大。Canny邊緣檢測算法 - 實現問題

看來,我不能像算法應該產生的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 

如果我在這個步驟執行滯後閾值,我得到很厚邊的結果。顯而易見的問題是梯度幅度值,但我不知道如何解決它。如果有人更有經驗和知識淵博,善意地指點我正確的方向,我會非常感激。

回答

2

我不認爲索貝爾操作員是適合您的情況。實際上梯度大小應該粗略地勾畫邊緣。後面的步驟是提煉邊緣提取。我不知道你是如何實現細化過程的,我所做的是使用插值來找到梯度的標準是局部最大值的像素。當我申請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