OpenCV中的Canny邊緣檢測
阿新 • • 發佈:2021-02-16
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)
# 高低閾值連線
# T1,T2為閾值,凡是高於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()
執行結果: