Python+OpenCV圖像處理(十三)—— Canny邊緣檢測


簡介:

1.Canny邊緣檢測算子是John F. Canny於 1986 年開發出來的一個多級邊緣檢測算法。

2.Canny 的目標是找到一個最優的 邊緣檢測算法,最優邊緣檢測的含義是:
好的檢測- 算法能夠盡可能多地標識出圖像中的實際邊緣。
好的定位- 標識出的邊緣要盡可能與實際圖像中的實際邊緣盡可能接近。
最小響應- 圖像中的邊緣只能標識一次,並且可能存在的圖像噪聲不應標識為邊緣。
3.算法步驟:

  ①高斯模糊 - GaussianBlur
  ②灰度轉換 - cvtColor
  ③計算梯度 – Sobel/Scharr
  ④非最大信號抑制
  ⑤高低閾值輸出二值圖像

代碼如下:

 1 #Canny邊緣提取
 2 import cv2 as cv
 3 def edge_demo(image):
 4     blurred = cv.GaussianBlur(image, (3, 3), 0)
 5     gray = cv.cvtColor(blurred, cv.COLOR_RGB2GRAY)
 6     # xgrad = cv.Sobel(gray, cv.CV_16SC1, 1, 0) #x方向梯度
 7     # ygrad = cv.Sobel(gray, cv.CV_16SC1, 0, 1) #y方向梯度
 8     # edge_output = cv.Canny(xgrad, ygrad, 50, 150)
 9     edge_output = cv.Canny(gray, 50, 150)
10     cv.imshow("Canny Edge", edge_output)
11     dst = cv.bitwise_and(image, image, mask= edge_output)
12     cv.imshow("Color Edge", dst)
13 src = cv.imread('E:/imageload/liu.jpg')
14 cv.namedWindow('input_image', cv.WINDOW_NORMAL) #設置為WINDOW_NORMAL可以任意縮放
15 cv.imshow('input_image', src)
16 edge_demo(src)
17 cv.waitKey(0)
18 cv.destroyAllWindows()

注:其中第9行代碼可以用6、7、8行代碼代替!兩種方法效果一樣。

運行結果:

 注意:

OpenCV的Canny函數用於在圖像中查找邊緣,其函數原型有兩種:

①直接調用Canny算法在單通道灰度圖像中查找邊緣,

其函數原型為:Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient]]]) -> edges

image參數表示8位輸入圖像。

threshold1參數表示設置的低閾值。

threshold2參數表示設置的高閾值,一般設定為低閾值的3倍 (根據Canny算法的推薦)。

edges參數表示輸出邊緣圖像,單通道8位圖像。

apertureSize參數表示Sobel算子的大小。

L2gradient參數表示一個布爾值,如果為真,則使用更精確的L2范數進行計算(即兩個方向的倒數的平方和再開方),否則使用L1范數(直接將兩個方向導數的絕對值相加)。

②使用帶自定義圖像漸變的Canny算法在圖像中查找邊緣,

其函數原型為:Canny(dx, dy, threshold1, threshold2[, edges[, L2gradient]]) -> edges

dx參數表示輸入圖像的x導數(x導數滿足16位,選擇CV_16SC1或CV_16SC3)

dy參數表示輸入圖像的y導數(y導數滿足16位,選擇CV_16SC1或CV_16SC3)。

threshold1參數表示設置的低閾值。

threshold2參數表示設置的高閾值,一般設定為低閾值的3倍 (根據Canny算法的推薦)。

edges參數表示輸出邊緣圖像,單通道8位圖像。

L2gradient參數表示L2gradient參數表示一個布爾值,如果為真,則使用更精確的L2范數進行計算(即兩個方向的倒數的平方和再開方),否則使用L1范數(直接將兩個方向導數的絕對值相加)。

參考:

Canny算子原理:https://www.cnblogs.com/techyan1990/p/7291771.html

http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/imgtrans/canny_detector/canny_detector.html

https://blog.csdn.net/sunny2038/article/details/9202641

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM