机器视觉:第四讲--OpenCV图像滤波器
机器视觉:第四讲–OpenCV图像滤波器
第一讲 开发环境搭建
第二讲 OpenCV基础操作
第二讲 图像色彩
第四讲:计算机视觉的快速发展使图像处理成为核心技能,本文就基础运算原理和OpenCV对于滤波器相关操作进行讲解,为后续更复杂的图像处理算法学习打下坚实基础。
如有错误,恳请指教
文章目录
默认载入,以下默认pic1,pic2为同规格照片
import cv2
import numpy as np
一、基础运算
图片可理解为一个或多个二维数组组成,例如XY的二维数组可表示为XY规模的黑白照片。3个XY的数组可表示RGB图片,每个XY数组表示各颜色通道的映射域。
1. 加减乘除
OpenCV对于图片的加减乘除要求图片长宽相同,通道数相同。(图片尺寸修改见下文)
#假定pic1和pic2同规格
#图片对应位置相加
new_img = cv2.add(pic1, pic2)
#图片对应位置相减
new_img = cv2.subtract(pic1, pic2)
#图片对应位置相乘
new_img = cv2.multiply(pic1, pic2)
#图片对应位置相除
new_img = cv2.divide(pic1, pic2)
openCV加减乘除函数输出值,超过0-255的截断取模
2. 图片融合
OpenCV对于图片的融合不是简单的将图片对应位置做加法,而是用图片进行线性运算,作加权运算
new_img = img1 * w1 + img2 * w2 +bias
#addWeighted(scr1,alpha,src2,beta,gamma)
new_img = cv2.addWeighted(pic1, 0.2, pic2, 0.8, 30)
3. 逻辑运算
3.1 与操作
将图片数值转化为二进制之后与操作
图片数值一般不变或减小
pic12_and = cv2.bitwise_and(pic1, pic2)
将图片转为二进制后,1&1变.1,其他情况均为0
例如:
示例1
15&15
0000 1111 & 0000 1111
按位操作后0000 1111
输出为15
示例2
175&204
1010 1111 & 1100 1100
与操作后1000 1100
输出140
3.2 或操作
数值转化为二进制之后或操作
图片数值一般不变或变大
pic12_or = cv2.bitwise_or(pic1, pic2)
将图片转为二进制后,0|0变0,其他情况均为1
例如:
示例1
15&15
0000 1111 & 0000 1111
按位操作后0000 1111
输出为15
示例2
175&204
1010 1111 & 1100 1100
与操作后1110 1111
输出239
3.3 非操作
pic1_not = cv2.bitwise_not(pic1)
相当于 255-图片数值,
将图片转为二进制后,1变.0,0变1
示例1
15
0000 1111
按位操作后1111 0000
输出为245
3.4 异或操作
pic12_xor = cv2.bitwise_xor(pic1, pic2)
将图片转为二进制后,11/00变.0,01/10变1
示例1
175 xor 204
1010 1111 xor 1100 1100
按位操作后0110 0011
输出为99
4. 图片尺寸修改
4.1 直接裁剪
#假定cat1更大,从cat1里切出cat2的形状
new_cat1 = cat1[0:cat2.shape[0], :cat2.shape[1]]
4.2 图片缩放函数
#resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])
参数说明:
dsize表示缩放后的图片大小,采用元组或列表表示
dst可选参数,缩放后的输出图片
interpolation为插值算法,主要采用:
INTER_NEAREST 邻近插值,速度快,效果差
INTER_LINEAR 双线性插值,使用原图的四个点进行插值,默认
INTER_CUBIC 三次插值,原图的16个点
INTER_AREA 区域插值,效果最好,计算时间最长
#将cat1和cat2转变为800*800规格的图片存储在pic1和pic2
pic1 = cv2.resize(cat1, (800, 800), cv2.INTER_AREA)
pic2 = cv2.resize(cat2, (800, 800), cv2.INTER_AREA)
#照片长宽缩放为原来一半
new_cat3 = cv2.resize(cat2, dsize=None, fx=0.5, fy=0.5, interpolation = cv2.INTER_AREA)
二、OpenCV滤波器
在图像领域,可简单将滤波器理解为用于图片降噪使用
2.1 卷积操作
特定矩阵和图片数据相乘,不同卷积核对图片有不同效果
函数原型如下:
filter2D(src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]])
具体参数示意:
ddepth:卷积之后图片的位深,即卷积之后图片单独数据类型,一般为1,表示和原图类型一致
kernel:卷积核大小,用元组或ndarray表示,要求数据类型必须是float型
anchor:锚点。即卷积核单独中心点。是可选参数,默认是(-1, -1)
delta:可选参数,表示卷积后额外添加的值,相当于线性方程中的偏差,默认是0
borderType:边界类型,一般不设
#3*3 的平均滤波器
kernel = np.ones((3, 3), np.float32)/9
#锐化
kernel = np.array([[0, -1, 0],[-1, 5, -1],[0, -1, 0]])
#不同的卷积核有不同的效果, 突出轮廓
kernel = np.array([[-1, -1, -1],[-1, 8, -1],[-1, -1, -1]])
dst = cv2.filter2D(cat1, -1, kernel)
2.2 方盒&均值滤波
方盒滤波,函数原型如下:
boxFilter(src, ddepth, ksize[, dst[, anchor[, normalize[, borderType]]]])
均值滤波,没有位深参数
blur(src, ksize[, dst[, anchor[, borderType]]])
这两个滤波无需手动创建卷积核,只需告诉方盒滤波,卷积核的大小是多少
import cv2
import numpy as np
cat1 = cv2.imread('.././data/pic/animal/cat2.jpeg')
#无需手动创建卷积核,只需告诉方盒滤波,卷积核的大小是多少
dst = cv2.boxFilter(cat1, -1, (7, 7), normalize=True)
dst = cv2.blur(cat1, (5, 5))
cv2.imshow('new_cat1', np.hstack((cat1, dst)))
cv2.waitKey(0)
cv2.destroyAllWindows()
2.3 高斯滤波
卷积核为符合高斯分布的卷积核,同时需确保九个点加起来为1(归一化,高斯函数可参考高等数学)
该滤波器对高斯噪声有很好的表现
函数原型如下:
GaussianBlur(src, ksize, sigmaX[, dst[, sigmaY[, borderType[, hint]]]])
ksize高斯核的大小
sigmaX,X轴的标准差,sigma越大,平滑效果越强
sigmaY,Y轴的标准差,默认为0,此时sigmaY=sigmaX
若没有指定sigma值,分别从ksize的宽度和高度中计算sigma,
dst = cv2.GaussianBlur(cat1, (5, 5), sigmaX=1)
2.4 中值滤波
主要针对椒盐噪声,也叫胡椒噪声效果比较明显
函数原型如下:
medianBlur(src, ksize[, dst])
ksize中值滤波的大小
dst = cv2.medianBlur(cat1, 3)
2.5 双边滤波
在去噪的同时保留图片细节
在卷积操作时加入了对灰度值的权重,即在领域内灰度值越接近中心灰度值的点权重越高
两者权重系数相乘,得到最终的卷积模板,运算速度慢,且计算量增长速度为卷积核大小的平方
函数原型如下:
bilateralFilter(src, d, sigmaColor, sigmaSpace[, dst[, borderType]])
sigmaColor 计算像素信息使用的sigma
sigmaSpace 计算空间信息使用的sigma
import cv2
import numpy as np
people = cv2.imread('.././data/pic/people/people1.jpg')
dst = cv2.bilateralFilter(people, 7, 30, 60)
dst1 = cv2.bilateralFilter(dst, 7, 30, 60)
cv2.namedWindow("new_cat1", cv2.WINDOW_NORMAL)
cv2.imshow('new_cat1', np.hstack((people, dst1)))
cv2.waitKey(0)
cv2.destroyAllWindows()
总结
本文介绍了OpenCV图像处理中的基础运算和常用滤波方法,详细讲解了各方法的函数原型、参数说明和实际应用场景,为图像处理学习者提供了实用的技术参考和代码示例,这些基础操作是更复杂图像处理任务的重要前提。
更多推荐



所有评论(0)