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