3. 图像去噪处理

图像去噪处理 学习卡片

任务说明

本案例针对工业OCR场景中常见的图像噪声问题,对一张包含椒盐噪声的字符图像分别实施高斯滤波与中值滤波,通过客观指标与主观视觉对比,确定更适合字符图像预处理的最佳去噪方法。输入图像为模拟含噪字符图,输出为两种滤波结果及量化对比数据。

实现方案

使用OpenCV实现完整处理流程:首先生成含椒盐噪声的字符图像(白底黑字,噪声密度5%),然后分别应用高斯滤波(核5×5,σ=1.5)和中值滤波(核5×5),最后计算两种结果与原始无噪声图像的PSNR和SSIM指标。PSNR越高表示失真越小,SSIM越接近1表示结构保持越好。字符图像边缘信息宝贵,中值滤波在抑制椒盐噪声的同时能更好保留边缘锐度,而高斯滤波虽平滑噪声却易模糊笔画边界。

图像去噪处理流程 含噪字符图 5%椒盐噪声 高斯滤波 5×5, σ=1.5 中值滤波 5×5核 高斯结果 PSNR/SSIM 中值结果 PSNR/SSIM 选择最佳 指标+视觉 PSNR高者优先

代码实现


import cv2
import numpy as np
from skimage.metrics import peak_signal_noise_ratio as psnr
from skimage.metrics import structural_similarity as ssim

# 1. 生成原始字符图像(白底黑字)
img_clean = np.full((200, 400), 255, dtype=np.uint8)
cv2.putText(img_clean, 'OCR-3', (50, 130), cv2.FONT_HERSHEY_SIMPLEX,
            3, 0, 8, cv2.LINE_AA)

# 2. 添加5%椒盐噪声
np.random.seed(42)
noisy = img_clean.copy()
mask = np.random.rand(*img_clean.shape)
noisy[mask < 0.025] = 0      # 椒噪声
noisy[mask > 0.975] = 255    # 盐噪声

# 3. 应用两种滤波
gauss = cv2.GaussianBlur(noisy, (5, 5), 1.5)
median = cv2.medianBlur(noisy, 5)

# 4. 计算客观评价指标
psnr_gauss = psnr(img_clean, gauss)
psnr_median = psnr(img_clean, median)
ssim_gauss = ssim(img_clean, gauss)
ssim_median = ssim(img_clean, median)

# 5. 输出对比结果
print(f"高斯滤波  PSNR={psnr_gauss:.2f}dB  SSIM={ssim_gauss:.4f}")
print(f"中值滤波  PSNR={psnr_median:.2f}dB  SSIM={ssim_median:.4f}")

# 6. 保存结果供视觉检查
cv2.imwrite('noisy.png', noisy)
cv2.imwrite('gauss_result.png', gauss)
cv2.imwrite('median_result.png', median)

运行与验证

依赖安装:需安装OpenCV和scikit-image,执行pip install opencv-python scikit-image numpy。

运行方式:将上述代码保存为denoise_compare.py,在命令行执行python denoise_compare.py。

验证方法:程序运行后观察终端输出的PSNR与SSIM数值,并打开保存的三张图片进行视觉对比。判定标准:

  • 若中值滤波的PSNR和SSIM均高于高斯滤波,且视觉上字符边缘更清晰、无模糊重影,则判定中值滤波为更优方法;
  • 若高斯滤波指标更高且视觉上笔画更平滑,则选择高斯滤波;
  • 两种方法均应显著降低噪声(PSNR较含噪图明显提升),若某方法指标异常低,需检查核尺寸或σ参数是否合理。

预期输出:基于椒盐噪声特性,中值滤波的PSNR通常比高斯滤波高5~10dB,SSIM也更接近1,因此预期选择中值滤波作为字符图像去噪的最佳方案。具体数值以实际运行为准。