目标是为图像添加零均值和方差为400的加性高斯噪声。
例如,如果我想添加零均值和方差0.5的加性高斯噪声,我可以使用以下两种方法之一:
1)Matlab中的imnoise命令:
Noisyimg=imnoise(I,'gaussian',0,0.5)
我是图像的地方 噪声正在增加,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;
由此产生的噪声图像远不是我应该获得的实际噪声图像。我知道,因为我有我应该获得的实际噪声输出的图像。我在执行命令时犯了什么错误,或者我错过了一些关键点。
我附加了原始图像,我试图添加高斯噪声和添加噪声后获得的图像。
original image(I)
Noisyimg
任何帮助将不胜感激!!
答案 0 :(得分:1)
可能有两个问题: 1.动态范围或原始图像。如果它是[0 1]那么只有添加具有方差400的正态分布的值才会产生大部分噪声。 2.如果图像是uint8或uint 16,添加double可能会产生不良影响。尝试在添加噪音之前将图像转换为双倍:
Noisyimg=noisemat+double(I);
答案 1 :(得分:0)
所以,我终于得到了我看得远的结果。希望它有所帮助:)
关键在于,要添加的高斯噪声的方差也必须相对于其被添加到的图像的范围进行缩放。原始图像的类型为uint8。最初,它被转换为类型double,范围为[0 1]。
I=im2double(imread('chipset1.tif'));
figure;imshow(I);title('original image');
现在,当尝试添加400的高斯噪声时出现问题。最初,我试图添加如下:
Noisyimg=imnoise(I,'gaussian',0,400)
但事实证明,方差必须先缩放才能使用。
按比例缩放:
variance = (标准差)^ 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的variance参数的变化。这种相对缩放可确保输出噪声图像正确且在范围内。
同样可以用方法二完成:
noisemat=(sqrt(var))*randn(size(I))+0;
Noisyimg=noisemat+I;
figure;imshow(Noisyimg);
作为旁注,可以获得向灰度图像添加方差400的高斯噪声的问题,并且可以在Rafael C.Gonzalez和Richard E.Woods的第3版第5章的数字图像处理教科书中参考,例5.2。请注意,此示例中的原始图像也在此处以及我发布的问题中使用,其中我没有获得所需的输出。