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, 0)
grad_y = cv.Scharr(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 lapalian(img):
"""拉普拉斯算子"""
dst=cv.Laplacian(img,cv.CV_32F)
lpls=cv.convertScaleAbs(dst)
cv.imshow("lpls",lpls)
src=cv.imread('15.jpg')
lapalian(src)
cv.waitKey(0)
cv.destroyAllWindows()
觉得不错打赏一下 | |
---|---|