有多种方法可以对图像信号进行去噪。在关于图像稀疏性的前言中,我将提供一些 matlab 代码。图像本质上是稀疏的,不是在空间域中,而是在某些域中,如傅立叶、DCT 或小波域。如果你看一下图像的 FFT,你会发现只有几个系数是非零的,如下图描述了图像的 fft2:
imshow(log10(abs(fftshift(fft2(Image)))),[])
事实上,像 JPEG 这样的图像压缩算法利用了图像的这一特性。这种稀疏性属性也可以用于去噪图像。如果将图像转换为小波域,则像上述噪声这样的随机噪声往往会分散其系数,但与图像相关的系数往往会集中在几个 bin 中。因此,最基本、最简单的技术是按数量级对图像的小波系数进行 FFT、DCT 排序,使所有小于阈值的系数为零最后将图像转换回空间域。基于这个想法,出现了一些软/硬阈值算法。在这方面一个好的 Matlab 实现可以在下面的页面中找到,他们提供了基于小波的去噪工具:
http://eeweb.poly.edu/iselesni/WaveletSoftware/denoise.html
另一种利用稀疏性的技术是 $l_1$ 正则化。看,它在一些假设下被证明,$l_1$ norm 可以用来表示非零系数的数量($l_0$ norm,你可以在 Compressive Sensing literate 中找到证明)。
再次注意,随机噪声倾向于在变换域中形成非稀疏表示(例如,白噪声在频率上具有平坦表示)。因此,如果我们定义一个凸优化问题,在该问题中我们尝试构建一个保留噪声图像能量的图像,并尝试最小化变换域中非零系数的数量,我们将消除噪声。问题通常定义如下:
$$D = \arg \min_d ||Id||_2 + \lambda|| f(d) ||_1 $$
其中,$D$ 是去噪图像,$I$ 是噪声图像,$f$ 是变换算子(例如 DFT 矩阵),$\lambda$ 是正则化因子。第一项试图使$D$ 越来越接近原始图像,第二项试图使$D$ 尽可能稀疏。通过解决上述问题,我们将去除图像中的噪声。
为了解决这个优化问题 ,可以使用CVX 工具箱。我不确定 CVX 工具箱中的以下代码是否有效,只是尝试给你一个想法:
I=imread('J13Wn.jpg');
I=double(I);
Rn=I(:,:,1);
Rn=imresize(Rn,[256 256]); % for out of memory error in my computer
B=dctmtx(256);
cvx_begin
variable R(256,256);
minimize(norm(Rn-R,2)+0.1*norm(B*R,1));
cvx_end
如果它不起作用,试试这个工具箱:
http ://www.cs.tut.fi/~foi/GCF-BM3D/