opencv笔记(4)——图像梯度处理 and opencv 数据类型

图像梯度处理


计算梯度:
相当于划一竖线,计算该线左右两边的像素值的差

一、图像梯度-Sobel算子

在这里插入图片描述
Gx及Gy分别代表经横向及纵向边缘检测的图像灰度值,即水平、竖直方向的梯度
在这里插入图片描述

import cv2
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline  #专有魔法指令,即时显示
def cv_show(name,img):
	cv2.imshow(name,img)
	cv2.waitKey(0)
	cv2.destoryAllWindows()
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)

cv_show(sobelx,'sobelx')

在这里插入图片描述
白到黑是正数,黑到白就是复数了,所有的负数会被截断成0,所以要取绝对值

img = cv2.imread('pie.png', cv2.IMREAD_GRAYSCALE)
sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3)
sobelx = cv2.convertScaleAbs(sobelx)
cv_show(sobelx, 'sobelx')
sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3)
sobely = cv2.convertScaleAbs(sobelx)
cv_show(sobely, 'sobelx')

在这里插入图片描述
在这里插入图片描述
一般求出Gx和Gy后还要求一个总和G,G=根号下 (Gx²+Gy²)或 G=|Gx|+|Gy|

# 分别计算x和y,再求和
sobelxy = cv2.addWeighted(sobelx, 0.5, sobely, 0.5, 0) # 0.5x + 0.5y + 0
cv_show(sobelxy ,'sobelxy')

在这里插入图片描述

# 也可以直接计算,但直接计算效果不好
sobelxy = cv2.Sobel(img, cv2.CV_64F, 1, 1, ksize=3)
sobelxy = cv2.convertScaleAbs(sobelxy)
cv_show(sobelxy ,'sobelxy')

在这里插入图片描述

img = cv2.imread('lena.jpg',cv2.IMREAD_GRAYSCALE)
cv_show(img,'img')

img = cv2.imread('lena.jpg',cv2.IMREAD_GRAYSCALE)
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
sobelx = cv2.convertScaleAbs(sobelx)
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
sobely = cv2.convertScaleAbs(sobely)
sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
cv_show(sobelxy,'sobelxy')

在这里插入图片描述
在这里插入图片描述

二、图像梯度-Scharr算子

线条更加明显,能捕捉到更丰富的梯度信息
在这里插入图片描述

img = cv2.imread('pie.png', cv2.IMREAD_GRAYSCALE)
scharrx = cv2.Scharr(img, cv2.CV_64F, 1, 0)
scharry = cv2.Scharr(img, cv2.CV_64F, 0, 1)
scharrx = cv2.convertScaleAbs(scharrx)
scharry = cv2.convertScaleAbs(scharry)
scharrxy = cv2.addWeighted(scharrx, 0.5, scharry, 0.5, 0)

三、图像梯度-laplacian算子

在这里插入图片描述
拉普拉斯算子对噪音点较为敏感,但很多噪音点并不是边界,一般不单独使用

img = cv2.imread('pie.png', cv2.IMREAD_GRAYSCALE)
laplacian = cv2.Laplacian(img, cv2.CV_64F)
laplacian = cv2.convertScaleAbs(laplacian)
res = np.hstack((sobelxy, scharrxy, laplacian))
cv_show(res, 'res')

在这里插入图片描述

四、常用函数

  • cv2.Sobel(img, ddepth, dx, dy,ksize)

     Sobel算子
     img:当前的图像;ddepth:图像的深度(一般为-1,表示输入的深度和输出的深度是一样的);dx和dy分别表示水平和竖直方向;ksize:Soble算子的大小
    
  • cv2.Scharr(img, ddepth, dx, dy)

     Scharr算子(能捕捉到更多的细节)
    
  • cv2.Laplacian(img, ddepth)

     Laplacian算子(噪点影响很大)
     Laplacian(拉普拉斯)算子是一种二阶导数算子,其具有旋转不变性,可以满足不同方向的图像边缘锐化(边缘检测)的要求。通常情况下,其算子的系数之和需要为零。
    

在这里插入图片描述

	dst=cv2.Laplacian(src,ddepth[,ksize[,scale[,delta[,borderType]]]])

    式中:

    ● dst代表目标图像。

    ● src代表原始图像。

    ● ddepth代表目标图像的深度。

    ● ksize代表用于计算二阶导数的核尺寸大小。该值必须是正的奇数。当ksize的值为1时,Laplacian算子计算时采用的 3×3的核如上所示。

    ● scale代表计算Laplacian值的缩放比例因子,该参数是可选的。默认情况下,该值为 1,表示不进行缩放。

    ● delta代表加到目标图像上的可选值,默认为0。

    ● borderType代表边界样式。
  • cv2.convertScaleAbs(sobelx)

     变为绝对值
    

CV_8U - 8位无符号整数(0…255)

CV_8UC3 C后面是通道数

CV_8S - 8位有符号整数(-128…127)

CV_16U - 16位无符号整数(0…65535)

CV_16S - 16位有符号整数(-32768…32767)

CV_32S - 32位有符号整数(-2147483648…2147483647)

CV_32F - 32位浮点数(-FLT_MAX…FLT_MAX,INF,NAN)

CV_64F - 64位浮点数(-DBL_MAX…DBL_MAX,INF,NAN)

cv2.CV_64F代表每一个像素点元素占64位浮点数,是opencv定义的数据类型

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清园暖歌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值