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()