文章目录
5. 双边滤波器 cv2.bilateralFilter()
1. 滤波器
1.1 什么是滤波器?
滤波器是对图像做平滑处理 的一种常用工具。
平滑处理即在尽可能地保留原图像信息的情况下,对像素值进行微调,使邻近的像素值之间,值的大小趋于“平滑”,以去除图像内的噪声、降低细节层次信息等的一系列的操作过程。本篇blog将为大家展示OpenCV中的均值滤波器 、中值滤波器 、高斯滤波器 和 双边滤波器。
滤波器的算法逻辑为,指定一个滤波核的大小(该大小表示参与计算的像素数据的范围),以图像中的每一个像素都作为波的核心,通过该范围内的数据,以一定的计算方式进行计算,将计算结果该值赋值给该像素。
1.2 关于滤波核
以大小为n×n的滤波核为例,对于每一个像素数据,我们可以在数组中得到以一个像素为中心的n×n的矩阵,此即参与计算的数据的范围(边界)。这样的矩阵结构即被称为滤波核。
1.3 素材选择
使用图像《龙门石窟》(longmen.jpg) shape:(350, 600, 3)
2.均值滤波器 cv2.blur()
2.1 语法简介
均值滤波器,也称低通滤波器
顾名思义,均值滤波器即对滤波核内的数据求均值,然后将这个值赋值给矩阵核心位置。
均值滤波器可以使用cv2.blur() 方法实现
cv2.blur()的语法:
dst = blur(src, ksize, dst=None, anchor=None, borderType=None)
其中
scr 即图像
ksize 滤波核大小。使用一个元组表示,形如(a, b),a表示height(高度),b表示width(宽度)。
anchor 波核锚点
borderType 边界类型
下边以3×3,5×5,10×10三种滤波核为例,分别展示图像经过均值滤波器处理后的效果。
2.2 代码示例
2.2.1 3×3 滤波核为例
import cv2 img = cv2.imread("longmen.jpg") dst1 = cv2.blur(img, (3, 3)) cv2.imshow("3*3", dst1) cv2.waitKey() cv2.destroyAllWindows()
滤波效果如下:
2.2.2 5×5 滤波核为例
import cv2 img = cv2.imread("longmen.jpg") dst2 = cv2.blur(img, (5, 5)) cv2.imshow("5*5", dst2) cv2.waitKey() cv2.destroyAllWindows()
滤波效果如下:
2.2.3 10×10滤波核为例
import cv2 img = cv2.imread("longmen.jpg") dst3 = cv2.blur(img, (10, 10)) cv2.imshow("10*10", dst3) cv2.waitKey() cv2.destroyAllWindows()
可以看出,滤波核大小越大,图像越趋于模糊。
3. 中值滤波器 cv2.medianBlur()
中值滤波器,即对滤波核内所有数据排序,将中间值赋值给滤波核核心位置的数字。
medianBlur(src, ksize, dst=None)
其中 ksize必须是奇数,是偶数的话会发生报错。
不同于均值滤波器的方法,cv2.blur(),cv2.blur()的ksize参数是一个元组,而cv2.blur()的ksize参数是一个数值。
代码示例
import cv2 img = cv2.imread("longmen.jpg") dst1 = cv2.medianBlur(img, 3) cv2.imshow("3*3", dst1) cv2.waitKey() cv2.destroyAllWindows()
滤波后效果如下: