图像的梯度计算的是图像变化的速度,对于边缘部分呢灰度值变换大,梯度值也大,相反则灰度值变化小,梯度值小
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')