基于Python的OpenCV基础入门——图像滤波去噪
- 图像滤波去噪
- 均值滤波
- 中值滤波
- 高斯滤波
- 双边滤波
- 方框滤波
- 图像滤波去噪代码实现及其效果图
图像滤波去噪
图像滤波去噪是一种图像处理方法,它通过应用滤波器来减少或消除图像中的噪声。噪声是图像中不希望的、无用的、干扰视觉感知的非图像信号。图像可以通过各种因素引入噪声,例如摄像机传感器,图像传输过程中的干扰,或者是图像采集设备的本身限制。
滤波器是一种数学运算,可以对图像的各个像素进行处理,以实现去噪的目的。滤波器通过在图像中移动一个小窗口,对窗口内的像素进行加权平均或其他数学操作。这样可以消除或减少噪声的影响,使图像更清晰、更易于观察。
图像滤波去噪的作用包括:提高图像质量,改善视觉感知,加强图像分析
均值滤波
均值滤波是一种图像平滑处理方法,它通过计算像素点周围邻域内像素值的平均值来替代该像素的值。均值滤波的原理是利用邻域内像素值的平均值来消除图像中的噪声,从而使图像变得更加平滑。
image = cv2.blur(src, kernal_size)
参数:
src:被处理的图像。
kernal_size:滤波核大小,其格式为(高度,宽度),建议使用如(3,3)、(5, 5)、(7, 7)等宽、高相等的奇数边长。滤波核越大,处理之后的图像就越模糊。
返回值说明:
image:经过均值滤波处理之后的图像。
中值滤波
中值滤波是一种非线性图像滤波方法,它通过对像素点周围邻域内的像素值进行排序,然后取排序后的中值作为该像素的值。中值滤波的原理是利用邻域内像素值的中值来替代该像素的值,从而有效地去除图像中的椒盐噪声和其他类型的噪声。
image = cv2.medianBlur(src, ksize)
参数:
src:被处理的图像。
ksize:滤波核的边长,必须是大于1的奇数,如3、5、7等。该方法根据此边长自动创建一个正方形的滤波核。
高斯滤波
高斯滤波是一种线性图像滤波方法,它通过对像素点周围邻域内的像素值进行加权平均来替代该像素的值。高斯滤波的原理是利用高斯函数来对邻域内的像素值进行加权,使得离中心像素更近的像素具有更大的权重,从而使图像变得更加平滑。
image = cv2.GaussianBlur(src, ksize, sigmaX, sigmaY)
参数:
src:被处理的图像。
ksize:滤波核的大小,宽高必须是奇数,如(3,3)、(5,5)等。
sigmaX:卷积核水平方向的标准差。
sigmaY:卷积核垂直方向的标准差。
修改sigmaX或sigmaY的值都可以改变卷积核中的权重比例。如果不知道如何设计这2个参数值,就直接把这2个参数的值写成0,该方法就会根据滤波核的大小自动计算合适的权重比例。
双边滤波
双边滤波是一种非线性图像滤波方法,它通过同时考虑空间相似性和灰度相似性来对像素点周围邻域内的像素值进行加权平均。双边滤波的原理是利用高斯函数来对空间相似性和灰度相似性进行加权,从而保持边缘的清晰度,并且在去除噪声的同时保持图像的细节。
image = cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace)
参数:
src:被处理的图像。
d:以当前像素为中心的整个滤波区域的直径。如果d<0,则自动根据sigmaSpace参数计算得到。该值与保留的边缘信息数量成正比,与方法运行效率成反比。
sigmaColor:参与计算的颜色范围,这个值是像素颜色值与周围颜色值的最大差值,只有颜色值之差小于这个值时,周围的像素才进行滤波计算。值为255时,表示所有颜色都参与计算。
sigmaSpace:坐标空间的σ(sigma)值,该值越大,参与计算的像素数量就越多。
方框滤波
方框滤波是一种线性图像滤波方法,它通过对像素点周围邻域内像素值的均值进行加权平均来替代该像素的值。方框滤波的原理是利用方框函数来对邻域内的像素值进行加权,使得离中心像素更近的像素具有更大的权重,从而使图像变得更加平滑。
image = cv2.boxFilter(src, type, kernal, normalize)
参数:
src:待处理的图像。
type:当指定为-1时,需要进行自动计算,得到的结果的颜色通道要和原图像的颜色通道一致。
kernal: 卷积核, 如(3,3)、(5,5)等。
normalize:是否进行归一化。
当指定为True的时方框滤波与均值滤波的作用相同
当指定为False 将所有像素相加可能会产生越界的现象
图像滤波去噪代码实现及其效果图
使用matplotlib合并显示图像经过含有噪点图像,经过均值滤波、中值滤波、高斯滤波、双边滤波、方框滤波normalize参数为1、方框滤波normalize参数为0时处理后的结果,进行对比展示:
import cv2 #导入OpenCV模块
import matplotlib.pyplot as plt # 导入matplotlib库 image = cv2.imread("ex\img\zao.jpg") # 导入图片 mean_img = cv2.blur(image, (3, 3)) # 均值滤波 后面的卷积核大小可以自己定义,如(3, 3)
medianBlur_img = cv2.medianBlur(image, 3) # 中值滤波
GaussianBlur_img = cv2.GaussianBlur(image, (3,3), 0) # 高斯滤波 第一个参数:原图像;第二个参数:卷积核大小;第三个参数:X方向上的高斯核标准偏差。
bilateralFilter_img =cv2.bilateralFilter(image, 50, 100, 100) # 双边滤波
box_img_T = cv2.boxFilter(image, -1, (3, 3), normalize=True) # 方框滤波 使用normalize
box_img_F = cv2.boxFilter(image, -1, (3, 3), normalize=False) # 方框滤波 不使用normalize titles = ["mean", "median", "Gaussian", "bilateral", "boxnormalizeTrue", "boxnormalizeFalse"]
images = [mean_img, medianBlur_img, GaussianBlur_img, bilateralFilter_img, box_img_T, box_img_F]
for i in range(6): plt.subplot(2, 3, i + 1), plt.imshow(images[i], "gray") plt.title(titles[i])
plt.show()
效果图: