Python-Opencv学习总结(六):图像梯度sobel、scharr、laplancian

1、sobel算子

计算不同方向上的梯度,用一个卷积核与原始图像相乘。
计算水平方向的梯度
在这里插入图片描述
如上图,计算P5的梯度,用右边一列减去左边一列,又因为P4和P6挨P5较近,所以权重更大
中间的图像便是卷积核
若P5左右两列数值相差较大,则P5梯度也会很大,则此处边界
若P5左右两列数值相差较小,则P5梯度也会很小,则此处不是边界
计算垂直方向的梯度
如下图
在这里插入图片描述
计算近似梯度:
在这里插入图片描述
在这里插入图片描述
sobel函数的使用
1、dst = cv2.Sobel( src,ddepth,dx,dy,[ksize])
dst:计算结果 src:原始图像
ddepth:处理结果图像深度 通常情况下,可以将该参数的值设置为-1,让处理结果与原始图像保持一致。
dx:x轴方向 计算x方向梯度令【dx=1,dy=0】
dy:y轴方向 计算y方向梯度令【dx=0,dy=1】
ksize:核大小 N×N的矩阵

差值不为0则是边界,差值是0则不是边界。计算要去绝对值
为了计算时去绝对值,防止出现负数,ddepth:不写成-1,写成:cv2.CV_64F
2、dst = cv2.convertScaleAbs( src,[alpha[beta]] )
作用:将原始图像src转换为256色位图,缩小范围
写的时候直接写成:目标图像= cv2.convertScaleAbs (原始图像)

计算sobel结果
方式1:dx=1,dy=1 dst=cv2.Sobel( src,ddepth,1,1)
方式2:分别计算dx和dy后相加,
dx= cv2.Sobel( src,ddepth,1,0)
dy= cv2.Sobel( src,ddepth, 0,1 )
dst= dx + dy
dst= dx*系数1+ dy *系数2 (若dx,dy过大乘以系数)
函数dst=cv2.addWeighted(src1,alpha,src2,beta,gamma)
功能:计算两幅图像的权重和。
gamma:修正值
汇总:
sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)#各占权重0.5,修正值为0

import cv2
import numpy as np
o=cv2.imread(r'D:\image\lena.bmp',cv2.IMREAD_UNCHANGED)
#sobelx=cv2.Sobel(0,-1,1,0) #没有使用绝对值
sobelx=cv2.Sobel(o,cv2.CV_64F,1,0) #使用64位 
sobelx=cv2.convertScaleAbs(sobelx)#缩小范围
sobely=cv2.Sobel(o,cv2.CV_64F,0,1)
sobely=cv2.convertScaleAbs(sobely)
sobelxy=cv2.addWeighted(sobelx,0.5,sobely,0.5,0)#xy汇总
cv2.imshow('o',o)
cv2.imshow('x',sobelx)
cv2.imshow('y',sobely)
cv2.imshow('xy',sobelxy)
cv2.waitKey()
cv2.destroyAllWindows()

2、scharr算子

计算3×3的sobel算子时,可能不太准确,scharr算子效果更好
计算X轴和Y轴的一致,只是系数不一样,卷积核不一样
在这里插入图片描述
函数:
1、dst= Scharr (src,ddpeth,dx,dy)
ddpeth:处理结果图像深度,不能再写-1了
dst= Scharr(src,cv2. CV_ 64F,dx,dy)
2、dst= cv2.convertScaleAbs(dst)
dx:X轴方向 dst=Scharr (src,ddpeth, dx=1, dy=0)
dy:Y轴方向 dst=Scharr (src,ddpeth, dx=0,dy=1)
不能出现dx,dy同时为1
3、汇总:scharrxy=cv2. addWeighted (dx,0.5,dy,0.5,0)
scharrx = cv2.Scharr(o,cv2.CV_ 64F,1,0)
scharry = cv2.Scharr(o,cv2.CV_ 64F,0,1)
scharrx = cv2.convertScaleAbs(scharrx) # 转回uint8
scharry = cv2.convertScaleAbs(scharry)

import cv2
import numpy as np
o=cv2.imread(r'D:\image\lena.bmp',cv2.IMREAD_UNCHANGED)
scharrx=cv2.Scharr(o,cv2.CV_64F,1,0)  #x轴方向的梯度,扩大64位
scharrx=cv2.convertScaleAbs(scharrx)  #进行转换成uint8
scharry=cv2.Scharr(o,cv2.CV_64F,0,1)  #y轴方向的梯度,扩大64位
scharry=cv2.convertScaleAbs(scharry)  #进行转换成uint8
scharrxy=cv2.addWeighted(scharrx,0.5,scharry,0.5,0)  #汇总两个方向的梯度
cv2.imshow('o',o)
cv2.imshow('x',scharrx)
cv2.imshow('y',scharry)
cv2.imshow('xy',scharrxy)
cv2.waitKey()
cv2.destroyAllWindows()

3、sobel算子和Scharr算子比较

import cv2
import numpy as np
o=cv2.imread(r'D:\image\lena.bmp',cv2.IMREAD_UNCHANGED)
sobelx=cv2.Sobel(o,cv2.CV_64F,1,0)
#soble算子
sobelx=cv2.convertScaleAbs(sobelx)
sobely=cv2.Sobel(o,cv2.CV_64F,0,1)
sobely=cv2.convertScaleAbs(sobely)
sobelxy=cv2.addWeighted(sobelx,0.5,sobely,0.5,0)

#scharr算子
scharrx=cv2.Scharr(o,cv2.CV_64F,1,0)
scharrx=cv2.convertScaleAbs(scharrx)
scharry=cv2.Scharr(o,cv2.CV_64F,0,1)
scharry=cv2.convertScaleAbs(scharry)
scharrxy=cv2.addWeighted(scharrx,0.5,scharry,0.5,0)

cv2.imshow('o',o)
cv2.imshow('x',sobelx)
cv2.imshow('y',sobely)
cv2.imshow('xy',sobelxy)
cv2.imshow('xx',scharrx)
cv2.imshow('yy',scharry)
cv2.imshow('xxyy',scharrxy)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述

5、Laplancian算子及使用

拉普拉斯算子类似于二阶sobel导数。
实际上,在OpenCV中通过调用sobel算子来计算拉普拉斯算子。就是计算两次:右边左边减两次,上边下边减两次
在这里插入图片描述
如上图:左边为卷积核,若计算P5,分别用上下左右,去减P5,相当于减4次
非边界:梯度值小
边界:梯度值大
三个算子比较
在这里插入图片描述
函数:
dst = cv2.Laplacian(src, ddepth)
ddepth:图像深度,默认设置为-1,让处理结果与原图像保持一致。
但实际应用中,计算梯度值可能会出现负数。
通常处理的图像是np.uint8类型,如果结果也是该类型,所有负数会自动截断为0,发生信息丢失。
通常计算时,使用更高的数据类型cv2.CV_64F,取绝对值后,再换为np.uint8 (cv2.CV_8U)类型。
dst = cv2.convertScaleAbs(src)

import cv2
import numpy as np
o=cv2.imread(r'D:\image\lena.bmp',cv2.IMREAD_UNCHANGED)
r=cv2.Laplacian(o,cv2.CV_64F)
r=cv2.convertScaleAbs(r)
cv2.imshow('o',o)
cv2.imshow('r',r)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值