大部分人認為canny邊緣檢測是最優的邊緣檢測方法,canny邊緣檢測方法可以得到清晰明了的邊緣;大部分影象處理包都提供了乙個專門的canny邊緣檢測函式;這篇文章我們來看看canny邊緣檢測的原理。
canny邊緣檢測需要經過一下幾步:
1.預處理
2.計算梯度
3.非極值抑制
4.閾值與滯後效應(此處不知翻譯的對不對,英文表達是:thresholding with hysterysis)
邊緣檢測是對雜訊敏感的,所以在邊緣檢測前要作平滑處理,一般用的是 gaussian blur ,乙個標準差為1.4的5*5 高斯濾波器
對影象中的每乙個pixel,計算其梯度值,包括梯度的大小和方向;梯度的大小決定了該點是不是邊緣點,梯度值大說明在該點周圍的灰度值變化快,是個邊緣點,梯度值**明該點不是邊緣點;梯度的方向指明了邊緣的方向。
計算梯度值一般用的是sobel邊緣運算元。
梯度值大小計算公式:
方向計算公式:
其中 gx = l(x+1,y) - l(x-1,y)
gy = l(x,y+1) - l(x,y-1)
這一步的作用很明顯,就是如果乙個畫素不是最大值,就被抑制了。
遍歷所有畫素,對於每乙個畫素,梯度方向分布在四個域。
如下圖所示:
對於中間的灰色畫素,他的邊緣有四個可能方向:黃色方向,藍色方向,紅色方向,綠色方向。在上一步中計算出了該畫素的梯度方向,根據梯度方向可以估計出邊緣方向。
接下來以乙個例子來說明非極大值抑制。
如圖所示:
如果梯度方向在上圖所示的範圍內,說明梯度的變化是從左上角到右下角,而邊緣就是右上角到左下角方向的。
要檢測這個中心紅點是不是邊緣點,就需要檢測這個點的梯度值和左上角以及右下角的點的梯度值相比是不是極大值。如果是極大值並且它的梯度值大於upper threshold,就把它當作邊緣點。
在上一步中,我們已經找到了梯度值比上限閾值大的畫素。這一步利用梯度的方向和下限閾值。
here』s the idea:
1.如果當前畫素不是邊緣點,選下乙個。
2.如果是邊緣點,再選擇邊緣方向上的兩個點(垂直於之前選擇的邊緣點的梯度方向)。如果有乙個點或者兩個點都滿足一下條件:
1>和中心畫素有相同的方向
2>梯度值比下限閾值大
3>他們的梯度值比相鄰畫素大
OpenCV系列 邊緣檢測之Canny
最近在做邊緣檢測方面的一些工作,在網路上也找了很多有用的資料,感謝那些積極分享知識的先輩們,自己在理解canny邊緣檢測演算法的過程中也走了一些彎路,在程式設計實現的過程中,也遇到了乙個讓我懷疑人生的bug 日了狗狗 就此寫下此文,作為後記,也希望此篇文章可以幫助那些在理解canny演算法的道路上暫...
opencv之canny邊緣檢測演算法
canny演算法由john f.canny於1986年開發,是很常用的邊緣檢測演算法。它是一種多階段演算法,內部過程共4個階段 雜訊抑制 通過gaussianblur高斯模糊降噪 使用5x5高斯濾波器去除影象中的雜訊 查詢邊緣的強度及方向 通過sobel濾波器 應用非最大訊號抑制 non maxim...
OpenCV參考手冊之Canny邊緣檢測
1 opencv nchannels通道的大概意思 a 4道 rgba b 3道 rgb,常見 c 2道 不常見,通常在程式處理中會用到,乙個通道為實數,乙個通道為虛數,便於程式設計 d 1道 平常的灰度圖,只有乙個畫素值 網路上的 opencv中iplimage的使用 bmp與iplimage相互...