Matlab 哪一种是模拟加性高斯噪声的正确方法
我有一个无噪音的图像Matlab 哪一种是模拟加性高斯噪声的正确方法,matlab,image-processing,noise,Matlab,Image Processing,Noise,我有一个无噪音的图像I。我想模拟添加到图像中的加性高斯噪声(零均值和变化v)n。系统的输出为: 要模拟它,我们有两种方法: 创建高斯噪声并将其添加到图像中 在MATLAB中使用imnoise函数 我用了两种方法,但结果不同。你能确定哪一个是正确的吗?为什么它们不相等?据我所知,我认为imnoise是正确的 在我的模拟中,我使用噪声百分比的定义作为 “噪声百分比”数字表示整个图像中高斯噪声与信号标准偏差的百分比比率 我用黑体字标出了要点: J=imnoise(I,'gaussian',M,V)向图
I
。我想模拟添加到图像中的加性高斯噪声(零均值和变化v
)n
。系统的输出为:
要模拟它,我们有两种方法:
imnoise
函数imnoise
是正确的
在我的模拟中,我使用噪声百分比的定义作为
“噪声百分比”数字表示整个图像中高斯噪声与信号标准偏差的百分比比率
我用黑体字标出了要点:
J=imnoise(I,'gaussian',M,V)
向图像I添加均值为M且方差为的高斯白噪声。默认值为方差为0.01的零均值噪声。
及
R=normrnd(mu,sigma)
使用平均参数mu和标准偏差参数sigma从正态分布生成随机数。
我认为这两种方法应该是相当平等的,同样正确的任务和任何其他后,方差被纠正,也就是说,之后
I_noise2 = imnoise( I, `gaussian`, 0, v^2 ); % orr sqrt(v) depends...
除了
normrnd
将标准偏差作为输入,而imnoise
期望方差(如@mainactual所述)之外,还存在数据类型和值范围的问题
imnoise
文档中有一个注释:
注意:始终指定“高斯”噪声类型的均值和方差参数,就好像图像属于范围[0,1]内的双类。如果输入图像的类别为uint8
,则imnoise
功能将图像转换为double
,根据指定的类型和参数添加噪声,然后将噪声图像转换回与输入相同的类别
如果输入图像已在[0,1]范围内double
,这意味着在添加噪声后将输出值剪裁到[0,1]范围
在这种情况下,normrnd
也可以替换为对randn
的简单调用
例如:
% input image
I = imread('eight.tif');
I = im2double(I); % convert to double in [0,1] range
% noise mean/variance
m = 0;
v = (0.4 * std(I(:)))^2;
% normrnd
noise1 = normrnd(m, sqrt(v), size(I));
I1 = I + noise1;
I1 = max(0, min(I1, 1)); % clip to [0,1] range
% randn
noise2 = randn(size(I))*sqrt(v) + m;
I2 = I + noise2;
I2 = max(0, min(I2, 1)); % clip to [0,1] range
% imnoise
I3 = imnoise(I, 'gaussian', m, v);
% compare
subplot(221), imshow(I), title('original')
subplot(222), imshow(I1), title('normrnd')
subplot(223), imshow(I2), title('randn')
subplot(224), imshow(I3), title('imnoise')
我测试了您的代码,在“I_noise1=I+n;”行中出现错误。它说矩阵尺寸必须一致。我没有原始的“8.tif”,所以我不得不使用另一个image@VMMF:以上代码假设为灰度图像(如果图像为RGB,则计算的大小错误)感谢Amro。我读了一些论文,他们经常给出噪音的百分比,我只是把它乘以方差。你认为我的实现有意义吗?我想是的,我想这取决于你如何定义“噪音百分比”。。以下是一些相关帖子:,
I_noise2 = imnoise( I, `gaussian`, 0, v^2 ); % orr sqrt(v) depends...
% input image
I = imread('eight.tif');
I = im2double(I); % convert to double in [0,1] range
% noise mean/variance
m = 0;
v = (0.4 * std(I(:)))^2;
% normrnd
noise1 = normrnd(m, sqrt(v), size(I));
I1 = I + noise1;
I1 = max(0, min(I1, 1)); % clip to [0,1] range
% randn
noise2 = randn(size(I))*sqrt(v) + m;
I2 = I + noise2;
I2 = max(0, min(I2, 1)); % clip to [0,1] range
% imnoise
I3 = imnoise(I, 'gaussian', m, v);
% compare
subplot(221), imshow(I), title('original')
subplot(222), imshow(I1), title('normrnd')
subplot(223), imshow(I2), title('randn')
subplot(224), imshow(I3), title('imnoise')