从您的 cmets 的上下文和您提出的问题来看,您希望完全消除已经损坏的图像中的噪声。只有你知道噪声输入过程的脉冲响应/点扩散函数(PSF),你才能完全去除。了解 PSF 并以此进行噪声消除通常称为deconvolution。由于随机噪声过程的 PSF 在实践中鲜为人知,而且噪声是一个随机过程,因此几乎不可能完全去除所有噪声。确实存在噪声模型,但要知道破坏图像的噪声模型的确切参数非常困难(如果不是,则不可能......)。
您当然可以删除其中的大部分并且您不会恢复原始图像,但您可以通过标准的噪声过滤技术来减轻噪声。要去除高斯噪声,您可以简单地使用任何标准的低通滤波方法,例如average filtering 或高斯滤波。你也可以使用Wiener filtering,它是一个自适应过滤器。它分析图像的像素邻域并计算每个邻域的方差。如果方差很小,则执行更多的平滑处理,反之亦然。看看at this link for a good example。
现在,在您发布的代码中,您选择使用conv2。我要指出的一件小事是您的过滤代码不进行中值过滤。您正在实施平均过滤器。如果要使用中值过滤,请改用medfilt2。
在任何情况下,虽然conv2 通常适用于任何二维信号,但我建议您改用imfilter。它专门设计用于过滤图像(实际上是线性过滤......),如果您的计算机/处理器支持它的使用,它还利用英特尔的 IPP 库。我尝试使用标准cameraman.tif 图像在我的机器上运行您的代码(使用conv2),我得到的输出不是您的cmets 中提到的空白。我的猜测是,由于投射到uint8,您得到了一张空白图像。 L 最有可能转换为 double 精度图像,范围在 [0,1] 之间,当您简单地转换为 uint8 时,您只会得到强度为 0 或 1 的图像,这就是您不这样做的原因什么都看不见。尝试使用im2uint8 转换您的图像,这样您就可以将强度对比归一化为[0,255],而不是使用imshow 进行合适的显示。
但是,如果您使用imfilter,则无需转换类型,因为imfilter 将尊重输入图像的类型,并将对输出图像使用相同的类型。因此,让您的代码看起来像这样:
L = imread('cameraman.tif'); %// Load in image from MATLAB system path
P =0; %mean
Q =0.01; %variance
R = imnoise(L,'gaussian',P,Q); %L-image
subplot(2,1,1);
imshow(R);
title('Gaussian Noise');
U = imfilter(R, ones(3)/9, 'replicate'); %// Change - Use imfilter
subplot(2,1,2);
imshow(U);
title('Average Filtered Image'); %// Changed title to be correct
这是我得到的:
现在,为了回答您关于要过滤的不同类型噪声的问题,泊松噪声也可以通过低通滤波器(平均、高斯等)进行过滤。椒盐噪声最好用中值滤波来过滤。这是a great example on how median filtering works for salt and pepper noise。
至于您可以消除噪音的“程度”,这完全取决于反复试验。您只需要继续使用不同的过滤器大小和参数过滤您的图像,直到您获得您认为感知良好的质量或使用所有试验中具有最高 PSNR 的图像。显然,您的图像越嘈杂,您就越需要制作过滤器,但您可能无法识别原始图像的外观。
这主要是一个反复试验的过程,因此您必须尝试使用这些参数,看看您会得到什么。
我希望这已经充分回答了您的问题。祝你好运!