基础图像处理 - 实战01

使用方框滤波与添加噪声

1. 方框滤波(Box Filter)

  方框滤波是一种简单而有效的线性滤波技术,广泛应用于图像去噪和平滑处理。它通过计算图像中每个像素邻域内像素值的平均值,将中心像素替换为该平均值,从而实现图像的平滑效果。这种方法的核心在于利用局部邻域内的像素信息来减少噪声的影响,同时保持图像的整体结构。

1.1 工作原理

  方框滤波使用一个矩形窗口(通常是一个正方形)滑动遍历图像的每个像素。对于每个像素,滤波器计算窗口内所有像素值的平均值,并将该平均值赋给中心像素。这种方法简单高效,但可能会导致图像边缘模糊,因为边缘信息在平滑过程中可能会被削弱。

1.2 应用场景

  • 图像去噪:方框滤波可以有效去除随机噪声,如椒盐噪声或高斯噪声。
  • 图像平滑:通过平滑图像,减少细节,便于后续处理。
  • 预处理:在计算机视觉任务中,方框滤波常用于图像的预处理阶段,以增强图像质量。

2. 校验噪声(Noise Validation)

  校验噪声是指对图像中的噪声进行分析和验证的过程。噪声验证的目的是检测图像中是否存在噪声,以及噪声的类型和强度。通过校验噪声,可以更好地选择合适的去噪算法,从而提高图像处理的效果。

2.1 噪声类型

  常见的噪声类型包括:

  • 椒盐噪声:由随机分布的白色和黑色像素组成,通常由图像采集设备的故障引起。
  • 高斯噪声:服从高斯分布的噪声,通常由传感器的热噪声引起。
  • 周期性噪声:具有规律性的噪声,通常由外部干扰源引起。

2.2 校验方法

  • 统计分析:通过计算图像的均值、方差等统计量,判断是否存在噪声。
  • 频域分析:通过傅里叶变换将图像从空间域转换到频域,分析频谱特征。
  • 视觉检查:通过观察图像的细节,判断是否存在明显的噪声点。

2.3 应用场景

  • 图像质量评估:在图像采集和传输过程中,校验噪声可以评估图像质量。
  • 去噪算法选择:根据噪声类型和强度,选择合适的去噪算法。
  • 图像增强:通过校验噪声,优化图像增强算法的参数。

3. 示例代码

3.1 添加椒盐噪声

  以下是一个使用 Python 和 OpenCV 实现方框滤波中添加椒盐噪声的示例代码:

# 添加椒盐噪声并对比图像
import numpy as np
import random
import cv2 as cv

def add_sp_noise(image, prob):
"""
添加椒盐噪声
:param image: 输入图像
:param prob: 噪声比例(0 到 1 之间)
:return: 添加噪声后的图像
"""
# 创建一个与输入图像形状相同、数据类型为 uint8 的全零数组,用于存储添加噪声后的图像
output = np.zeros(image.shape, np.uint8)
# 计算阈值,用于判断像素是噪声点还是保留原值
thres = 1 - prob
# 遍历图像的每一行
for i in range(image.shape[0]):
# 遍历图像的每一列
for j in range(image.shape[1]):
# 生成一个 0 到 1 之间的随机数
rdn = random.random()
# 如果随机数小于噪声概率,则将该像素值设为 0(黑点,即“椒”噪声)
if rdn < prob:
output[i][j] = 0
# 如果随机数大于阈值,则将该像素值设为 255(白点,即“盐”噪声)
elif rdn > thres:
output[i][j] = 255
# 否则,保留原图像的像素值
else:
output[i][j] = image[i][j]
# 返回添加噪声后的图像
return output

# 读取图像
pic01_original = cv.imread("2025-07-08_02.jpg")
# 添加椒盐噪声
pic01_noise = add_sp_noise(pic01_original, 0.02)
# 显示原始图像
cv.imshow("pic01_original", pic01_original)
# 显示添加噪声后的图像
cv.imshow("pic01_noise", pic01_noise)
# 保存噪声图像
cv.imwrite("2025-07-08_01.jpg", pic01_noise)
# 等待按键
cv.waitKey(0)
# 关闭所有窗口
cv.destroyAllWindows()

  运行结果如下图所示,可以看出,添加了椒盐噪声的图像就像撒上了椒盐一样(笑):

原图像
原图像
椒盐噪声图像
椒盐噪声图像

3.2 添加高斯噪声

  以下是一个使用 Python 和 OpenCV 实现方框滤波中添加高斯噪声的示例代码:

import numpy as np
import cv2 as cv

def gasuss_noise(image, mean, var):
"""
添加高斯噪声
:param image: 输入图像
:param mean: 噪声的均值
:param var: 噪声的方差
:return: 添加噪声后的图像
"""
# 将图像像素值归一化到 [0, 1] 范围内,便于后续处理
image = np.array(image / 255, dtype=float)
# 生成与图像形状相同的高斯噪声
noise = np.random.normal(mean, var ** 0.5, image.shape)
# 将高斯噪声加到归一化后的图像上
out = image + noise
# 检查加噪声后的图像是否有小于 0 的值
if out.min() < 0:
low_clip = -1. # 如果有小于 0 的值,设置下限为 -1
else:
low_clip = 0. # 否则,下限为 0
# 将加噪声后的图像值限制在 [low_clip, 1.0] 范围内
out = np.clip(out, low_clip, 1.0)
# 将归一化的图像值重新缩放到 [0, 255] 范围,并转换为 uint8 数据类型
out = np.uint8(out * 255)
# 返回添加高斯噪声后的图像
return out

# 读取图像
pic02_original = cv.imread("test_pic02.png")
# 添加高斯噪声
pic02_noise = gasuss_noise(pic02_original, 0.2, 0.1)
# 显示原始图像
cv.imshow("pic02_original", pic02_original)
# 显示添加噪声后的图像
cv.imshow("pic02_noise", pic02_noise)
# 保存噪声图像
cv.imwrite("pic02_noise.jpg", pic02_noise)
# 等待按键
cv.waitKey(0)
# 关闭所有窗口
cv.destroyAllWindows()

  运行结果如下图所示:

原图像
原图像
高斯噪声图像
高斯噪声图像

4. 方框滤波的 kernel 参数

  方框滤波的 kernel 参数决定了去除噪声的程度:

  • 若为 1x1,则输出的图像就是原图像。
  • 使用的 kernel 越大,噪声越不明显,但相应的图片也越模糊。
  • 方框滤波计算的是以计算点为中心,kernel 大小的区域取平均值所得到的像素。
  • kernel 的大小选择为 15x15 时,线条等细节已经被完全模糊