
這是OpenCV圖像處理子產品提供的最後一個邊緣檢測的例子,canny邊緣檢測,利用函數Canny()實作。前面分别介紹了Sobel和Laplace邊緣檢測。
CVer:【3】OpenCV圖像處理子產品(13)Sobel邊緣檢測
CVer:【3】OpenCV圖像處理子產品(14)拉普拉斯邊緣檢測
理論
Canny邊緣檢測器是由John Canny[1]于1986年提出的。被稱為最佳的邊緣檢測器,滿足下面三個條件:
- 低錯誤率:隻檢測存在邊緣的地方
- 良好的定位:檢測到的邊緣像素與真正邊緣像素距離最小
- 最小響應:一個邊緣隻會得到一個響應。
檢測步驟
1.使用高斯濾波器濾波。一個大小為5的高斯濾波器核如下:
2.計算圖像梯度。這裡與Sobel方法類似:
- a.利用兩個卷積核,分别計算x和y方向的梯度:
- b.計算總梯度大小和方向:
方向角度圓整到到下面四個角度之一(0,45,90,135)。
3.
非極大值抑制。該步移除非邊緣像素。隻有細線(候選邊緣)保留。
4.
Hysteresis:最後一步。用兩個門檻值再次篩選邊緣(高upper和低lower):
- a.如果像素梯度高于upper,該像素為邊緣
- b.如果像素梯度低于lower,該像素不是邊緣
- c.如果像素梯度在兩者之間,隻有當它連接配接到一個滿足于a的像素時,是邊緣
Canny推薦upper:lower在2:1和3:1之間。
5.關于更多的細節,可以參考有關圖像處理的書籍。
代碼
// @tutorials imgproc module 15
結果
高門檻值是低門檻值的三倍,注意這裡檢測的邊緣是用原圖中的像素值填充過的。
參考
- ^John Canny.A computational approach to edge detection.Pattern Analysis and Machine Intelligence, IEEE Transactions on, (6):679–698, 1986.