3. 图像去噪处理
任务说明
本案例针对工业OCR场景中常见的图像噪声问题,对一张包含椒盐噪声的字符图像分别实施高斯滤波与中值滤波,通过客观指标与主观视觉对比,确定更适合字符图像预处理的最佳去噪方法。输入图像为模拟含噪字符图,输出为两种滤波结果及量化对比数据。
实现方案
使用OpenCV实现完整处理流程:首先生成含椒盐噪声的字符图像(白底黑字,噪声密度5%),然后分别应用高斯滤波(核5×5,σ=1.5)和中值滤波(核5×5),最后计算两种结果与原始无噪声图像的PSNR和SSIM指标。PSNR越高表示失真越小,SSIM越接近1表示结构保持越好。字符图像边缘信息宝贵,中值滤波在抑制椒盐噪声的同时能更好保留边缘锐度,而高斯滤波虽平滑噪声却易模糊笔画边界。
代码实现
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,因此预期选择中值滤波作为字符图像去噪的最佳方案。具体数值以实际运行为准。