Canny 的目標是找到一個最優的邊緣檢測算法,最優邊緣檢測的含義是:
(1)最優檢測:算法能夠盡可能多地標識出圖像中的實際邊緣,漏檢真實邊緣的概率和誤檢非邊緣的概率都盡可能小;
(2)最優定位准則:檢測到的邊緣點的位置距離實際邊緣點的位置最近,或者是由於噪聲影響引起檢測出的邊緣偏離物體的真實邊緣的程度最小;
(3)檢測點與邊緣點一一對應:算子檢測的邊緣點與實際邊緣點應該是一一對應
Canny邊緣檢測算法可以分為以下5個步驟:
-
應用高斯濾波來平滑圖像,目的是去除噪聲
-
找尋圖像的強度梯度(intensity gradients)
-
應用非最大抑制(non-maximum suppression)技術來消除邊誤檢(本來不是但檢測出來是)
-
應用雙閾值的方法來決定可能的(潛在的)邊界
-
利用滯后技術來跟蹤邊界
python實現
import cv2 __author__ = "boboa" def edge_demo(image): blurred = cv2.GaussianBlur(image, (3, 3), 0) gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) xgrad = cv2.Sobel(gray, cv2.CV_16SC1, 1, 0) ygrad = cv2.Sobel(gray, cv2.CV_16SC1, 1, 0) # edge_output = cv2.Canny(xgrad, ygrad, 50, 150) # cv2.imshow("Vannt_edge",edge_output) edge_output = cv2.Canny(gray, 50, 150) cv2.imshow("canny edge", edge_output) dst = cv2.bitwise_and(image, image, mask=edge_output) cv2.imshow("color edge", dst) if __name__ == "__main__": img = cv2.imread("image/img5.jpg") cv2.namedWindow("input image", cv2.WINDOW_AUTOSIZE) cv2.imshow("input image", img) edge_demo(img) cv2.waitKey(0) cv2.destroyAllWindows()
直接調用Canny算法在單通道圖像中查找邊緣
cv2.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient]]]) -> edges
參數:image-8位輸入圖像
threshold1-設置的低閾值
threshold2-設置的高閾值,一般高低閾值的比例為3:1或者2:1
運行結果如下
使用帶自定義圖像漸變的Canny算法在圖像中查找邊緣
cv2.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:1或者2:1
運行結果如下