空间滤波
滤波即一幅图像通过滤波器得到另一幅图像;其中滤波器又称为卷积核,滤波的过程成为卷积;
- 给定一个卷积核
w
w
w 对图像逐一扫描,扫描的部分要进行一一点乘
g ( x , y ) = ∑ s = − a a ∑ s = − b b w ( s , t ) f ( x + s , y + t ) g(x,y)=\sum_{s=-a}^{a}\sum_{s=-b}^{b}w(s,t)f(x+s,y+t) g(x,y)=s=−a∑as=−b∑bw(s,t)f(x+s,y+t)
低通滤波
自定义卷积核
cv2.filter2D(src,ddepth,kernel,anchor,delta,borderType)
- 代码功能:允许用户自定义卷积核实现卷积操作
- 参数说明:
- src: 表示需要处理的图像,即原始图像。它能够有任意数量的通道,并能对各个通道独立处理
- ddepth: 表示处理结果图像的深度,一般使用 − 1 -1 −1 表示与原始图像使用相同的图像深度
- kernel: 表示卷积核,是一个单通道的数组。若处理彩色图像,每个通道使用不同的核,则必须将彩色图像分解后使用不同的核完成操作
- anchor: 表示锚点,其默认值是 ( − 1 , − 1 ) (-1,-1) (−1,−1),表示当前计算均值的点位于和的中心点位置。该值使用默认值即可,在特殊情况下可以指定不同的点做为锚点
- delta: 表示修正值,是可选项。如果该值存在,会在基础滤波的结果上加上该值作为最终的滤波处理结果
- borderType: 表示边界样式,该值决定了以何种情况处理边界,通常使用默认值即可
- 代码实例:
import cv2 import numpy as np # 加载图片 img = cv2.imread('./img/fdu.jpg') # 自定义卷积核 kernel = np.ones((5,5),np.float32) / 25 # 输出经过滤波处理的图像并展示 dst = cv2.filter2D(img, -1, kernel) cv2.imshow('dst',dst) cv2.imshow('img',img) key = cv2.waitKey(0) if key & 0xFF == ord('q'): cv2.destroyAllWindows()
方盒滤波与均值滤波
cv2.boxFilter(src,ddepth,ksize,anchor,normalize,borderType)
- 代码功能:实现对图像的方盒滤波处理;
- 参数说明:
- src: 表示需要处理的图像,即原始图像。它能够有任意数量的通道,并能对各个通道独立处理
- ddepth: 表示处理结果图像的深度,一般使用 − 1 -1 −1 表示与原始图像使用相同的图像深度
- kernel: 表示卷积核,是一个单通道的数组。若处理彩色图像,每个通道使用不同的核,则必须将彩色图像分解后使用不同的核完成操作
- anchor: 表示锚点,其默认值是 ( − 1 , − 1 ) (-1,-1) (−1,−1),表示当前计算均值的点位于和的中心点位置。该值使用默认值即可,在特殊情况下可以指定不同的点做为锚点
- normalize: 取值为 0 0 0 或者 1 1 1,去 0 0 0的时候采用的是对邻域点求和,反之求平均
- borderType: 表示边界样式,该值决定了以何种情况处理边界,通常使用默认值即可
- 代码实例:
import cv2 import numpy as np # 加载图片 img = cv2.imread('./img/fdu.jpg') # 经过方盒滤波后的图像(normalize=0表示对邻域值求和,normalize=1表示对邻域求平均) dst = cv2.boxFilter(img,-1,(2,2),normalize=0) # 展示图片 cv2.imshow('img',img) cv2.imshow('dst',dst) key = cv2.waitKey(0) if key & 0xFF == ord('q'): cv2.destroyAllWindows()
cv2.blur(src,ksize,anchor,borderType)
- 代码功能:实现图像的均值滤波操作
- 参数说明:
- src: 表示需要处理的图像,即原始图像。它能够有任意数量的通道,并能对各个通道独立处理
- ddepth: 表示处理结果图像的深度,一般使用 − 1 -1 −1 表示与原始图像使用相同的图像深度
- kernel: 表示卷积核,是一个单通道的数组。若处理彩色图像,每个通道使用不同的核,则必须将彩色图像分解后使用不同的核完成操作
- anchor: 表示锚点,其默认值是 ( − 1 , − 1 ) (-1,-1) (−1,−1),表示当前计算均值的点位于和的中心点位置。该值使用默认值即可,在特殊情况下可以指定不同的点做为锚点
- borderType: 表示边界样式,该值决定了以何种情况处理边界,通常使用默认值即可
- 代码实例:
import cv2 import numpy as np # 读取图片 img = cv2.imread('./img/fdu.jpg') # 输出经过均值滤波的图片 dst = cv2.blur(img,(5,5)) # 展示图片 cv2.imshow('img',img) cv2.imshow('dst',dst) key = cv2.waitKey(0) if key & 0xFF == ord('q'): cv2.destroyAllWindows()
高斯滤波与中值滤波
cv2.GaussianBlur(img,ksize,sigmaX,sigmaY)
- 代码功能:对邻域内的像素点进行加权平均 (设置权重的依据-将中心点的权重加大,远离中心点的权重值减小)
- 参数说明:
- img: 表示需要处理的图像
- ksize: 表示滤波核的大小。卷积核大小指的是在滤波处理过程中其相邻图像的高度和宽度 (注意卷积核的尺寸值必须是奇数)
- sigmaX: 表示卷积核在水平方向上的标准差,用来控制权重比例
- sigmaY: 表示卷积核在垂直方向上的标准差,若将该值设置为0,则只采用sigmaX的值;若sigmaX和sigmaY都是0,则计算方式如下
- s i g m a X = 0.3 × [ ( k s i z e . w i d t h − 1 ) × 0.5 − 1 ] + 0.8 sigmaX=0.3×[(ksize.width-1)×0.5-1]+0.8 sigmaX=0.3×[(ksize.width−1)×0.5−1]+0.8
- s i g m a Y = 0.3 × [ ( k s i z e . h e i g h t − 1 ) × 0.5 − 1 ] + 0.8 sigmaY=0.3×[(ksize.height-1)×0.5-1]+0.8 sigmaY=0.3×[(ksize.height−1)×0.5−1]+0.8
- 代码实例:
import cv2 import numpy as np # 加载图片 img = cv2.imread('./img/xdu.jpg') # 实现图像的高斯滤波(典型的应用-模糊化噪声点) new_img = cv2.GaussianBlur(img,(5,5),sigmaX=0,sigmaY=0) # 展示图片 cv2.imshow('img',img) cv2.imshow('new_img',new_img) key = cv2.waitKey(0) if key & 0xFF == ord('q'): cv2.destroyAllWindows()
cv2.medianBlur(img,ksize)
- 代码功能:用邻域内所有像素值的中间值来替代当前像素点的像素值
- 参数说明:
- img: 表示需要处理的图像
- ksize: 表示滤波核的大小。卷积核大小指的是在滤波处理过程中其相邻图像的高度和宽度 (注意卷积核的尺寸值必须是比1大的奇数)
- 代码实例:
import cv2 import numpy as np # 加载图片 img = cv2.imread('./img/xdu.jpg') # 实现中值滤波(典型的应用-模糊化椒盐噪声点) new_img = cv2.medianBlur(img,5) # 展示图片 cv2.imshow('img',img) cv2.imshow('new_img',new_img) key = cv2.waitKey(0) if key & 0xFF == ord('q'): cv2.destroyAllWindows()
双边滤波
cv2.bilateralFilter(src,d,sigmaColor,sigmaSpace,borderType)
-
代码功能:综合考虑信息和色彩信息,有效保护图像内的边缘信息 (典型应用-图像美颜)
-
参数说明:
- src: 表示需要处理的图像,即原始图像。它能够有任意数量的通道,并能对各个通道独立处理
- d: 表示当前像素点为中心点的直径;若该值为非正数,则会自动从参数 sigmaSpace计算得到
- sigmaColor: 滤波处理时选取的颜色差值范围,该值决定了那些像素点能够参与到滤波来。与当前像素点的像素值差值小于 sigmaColor 的像素点,能够参与到当前的
滤波中。该值越大,就说明周围有越多的像素点可以参与到运算中。该值为 0 时,滤波失去意义;该值为 255 时,指定直径内的所有点都能够参与运算。 - sigmaSpace: 表示坐标空间中的 sigma 值。它的值越大,说明有越多的点能够参与到滤波计算中来。当 d>0 时,无论 sigmaSpace 的值如何,d 都指定邻域大小;否则,d 与 sigmaSpace
的值成比例。 - borderType: 表示边界样式,该值决定了以何种情况处理边界,通常使用默认值即可
-
代码实例:
import cv2 import numpy as np # 加载图片 img = cv2.imread('./img/Lena.jpg') # 实现双边滤波(典型的应用-图像美颜) new_img = cv2.bilateralFilter(img,25,100,100) # 展示图片 cv2.imshow('img',img) cv2.imshow('new_img',new_img) key = cv2.waitKey(0) if key & 0xFF == ord('q'): cv2.destroyAllWindows()
实验效果