图像去噪里的维纳滤波器,算是比较经典的一招了。尤其你用的是 MATLAB,那就更好搞了,它有现成的函数和 FFT 工具配合着用,效率还挺高的。像高斯噪声或者椒盐噪声这种常见场景,维纳滤波基本都能应付。
维纳滤波器的核心思路,就是在频域里对信号和噪声的功率谱动手脚,让恢复后的图像尽量还原原始效果。它不是盲目的去掉噪声,而是尽保留有用信息。你只要知道原始信号和噪声的SNR,滤波器系数就能算出来。
整个过程这么几步:读取图像、频域、算滤波器、滤波、再回到时域。听起来有点多,其实写成脚本之后,用起来也就一条命令的事。你可以用fft2
转频域、ifft2
转回去,中间用公式算H(f)
。
代码逻辑也蛮直观,比如下面这种构造滤波器的方式:
H = Sx ./ (Sx + K * Sn);
对新手来说,难点在怎么估计噪声谱。但其实抓几张纯噪声图,取平均功率谱就差不多了。如果你图像有点过锐,那是 SNR 设置太低了,稍微调一下就好。
想进阶的话,可以结合中值滤波、双边滤波试试,尤其对边缘保持比较好的场景,维纳滤波效果就更了。如果你想直接上手,可以看看这个资源:
如果你有点图像的经验,强烈推荐你自己调调参数,或者用不同噪声模型试试,挺有意思的。