圖像的梯度計算的是圖像變化的速度,對于邊緣部分呢灰階值變換大,梯度值也大,相反則灰階值變化小,梯度值小
Sobel算子是一種離散的微分算子,該算子結合了高斯平滑處理和微分求導運算。 該算子利用局部差尋找邊緣
将Sobel算子Gx和原始圖像卷積可以得到水準方向的像素值變化,與Gy卷積的到垂直方向的像素值變化。
将sober算子在圖中進行平移,目前位置的像素值等于sobel算子與(目前位置與周邊位置8個點)進行對應位置相乘并相加操作,作為目前位置的像素點。
如果要計算P5的水準方向,則需要Sobel算子及P5鄰域點
公式為:P5x軸 = P3 - P1 + 2 * P6 - 2* P4 + P9 - P7
用P5右側的像素點減左側的像素點,因為P4和P6離P5較近,是以權值為2,其他為1垂直方向類似,垂直是下減上。
import cv2
import matplotlib.pyplot as plt
import numpy as np
def cv_show(img,name):
cv2.imshow(name,img)
cv2.waitKey()
cv2.destroyAllWindows()
def Sobel():
img = cv2.imread('images/pie.png', cv2.IMREAD_GRAYSCALE)
cv2.imshow("img", img)
# 使用cv2.Sobel(src, cv2.CV_64F, 1, 0, ksize=3) 對x軸方向進行sobel算子相乘操作
sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3)
# 由于會出現負值的情況,是以使用cv2.convertScalerAbs() 轉換為絕對值的形式
sobelx = cv2.convertScaleAbs(sobelx)
cv_show(sobelx, 'sobelx')
# 計算y軸方向上的sobel算子
sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3)
sobely = cv2.convertScaleAbs(sobely)
cv_show(sobely, 'sobely')
# 使用cv2.addWeighted 将x軸方向的sobel算子的結果和y軸方向上的sobel算子的結果結合
sobelxy = cv2.addWeighted(sobelx, 0.5, sobely, 0.5, 0)
cv_show(sobelxy, 'sobelxy')