簡介:
1.Canny邊緣檢測算子是John F. Canny於 1986 年開發出來的一個多級邊緣檢測算法。
①高斯模糊 - 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
https://blog.csdn.net/sunny2038/article/details/9202641