1 噪声
噪声指的是图像中的一些干扰因素,通常由于图像的采集设备或传输过程中导致的,表现为图像中部分像素点出现随机亮度,也可以理解为一些像素点与周围的像素点格格不入。
常见噪声分为两类:
高斯噪声:是一种符合正态分布的噪声,会使图像变得有明暗不均的噪点,如果是彩图可能还会出现颜色的分布不均。
椒盐噪声:是一些黑色像素值分布在原图像中,可以把椒盐噪声理解为斑点,随机出现在画面中。
2 滤波器
滤波器:实际上就是之前的卷积核,与自适应二值化中的核一样,本身是一个小区域,有这特定的核值,并且工作原理也实在原图上从左向右、从上到下进行滑动计算。
滤波器可以分为两类:
线性滤波:对卷积核中的邻域像素进行线性计算,例如计算求和等,常见的线性滤波器有均值滤波、高斯滤波等。
非线性滤波:利用原始图像与模板之间的一种逻辑关系得到结果,常见的非线性滤波器有中值滤波、双边滤波等。
2.1 均值滤波
均值滤波是一种最简单的滤波器,它直接计算卷积核区域内元素的平均值。例如3x3的卷积核:

原始图像:1.jpg (高斯噪声图像)

import cv2
if __name__ == '__main__':
# 1.图片输入
image_np = cv2.imread("1.jpg") # cv2.imread(): OpenCV的图像读取函数
# 2.滤波算法
no_noise_image = cv2.blur( # cv.blur(): OpenCV的均值滤波函数,用于模糊图像/降噪
image_np, # 原图
(5, 5) # 核
)
"""
均值滤波原理:用一个小窗口(核)在图像上滑动,用窗口内所有像素的平均值代替中心像素
(5, 5): 核的大小,这里表示使用5×5的窗口进行计算
核大小越大,模糊效果越明显,但计算量也越大
"""
# 3. 图片输出
cv2.imshow('no_noise_image', no_noise_image)
cv2.waitKey(0)
cv2.imwrite('junzhi.png', no_noise_image)
cv2.destroyAllWindows() # 关闭所有由OpenCV创建的窗口,释放资源
均值滤波修改后的图像:junzhi.png

2.2 方框滤波
方框滤波与均值滤波非常像。如3x3的滤波核如下:

参数与均值滤波有相同的也有不同的,只讲解不同的(后文同),新参数:
ddepth 输出图像的深度
-1表示使用原图的深度,即每个像素点占用的位数,最常用的位数是cv2.CV_8U,即8位无符号整数:0-255
normalize 控制a的数值
当此参数为True时,方框滤波就是均值滤波;
当此参数为False时,a=1,相当于在区域内求像素和。
原始图片:2.jpg (暗) 方框滤波在消除噪声的同时会提高图片的亮度

import cv2
if __name__ == '__main__':
# 1. 图片输入
image_np = cv2.imread('2.jpg')
# 2. 滤波算法
# 方框滤波
no_noise_image = cv2.boxFilter(
image_np, # 原图
-1, # 位深度
(3, 3), # 核
normalize=False # 标准化参数
)
# 3. 图片输出
cv2.imshow('no_noise_image', no_noise_image)
cv2.waitKey(0)
cv2.imwrite('fangkuang.png', no_noise_image)
代码运行后:fangkuang.png
2.3 高斯滤波
高斯滤波的核权重计算与自适应二值化的《高斯加权求和》过程完全相同。
当时以3x3为例,计算出核为:

原始图片同上:1.jpg
import cv2
import numpy as np
if __name__ == '__main__':
# 1. 图片输入
image_np = cv2.imread('1.jpg')
# 2. 滤波算法
# 高斯滤波
no_noise_image = cv2.GaussianBlur(
image_np, # 原图
(5, 5), # 核大小
1 # SigmaX与中心像素的权重成反比
)
"""
cv2.GaussianBlur(): OpenCV的高斯滤波函数
高斯滤波原理: 使用高斯函数计算权重,对图像进行加权平均模糊
与均值滤波不同,高斯滤波给中心像素附近的像素分配更高的权重
权重分布遵循高斯分布(钟形曲线),中心权重最高,向外逐渐减小
参数详解:
image_np: 输入图像
(5, 5): 核大小,必须是正奇数,如(3,3)、(5,5)等
1: SigmaX,高斯核在X方向的标准差
注意:如果只指定SigmaX,SigmaY会自动设为与SigmaX相同
"""
# 3. 图片输出
cv2.imshow('no_noise_image', no_noise_image)
cv2.waitKey(0)
cv2.imwrite("gaosi.png", no_noise_image)
"""
高斯滤波的特点与优势
高斯滤波是一种非常常用的线性滤波器,具有以下特点:
平滑效果好: 能有效去除高斯噪声
保留边缘: 相比均值滤波,能更好地保留图像边缘
可调节性: 通过调整核大小和Sigma值可以控制模糊程度
各向同性: 在各个方向上具有相同的平滑效果
参数详解与调节
核大小 (ksize):
必须是正奇数,如(3,3)、(5,5)、(7,7)等
值越大,模糊效果越明显,但计算量也越大
如果设为(0,0),OpenCV会根据Sigma值自动计算核大小
SigmaX:
高斯核在X方向的标准差
值越大,高斯分布越平坦,模糊效果越明显
如果设为0,OpenCV会根据核大小自动计算Sigma值
SigmaY:
高斯核在Y方向的标准差
如果设为0,则与SigmaX相同
如果SigmaX和SigmaY都为0,则根据核大小自动计算
"""
运行后图片效果:gaosi.png

2.4 中值滤波
中值就是中位数,是核中对应的像素排序后的中间值,因此核本身没有数值,也不需要新增的参数。需要注意的是,默认的边界填充算法是边界复制。
原始图像:3.jpg (椒盐噪声)

import cv2
if __name__ == '__main__':
# 1. 图片输入
image_np = cv2.imread('3.jpg') # 读取名为'123.jpg'的图片,并将其存储在变量image_np中
# 2. 滤波算法
# 中值滤波
no_noise_image = cv2.medianBlur( # 调用中值滤波函数
image_np, # 输入的原图像
3 # 滤波核的大小,这里是3x3的窗口
)
# 3. 图片输出
cv2.imshow('no_noise_image', no_noise_image) # 创建一个窗口显示处理后的图像
cv2.waitKey(0) # 等待用户按下任意键继续
cv2.imwrite('zhongzhi.png', no_noise_image)
"""
中值滤波是一种非线性数字滤波技术,
常用于去除图像中的"椒盐噪声"(随机出现的黑白点),
同时能较好地保留图像边缘信息。
中值滤波步骤:
定义滑动窗口:选择一个窗口(通常是奇数大小的正方形,如3×3、5×5)
遍历图像像素:将窗口中心对准图像的每一个像素
收集邻域值:获取窗口覆盖范围内的所有像素值
排序并取中值:将这些像素值按大小排序,取中间值
替换中心像素:用这个中值替换窗口中心的原始像素值
"""
代码运行:zhongzhi.png

2.5 双边滤波
前面的滤波器都丢失了一些图像信息,使图像边缘变得更加难以处理,边缘是图像处理中非常重要的特征,因此可以使用双边滤波保留更多的边缘信息。
原始图片同上:3.jpg
import cv2
import numpy as np
if __name__ == '__main__':
# 1. 图片输入
image_np = cv2.imread('3.jpg')
# 2. 滤波算法
# 双边滤波
no_noise_image = cv2.bilateralFilter(
image_np, # 原图
9, # 核,直径d
80, # SigmaColor
80 # sigmaSpace
)
"""
cv2.bilateralFilter(): OpenCV的双边滤波函数
双边滤波原理: 与简单均值滤波不同,双边滤波是一种非线性滤波器,它同时考虑空间距离和像素值相似性
空间距离: 靠近中心像素的像素有更大权重
像素值相似性: 与中心像素值相似的像素有更大权重
参数详解:
image_np: 输入图像
9: 滤波器的直径d,表示每个像素邻域的直径
80: SigmaColor,颜色空间的标准差,控制颜色相似性判断
80: SigmaSpace,坐标空间的标准差,控制空间距离判断
"""
# 3. 图片输出
cv2.imshow('no_noise_image', no_noise_image)
cv2.waitKey(0)
cv2.imwrite("shuangbian.png", no_noise_image)
运行后图片:shuangbian.png

图像噪点消除技术详解

547

被折叠的 条评论
为什么被折叠?



