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

来源:互联网 发布:linux网络服务器项目 编辑:程序博客网 时间:2024/06/05 01:16

一、什么是图像梯度

可以把图像看成二维离散函数,图像梯度其实就是这个二维离散函数的求导:
图像梯度: 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 cvimport numpy as npdef 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()


阅读全文
0 0
原创粉丝点击