(ง •_•)ง[Python3 OpenCV4]11.圖像梯度

垂直邊緣提取

濾波是應用卷積實現的,卷積的關鍵是卷積核:

k1=[101202101]k1 = \left[ \begin{matrix} -1 & 0 & 1 \\ -2 & 0 & 2 \\ -1 & 0 & 1 \end{matrix} \right]

在這裏插入圖片描述
當前列左右兩側的元素進行差分,由於邊緣的值明顯小於(或大於)周邊像素,所以邊緣的差分結果會明顯不同,這樣就提取出了垂直邊緣。同理,把上面那個矩陣轉置一下,就是提取水平邊緣。

k1=[121000121]k1 = \left[ \begin{matrix} -1 & -2 & -1 \\ 0 & 0 & 0 \\ 1 & 2 & 1 \end{matrix} \right]

原圖:
在這裏插入圖片描述

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算子,它先在垂直方向計算梯度Gx=k1×srcGx=k1×src,再在水平方向計算梯度Gy=k2×srcGy=k2×src,最後求出總梯度:G=Gx2+Gy2G=\sqrt[]{ Gx2+Gy2}
我們可以把前面的代碼用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算子

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章