目標
? 圖像梯度,圖像邊界等
? 使用到的函數有:cv2.Sobel(),cv2.Schar(),cv2.Laplacian() 等
原理
梯度簡單來說就是求導。
OpenCV 提供了三種不同的梯度濾波器,或者說高通濾波器:Sobel,Scharr 和 Laplacian。我們會意義介紹他們。
Sobel,Scharr 其實就是求一階或二階導數。Scharr 是對 Sobel(使用小的卷積核求解求解梯度角度時)的優化。Laplacian 是求二階導數。
1.Sobel 算子和 Scharr 算子
Sobel 算子是高斯平滑與微分操作的結合體,所以它的抗噪聲能力很好。 你可以設定求導的方向(xorder 或
yorder)。還可以設定使用的卷積核的大 小(ksize)。
import cv2
import numpy as np
# 讀取灰度圖像
img = cv2.imread(r"C:\Users\mzd\Desktop\opencv\images.jpg", cv2.IMREAD_GRAYSCALE)
# 計算水平方向的Sobel梯度
sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3)
# 計算垂直方向的Sobel梯度
sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3)
# 顯示原始圖像和Sobel梯度圖像
cv2.imshow('Original Image', img)
cv2.imshow('Sobel X', sobelx)
cv2.imshow('Sobel Y', sobely)
# 等待用戶按下任意鍵
cv2.waitKey(0)
cv2.destroyAllWindows()
圖像梯度是圖像中灰度變化的一種度量,通常用于檢測圖像中的邊緣或者區域的變化。在圖像處理中,常用的梯度計算方法包括Sobel、Scharr、Laplacian等。
Sobel算子:
Sobel算子是一種常用的梯度計算方法,分為水平和垂直兩個方向。在OpenCV中,cv2.Sobel()
函數用于計算圖像的Sobel梯度。
基本語法如下:
sobelx = cv2.Sobel(src, ddepth, dx, dy, ksize[, dst[, scale[, delta[, borderType]]]])
src
: 輸入圖像。ddepth
: 輸出圖像的深度,通常使用-1
表示與輸入圖像相同。dx
和dy
: 分別表示水平和垂直方向的梯度階數。ksize
: Sobel核的大小,通常為1、3、5等奇數。dst
(可選): 輸出圖像。scale
(可選): 縮放因子,通常為1。delta
(可選): 一個可選的增量,將被加到輸出。borderType
(可選): 邊界處理的方式,通常為默認值cv2.BORDER_DEFAULT
。
- Laplacian算子:
Laplacian算子用于計算圖像的二階導數,從而得到圖像的梯度。在OpenCV中,cv2.Laplacian()
函數用于計算Laplacian梯度。
基本語法如下:
laplacian = cv2.Laplacian(src, ddepth[, dst[, ksize[, scale[, delta[, borderType]]]]])
參數說明與Sobel類似,其中 ksize
表示Laplacian核的大小。
import cv2
import numpy as np
# 讀取灰度圖像
img = cv2.imread(r"C:\Users\mzd\Desktop\opencv\images.jpg", cv2.IMREAD_GRAYSCALE)
# 計算Laplacian梯度
laplacian = cv2.Laplacian(img, cv2.CV_64F)# 顯示原始圖像和Laplacian梯度圖像
cv2.imshow('Original Image', img)
cv2.imshow('Laplacian', laplacian)# 等待用戶按下任意鍵
cv2.waitKey(0)
cv2.destroyAllWindows()
這些梯度計算方法可以幫助檢測圖像中的邊緣和區域變化,對于后續的圖像分析和處理非常有用。