Python cv2(Opencv) 图像梯度Sobel算子、Scharr算子和Laplacian算子

简介:
OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效,由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。OpenCV用C++语言编写,它具有C ++,Python,Java和MATLAB接口,并支持Windows,Linux,Android和Mac OS,OpenCV主要倾向于实时视觉应用,并在可用时利用MMX和SSE指令, 如今也提供对于C#、Ch、Ruby,GO的支持。本文主要介绍Python 中cv2(Opencv) 图像梯度算子及示例代码。

1、Sobel算子
Sobel算子可以计算图像梯度,计算图像梯度的作用是提取边界。融合计算的X和Y梯度,比直接计算X和Y的梯度,效果要好。

cv2.Sobel(src,ddepth,dx,dy[, dst[, ksize[, scale[, delta[, borderType]]]]])

参数如下,

参数
src输入图像
ddepth输出图像的深度(可以理解为数据类型),-1表示与原图像相同的深度
dx,dy当组合为dx=1,dy=0时求x方向的一阶导数,当组合为dx=0,dy=1时求y方向的一阶导数(如果同时为1,通常得不到想要的结果)
ksize(可选参数)Sobel算子的大小,必须是1,3,5或者7,默认为3。求X方向和Y方向一阶导数时,卷积核分别为:
scale(可选参数)将梯度计算得到的数值放大的比例系数,效果通常使梯度图更亮,默认为1
delta(可选参数)在将目标图像存储进多维数组前,可以将每个像素值增加delta,默认为0
borderType(可选参数)决定图像在进行滤波操作(卷积)时边沿像素的处理方式,默认为BORDER_DEFAULT

代码如下,

import cv2
import numpy as np
# 获取照片路径
path="cjavapy.jpg"
# 读取照片
img=cv2.imread(path,0)
# 显示照片
# cv2.imshow('image',img)
# 缩放
img1=cv2.resize(img,None,fx=0.4,fy=0.4)
# cv2.imshow('img1', img1)
 
# 计算X方向的梯度
sobelx=cv2.Sobel(img1,cv2.CV_64F,1,0,ksize=3)
# 将复数转化为整数【绝对值函数】
sobelx=cv2.convertScaleAbs(sobelx)
# cv2.imshow('sobelx',sobelx)
 
# 计算y方向的梯度
sobely=cv2.Sobel(img1,cv2.CV_64F,0,1,ksize=3)
# 将复数转化为整数【绝对值函数】
sobely=cv2.convertScaleAbs(sobely)
# cv2.imshow('sobely',sobely)
 
# 融合
sobelxy1=cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
# cv2.imshow('sobelxy1',sobelxy1)
 
# 直接计算融合的X和Y梯度
sobelxy2=cv2.Sobel(img1,cv2.CV_64F,1,1,ksize=3)
# 将复数转化为整数【绝对值函数】
sobelxy2=cv2.convertScaleAbs(sobelxy2)
# cv2.imshow('sobelxy2',sobelxy2)
imgs = np.hstack([img1, sobelx,sobely,sobelxy1,sobelxy2])
cv2.imshow('multi pic',imgs)
cv2.waitKey()

2、Scharr算子
Scharr与Sobel算子思想一样,只是卷积核的系数不同,scharr算子提取边界也更加灵敏,能提取到更细小的边界,但需注意越是灵敏就越是可能误判。

cv2.Scharr(src,ddepth,dx,dy[, dst[, scale[, delta[, borderType]]]])

参数如下,

参数说明
src输入图像
dst输出与src相同大小和相同通道数的图像。
ddepth表示输出图像深度,针对不同的输入图像,输出目标图像有不同的深度。(一般源图像都为CV_8U,为了避免溢出,一般ddepth参数选择CV_32F)
dx表示x方向上的差分阶数,1或0 。
dy表示y 方向上的差分阶数,1或0 。
scale表示缩放导数的比例常数,默认情况下没有伸缩系数。
delta表示一个可选的增量,将会加到最终的dst中,同样,默认情况下没有额外的值加到dst中。
borderType表示判断图像边界的模式。这个参数默认值为cv2.BORDER_DEFAULT。

代码如下,

import cv2
import numpy as np
# 获取照片路径
path="cjavapy.jpg"
# 读取照片
img=cv2.imread(path,0)
# 显示照片
# cv2.imshow('image',img)
# 缩放
img1=cv2.resize(img,None,fx=0.4,fy=0.4)
# cv2.imshow('img1', img1)
new_img=cv2.Laplacian(img1,cv2.CV_64F)
new_img=cv2.convertScaleAbs(new_img)
imgs=np.hstack([img1,new_img])
cv2.imshow('multi pic',imgs)
cv2.waitKey()

3、Laplacian算子
Laplacian 算子 (拉普拉斯算子)是一种二阶导数算子,其具有旋转不变性,可以满足不同方向的图像边缘锐化(边缘检测)。

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

参数如下,

参数说明
src表示输入需要处理的图像。
ddepth表示输出图像深度,针对不同的输入图像,输出目标图像有不同的深度。(一般源图像都为CV_8U,为了避免溢出,一般ddepth参数选择CV_32F)
dst表示输出与src相同大小和相同通道数的图像。
ksize表示用于计算二阶导数滤波器的孔径大小,大小必须是正数和奇数。
scale表示计算拉普拉斯算子值的比例因子,默认情况下没有伸缩系数。
delta表示一个可选的增量,将会加到最终的dst中,同样,默认情况下没有额外的值加到dst中。
borderType表示判断图像边界的模式。这个参数默认值为cv2.BORDER_DEFAULT。

代码如下,

import cv2
import numpy as np
# 获取照片路径
path=r"cjavapy.jpg"
# 读取照片
img=cv2.imread(path,0)
# 显示照片
# cv2.imshow('image',img)
# 缩放
img1=cv2.resize(img,None,fx=0.4,fy=0.4)
# cv2.imshow('img1', img1)
new_img=cv2.Laplacian(img1,cv2.CV_64F)
new_img=cv2.convertScaleAbs(new_img)
imgs=np.hstack([img1,new_img])
cv2.imshow('multi pic',imgs)
cv2.waitKey()

了解更多分析及数据抓取可查看:
http://data.yisurvey.com:8989/
特别说明:本文旨在技术交流,请勿将涉及的技术用于非法用途,否则一切后果自负。如果您觉得我们侵犯了您的合法权益,请联系我们予以处理。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值