垂直邊緣提取
濾波是應用卷積實現的,卷積的關鍵是卷積核:
當前列左右兩側的元素進行差分,由於邊緣的值明顯小於(或大於)周邊像素,所以邊緣的差分結果會明顯不同,這樣就提取出了垂直邊緣。同理,把上面那個矩陣轉置一下,就是提取水平邊緣。
原圖:
import cv2
import numpy as np
img = cv2.imread('sudu.png', 0)
# 自己進行垂直邊緣提取
kernel = np.array([[-1, 0, 1],
[-2, 0, 2],
[-1, 0, 1]], dtype=np.float32)
dst_v = cv2.filter2D(img, -1, kernel)
# 自己進行水平邊緣提取
dst_h = cv2.filter2D(img, -1, kernel.T)# kernel.T 矩陣轉置
# 橫向並排對比顯示
cv2.imshow('edge', np.hstack((img, dst_v, dst_h)))
cv2.waitKey(0)
結果:
Sobel算子
上面的這種差分方法就叫Sobel算子,它先在垂直方向計算梯度,再在水平方向計算梯度,最後求出總梯度:
我們可以把前面的代碼用Sobel算子更簡單地實現:
sobelx = cv2.Sobel(img, -1, 1, 0, ksize=3) # 只計算x方向
sobely = cv2.Sobel(img, -1, 0, 1, ksize=3) # 只計算y方向
很多人疑問,Sobel算子的卷積核這幾個值是怎麼來的呢?事實上,並沒有規定,你可以用你自己的。
介紹幾種算子
- sobel 產生的邊緣有強弱,抗噪性好
- laplace 對邊緣敏感,可能有些是噪聲的邊緣,也被算進來了
- canny 產生的邊緣很細,可能就一個像素那麼細,沒有強弱之分。
Laplacian算子
一堆書序公式~~~~~~~~~~~~··
laplacian = cv2.Laplacian(img, -1) # 使用Laplacian算子