2014-11-02 141 views
1

我想将高斯噪音添加到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'); 

我打算实施泊松噪声的添加和去除以及椒盐噪声。请建议我是否有过滤器来消除这些噪音。 请帮忙。提前致谢。

+0

我知道这并不完全回答这个问题,至于不同的方法,你能否将原始的未经修改的图像存储到不同的变量或文件中? – Alex 2014-11-02 16:46:45

+0

@AlexB是的,先生它肯定可以存储在一个不同的变量。 – 2014-11-02 16:52:43

回答

4

从您的意见和问题的背景来看,您希望完全消除已损坏图像中的噪音。如果您首先知道噪声输入过程的脉冲响应/点扩散函数(PSF),您只能完全移除。知道PSF并通过它去除噪音通常被称为deconvolution。因为随机噪声过程的PSF在实践中很少知道,而且噪声是一个随机过程,所以实际上不可能完全消除所有噪声。确实存在噪声模型,但知道噪声模型的确切参数会破坏图像,因此很难确定(如果不是,则不可能)。

您当然可以将其中的大部分删除,并且不会将原始图像返回,但您可以通过标准噪音过滤技术减轻噪音。要去除高斯噪声,您可以简单地使用任何标准的低通滤波方法,如average filtering或高斯滤波。您也可以使用Wiener filtering这是一个自适应过滤器。它分析图像的像素邻域并计算每个邻域的方差。如果方差小,则执行更平滑,反之亦然。看看at this link for a good example。现在


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

在任何情况下,尽管conv2对任何2D信号都很好,但我建议您使用imfilter来代替。它专门设计用于过滤图像(实际上是线性过滤...),并且如果您的计算机/处理器支持其使用,它还会利用英特尔的IPP库。我试着用我的机器上的标准cameraman.tif图像在我的机器上运行您的代码(使用conv2),并且我得到的输出不像评论中提到的那样是空白的。我的猜测是,由于投射到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最高的图像。显然,图像越嘈杂,您需要制作过滤器的积极性就越高,但您可能无法首先识别原始图像的样子。

这主要是一个试验和错误的过程,所以你必须玩弄参数,看看你得到什么。


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

+0

先生非常感谢你的救星。我得到了结果。我会改变参数的值以获得更好的结果。 – 2014-11-02 18:01:41

+0

@AbiramiAnbalagan - 不客气。祝你好运! – rayryeng 2014-11-02 18:03:03

+1

+1非常好的解释你说的一切! – 2014-11-02 18:46:57

0

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

+0

主席先生,我需要从嘈杂的图像中去除噪音并找到PSNR。 – 2014-11-02 17:19:28

+1

我以为你说可以将它存储在不同的变量中吗? – Alex 2014-11-02 17:26:16

+0

@AlexB - 我认为OP很困惑。我相信他们想尝试彻底消除已经损坏的图像中的噪声,这是不可能的。 – rayryeng 2014-11-02 17:27:38