优先用cv2.medianBlur处理椒盐噪声、cv2.GaussianBlur处理高斯噪声,再以CLAHE(clipLimit=2.0, tileGridSize=(8,8))做L通道对比度增强;避免直接全局直方图均衡化与频域/深度学习方法。

直接用 cv2.medianBlur 处理椒盐噪声、cv2.GaussianBlur 处理高斯噪声,再配合 cv2.equalizeHist 或 cv2.createCLAHE 做对比度增强,基本覆盖 80% 的日常图像质量修复需求。不建议一上来就上频域或深度学习方法——参数难调、耗时长、效果未必更好。
怎么选滤波器:看噪声类型再动手
噪声不是统一的,选错滤波器反而毁图:
- 图像里有明显白点/黑点(像撒了胡椒和盐)→ 用
cv2.medianBlur,核大小取3或5;超过7容易丢细节 - 图像整体发“雾”、边缘发虚、灰蒙蒙 → 用
cv2.GaussianBlur,推荐kernel_size=(5, 5)+sigmaX=1.0;sigmaX太大会让文字/线条糊成一片 - 均值滤波(
cv2.blur)基本可弃用:它对所有噪声都“平均主义”,既去不干净椒盐,又比高斯滤波更伤边缘 - 别在彩色图上直接套灰度滤波函数:先用
cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)转灰度,或对每个通道分别处理(但通常没必要)
直方图均衡化为什么有时越弄越假?
cv2.equalizeHist 是全局拉伸,只适合亮度分布严重偏斜的图(比如全暗场景拍出的证件照)。但多数日常图用它会过曝、色阶断层、天空发灰:
- 优先试
cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8)),它分块做局部均衡,保留区域对比度 -
clipLimit超过3.0就容易放大噪声,尤其在平滑区域(如皮肤、墙面)出现“斑驳感” - CLAHE 对彩色图要拆通道:先转
cv2.COLOR_BGR2LAB,只对L通道增强,再合并回去,否则颜色会失真
OpenCV 默认读图是 BGR,这个坑踩一次就够
用 cv2.imread 读进来的图是 BGR 顺序,不是 RGB。如果你后续用 matplotlib.pyplot.imshow 显示,不手动指定 cmap='gray' 或转换通道,颜色会完全错乱:
立即学习“Python免费学习笔记(深入)”;
- 显示灰度图:加
cmap='gray',且确保输入是单通道(img.shape是二维) - 显示彩色图:用
cv2.cvtColor(img, cv2.COLOR_BGR2RGB)转完再给plt.imshow - 写图保存前不用转——
cv2.imwrite只认 BGR,转成 RGB 再保存,图就变色了 - 滤波函数(如
medianBlur)对单/三通道都兼容,但注意传入的是原始 BGR 图还是已转灰度图
频域滤波看着高级,但实际调试成本远高于空间域:FFT 位移、频谱裁剪、逆变换归一化……任何一个环节没对齐,出来的就是全黑或雪花图。真正需要频域的场景很窄——比如图像里有规律条纹(扫描线、摩尔纹),这时才值得花时间调 np.fft.fft2 + 理想/巴特沃斯滤波器。其余情况,把 medianBlur、GaussianBlur、CLAHE 的参数组合试清楚,已经足够解决绝大多数降噪增强问题。

















