OpenCV-Python图像梯度 Sobel算子

图像的梯度计算的是图像变化的速度,对于边缘部分呢灰度值变换大,梯度值也大,相反则灰度值变化小,梯度值小

Sobel算子是一种离散的微分算子,该算子结合了高斯平滑处理和微分求导运算。 该算子利用局部差寻找边缘
OpenCV-Python图像梯度 Sobel算子_第1张图片
将Sobel算子Gx和原始图像卷积可以得到水平方向的像素值变化,与Gy卷积的到垂直方向的像素值变化。
OpenCV-Python图像梯度 Sobel算子_第2张图片
将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')

    

OpenCV-Python图像梯度 Sobel算子_第3张图片

你可能感兴趣的:(#,OpenCv,opencv)