Opencv学习笔记五——梯度计算

需要的库和自定义函数

import cv2
import numpy as np
import matplotlib.pyplot as plt
 
def cv_show(name, mat):
    cv2.imshow(name, mat)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

一、Sobel算子

对周围各点赋予权重,再计算梯度

计算垂直方向梯度的权重【水平方向则是它的转置矩阵】

 

###        函数原型
void cv::Sobel(InputArray  src,
		OutputArray  	dst,
		int  	ddepth,
		int  	dx,
		int  	dy,
		int  	ksize = 3,
		double  scale = 1,
		double  delta = 0,
		int  	borderType = BORDER_DEFAULT 
	) 		
###        在python中使用
dst	= cv2.Sobel(src, ddepth, dx, dy, dst, ksize, scale, delta, borderType)
src原图像
dst处理后的图像,大小类型须和原图像相同
ddepth输出图像深度
dx置1则计算x方向的梯度
dy置1则计算y方向的梯度
ksize参考的像素点范围,必须是1, 3, 5, or 7.
scale计算导数值的可选比例因子;默认情况下,不应用缩放
delta结果偏移量
borderType像素外推方法
img = cv2.imread('C://Users//rwhite//Pictures//opencv//test.jpg', cv2.IMREAD_GRAYSCALE)

dstx	= cv2.Sobel(img, cv2.CV_64F, dx = 1, dy = 0,  ksize=3)
dsty	= cv2.Sobel(img, cv2.CV_64F, dx = 0, dy = 1,  ksize=3)

cv2.imwrite('C://Users//rwhite//Pictures//opencv//dstx.jpg', dstx)
cv2.imwrite('C://Users//rwhite//Pictures//opencv//dsty.jpg', dsty)
原图像

 

 sobel算子对梯度的计算遵循“右边像素减左边像素”。以x轴方向的梯度计算为例。

白色圆圈的左半边均为白色像素(右边像素)减去黑色像素(左边像素),所以左半边的梯度都为正数,即显示为白色轮廓。

而白色圆圈的右半边是黑色像素(右边像素)减去白色像素(左边像素),结果为负数,会自动截取为0,所以显示为一片黑色。

因此,为了得到完整的梯度图,需要对计算结果取绝对值。

#上述代码再增加两个步骤
dstx = cv2.convertScaleAbs(dstx)
dsty = cv2.convertScaleAbs(dsty)

 最后在对x方向和y方向的梯度进行整合:

dst = cv2.addWeighted(dstx, 0.5, dsty, 0.5, 0)

 

 Ps:不建议使用sobel算子同时计算x和y方向上的梯度(即同时将dx和dy置1),效果较差:

 

 

 二、scharr算子

计算方式与sobel算子相同,但对周围像素点的权重不同。

scharr对周围像素点更为敏感,能捕捉到更多信息。

函数使用方法也与sobel算子相同。

三、拉普拉斯laplacian算子

计算方式与sobel算子相同,但对周围像素点的权重不同。

对噪音点会比较敏感。

 函数使用方法与sobel算子相似,不同在于不用设置dx和dy。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值