1. 程式人生 > 其它 >OpenCV中的Canny邊緣檢測

OpenCV中的Canny邊緣檢測

技術標籤:opencv計算機視覺邊緣檢測cvpython

OpenCV中的Canny邊緣檢測

程式碼實現:

import cv2
import numpy as np
#邊緣檢測(影象梯度)
#一、Sobel運算元
img = cv2.imread('cat.jpg')
cv2.imshow('img',img)
#對x方向和y方向求梯度
#ksize預設為3,此時採用Scharr運算元,使得邊緣更突出
grad_x = cv2.Sobel(img,cv2.CV_32F,1,0,ksize=3)
grad_y = cv2.Sobel(img,cv2.CV_32F,0,1,ksize=3)
gradx =
cv2.convertScaleAbs(grad_x) grady = cv2.convertScaleAbs(grad_y) #加權 sobel=cv2.addWeighted(gradx,0.5,grady,0.5,0) cv2.imshow('sobel',sobel) cv2.waitKey() #二、Laplacian運算元 #1.自帶laplacian的api cv2.imshow('img',img) laplacian = cv2.Laplacian(img,cv2.CV_32F,ksize=3) #ksize預設為1 laplacian = cv2.convertScaleAbs
(laplacian) cv2.imshow('laplacian1',laplacian) cv2.waitKey() #2.自定義拉普拉斯卷積核 kernel = np.array([[1,1,1],[1,-8,1],[1,1,1]]) #八領域卷積核 dst = cv2.filter2D(img,cv2.CV_32F,kernel=kernel) laplacian = cv2.convertScaleAbs(dst) cv2.imshow('laplacian2',laplacian) cv2.waitKey() #三、Candy運算元 # canny運算步驟:5步 # 1. 高斯模糊 -
GaussianBlur # 2. 灰度轉換 - cvtColor # 3. 計算梯度 - Sobel/Scharr # 4. 非極大值抑制 # 5. 高低閾值輸出二值影象 blur = cv2.GaussianBlur(img,(5,5),0) gray = cv2.cvtColor(blur,cv2.COLOR_BGR2GRAY) xgrad = cv2.Sobel(img,cv2.CV_32F, 1,0) ygrad = cv2.Sobel(img,cv2.CV_32F,0,1) xgrad = cv2.convertScaleAbs(xgrad) ygrad = cv2.convertScaleAbs(ygrad) sobel=cv2.addWeighted(gradx,0.5,grady,0.5,0) # 高低閾值連線 # T1T2為閾值,凡是高於T2的都保留,凡是低於T1的都丟棄 # 從高於T2的畫素出發,凡是大於T1而且相互連線的都保留。最終得到一個輸出二值影象 # 推薦高低閾值比值為T2:T1 = 3:1/2:1,其中T2高閾值,T1低閾值 #1.用x和y的梯度共同合成 #第二個引數是低閾值,第三個引數是高閾值 canny = cv2.Canny(sobel,50,150) cv2.Canny cv2.imshow('canny1',canny) #2.直接用灰度圖呼叫api #第二個引數是低閾值,第三個引數是高閾值 canny = cv2.Canny(gray,50,150) cv2.imshow('canny2',canny) cv2.waitKey()

執行結果:
在這裡插入圖片描述