Python3与OpenCV3.3 图像处理(十七)--图像梯度

一、什么是图像梯度

可以把图像看成二维离散函数,图像梯度其实就是这个二维离散函数的求导:
图像梯度: G(x,y) = dx i + dy j;
dx(i,j) = I(i+1,j) - I(i,j);
dy(i,j) = I(i,j+1) - I(i,j);
其中,I是图像像素的值(如:RGB值),(i,j)为像素的坐标。
图像梯度一般也可以用中值差分:
dx(i,j) = [I(i+1,j) - I(i-1,j)]/2;
dy(i,j) = [I(i,j+1) - I(i,j-1)]/2;
图像边缘一般都是通过对图像进行梯度运算来实现的。

图像梯度的最重要性质是,梯度的方向在图像灰度最大变化率上,它恰好可以反映出图像边缘上的灰度变化
上面说的是简单的梯度定义,其实还有更多更复杂的梯度公式。(来源百度)

二、示例代码

import cv2 as cv
import numpy as np

def sobel(img):
    """索贝尔算子"""
    grad_x=cv.Sobel(img,cv.CV_32F,1,0)
    grad_y=cv.Sobel(img,cv.CV_32F,0,1)
    gradx=cv.convertScaleAbs(grad_x)
    grady = cv.convertScaleAbs(grad_y)
    cv.imshow("x",gradx)
    cv.imshow("y",grady)

    gradxy=cv.addWeighted(gradx,0.5,grady,0.5,0)
    cv.imshow("grad",gradxy)

def scharr(img):
    """某些边缘差异很小的情况下使用"""
    grad_x = cv.Scharr(img, cv.CV_32F, 1, 
原文地址:https://www.cnblogs.com/gangzhucoll/p/12778285.html