如何添加和删除图像中的噪声

时间:2014-11-02 16:28:51

标签: matlab image-processing gaussian noise

我想将高斯噪声添加到256x256灰度图像中,然后将其删除。我尝试使用以下代码,但我得到的只是一个有噪音的图像。 是否可以完全去除图像中的噪音?如果不是在何种程度上可以降低高斯噪声?

 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 = conv2(double(R), ones(3)/9, 'same');
 U1=uint8(U);
 subplot(2,1,2);
 imshow(U1);
 title('Median Filtered Image');

我计划实施泊松噪声和盐和胡椒噪声的添加和删除。请建议我是否有过滤器来消除这些噪音。 请帮忙。提前谢谢。

2 个答案:

答案 0 :(得分:4)

根据您的评论背景和您提出的问题,您希望完全消除已经损坏的图像中的噪音。如果首先您知道噪声输入过程的脉冲响应/点扩散函数(PSF),则只能完全删除。了解PSF并使用此功能进行噪声消除通常称为deconvolution。由于随机噪声过程的PSF在实践中很少被人知道,而且噪声是随机过程,因此实际上不可能完全消除所有噪声。当然存在噪声模型,但是知道损坏图像的噪声模型的确切参数是非常困难的(如果不是,不可能......)来确定。

您当然可以删除其中的大部分内容而将无法恢复原始图像,但您可以通过标准的噪音过滤技术来降低噪点。要消除高斯噪声,您可以简单地使用任何标准的低通滤波方法,例如average filtering或高斯滤波。您还可以使用Wiener filtering作为自适应过滤器。它分析图像的像素邻域并计算每个邻域的方差。如果方差很小,则执行更平滑,反之亦然。看看at this link for a good example


现在,在您发布的代码中,您已选择使用conv2。我要指出的一件小事是,您的过滤代码不会进行中值过滤。您正在实施平均过滤器。如果您想使用中值过滤,请改用medfilt2

在任何情况下,尽管conv2对于任何2D信号都很有用,但我建议您改用imfilter。它专门用于过滤图像(实际上是线性过滤......),如果您的计算机/处理器支持其使用,它还可以利用英特尔的IPP库。我尝试使用标准conv2图像在我的计算机上运行您的代码(使用cameraman.tif),并且我的评论中提到的输出非空白。我的猜测是,由于投射到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

这就是我得到的:

enter image description here


现在,为了回答有关您想要滤除的各种噪声的问题,泊松噪声也可以通过低通滤波器进行滤波(平均值,高斯等)。盐和胡椒噪声最好用中值滤波过滤。这是a great example on how median filtering works for salt and pepper noise

至于你可以消除噪音的“程度”,这完全取决于反复试验。您只需使用不同的过滤器大小和参数过滤图像,直到获得您认为的感知质量良好或使用所有试验中具有最高PSNR的图像。显然,您的图像越嘈杂,您制作滤镜所需的攻击性越强,但您可能无法识别原始图像的样子。

这主要是一个试错过程,因此您必须使用参数并查看所获得的内容。


我希望这已经充分回答了你的问题。祝你好运!

答案 1 :(得分:0)

根据您的评论,将原始未修改的图像数据从imread()保存到单独的数组变量中是可以接受的,该变量在需要完全去除噪声的图像时使用。