2016-04-24 140 views
0

目标是将零均值和方差400的加性高斯噪声添加到图像中。高斯噪声,MATLAB

例如,如果我想添加零均值和方差0.5的加性高斯噪声,我可以使用以下两种方法之一:

1)在Matlab的imnoise命令:

    Noisyimg=imnoise(I,'gaussian',0,0.5) 

其中I是 的图像,其中正在添加噪声,Noisyimg是噪声图像。

2)通过使用randn 命令,创建一个随机数的矩阵,该正态分布 指定的均值和标准偏差。

 noisemat= a*randn(size(I))+ b; where a=standard deviation and b=mean 
     Noisyimg=noisemat+I;     

因此,零均值和0.5的方差,

 noisemat=sqrt(0.5)*randn(size(I))+0; 

因为标准偏差 是方差的平方根。

但是,当我尝试应用上述两种方法来获得具有零均值和400的方差的加性高斯噪声的噪声图像时,我以不可察觉的图像结束。对于例如,使用方法二,

 noisemat=sqrt(400)*randn(size(I))+0; 
     Noisyimg=noisemat+I; 

得到的噪声图像是无处实际嘈杂的形象,我应该obtaining.This近,我知道,因为我有实际的嘈杂输出的画面,我应该获得。我是否在执行命令时犯了错误,或者我是否缺少一些关键点。 我附上了我试图添加高斯噪声的原始图像和添加噪声后获得的图像。
original image(I) Noisyimg

任何帮助将不胜感激!

+0

你是什么意思的“不可分辨的图像”?原始图像的RMS是多少? –

回答

0

所以,我终于得到了我期待的结果。希望它有助于:)

关键在于事实上,要添加的高斯噪声的方差必须相对于它所添加图像的范围进行缩放。原始图像是uint8类型的。最初,它被转换为类型double,范围为[0 1]。现在

 I=im2double(imread('chipset1.tif')); 
     figure;imshow(I);title('original image'); 

,问题出现了想加400高斯噪声最初的时候,我试图它添加如下:

 Noisyimg=imnoise(I,'gaussian',0,400) 

但是,事实证明,方差有在可以使用之前被缩放。

它被缩放如下:

方差= (标准偏差)^ 2 /(255)^ 2

因此,对于400的方差,标准偏差为20,因此,缩放:

  var=(20)^2/(255)^2;%(since the image was of uint8 type) 

      Noisyimg=imnoise(I,'gaussian',0,var) 
      figure;imshow(Noisyimg); 

注意imnoise的方差参数的变化。这种相对缩放可确保输出的噪声图像正确并在范围内。

这也可以用方法2也可以做:

  noisemat=(sqrt(var))*randn(size(I))+0; 
      Noisyimg=noisemat+I; 
      figure;imshow(Noisyimg); 

作为旁注,加入方差400的高斯噪声的灰度图像的这个问题是可用的,并且可以在数字图像处理中引用教科书Rafael C.Gonzalez和Richard E.Woods,第3版,第5章,例5.2。请注意,该示例中的原始图像也用于此处,以及由我发布的问题中,我没有得到所需的输出。

1

可能有两个问题: 1.动态范围或原始图像。如果它是[0 1],那么只有在方差为400的情况下增加一个正态分布的值才会导致大部分噪声。 2.如果图像是uint8或uint 16,则添加double可能会产生不良影响。尝试在添加噪点之前将图像转换为双倍:

Noisyimg=noisemat+double(I); 
+0

欣赏好的建议:)是的,图像最初转换为类型double。原始图像是uint8类型的,它被转换为类型double,范围为[0,1]。代码如下:a = im2double(imread('chipset1.tif')); figure; imshow(a); title('original image'); b =(sqrt(400))* randn(size(a))+ 0; c = a + b;数字; imshow(c,'显示范围',[]) –