我有一张无噪音的图片I
。我想模拟添加到图像中的加性高斯噪声(零均值和变化v
)n
。 model的输出是:
Z = I + n
为了模拟它,我们有两种方式:
imnoise
函数。我使用了两种方式,但他们给出了不同的结果。你能确定哪一个是正确的吗?为什么他们不等同?据我所知,我认为imnoise
是正确的。
在我的模拟中,我使用噪声百分比的定义
"百分比噪音" number表示高斯噪声的标准偏差与整个图像的信号的百分比。
I = imread('eight.tif');
[rows cols]=size(I);
I = double(I);
I = I - min(I(:));
I = I / max(I(:));
%% Percentage ratio
noise_per=0.4; %40 percent noise
%% Add noise to image
v = (noise_per*std(I(:)))^2 %// Option #2
%% Add noise by manual way
n=normrnd(0,v,[rows cols]);
I_noise1=I+n;
%% Add noise by imnoise func.
I_noise2 = imnoise(I, 'gaussian', 0, v);
subplot(131);imshow(n,[]);title('Gaussian noise');
subplot(132);imshow(I_noise1,[]);title('Add Gaussian noise #1');
subplot(133);imshow(I_noise2,[]);title('Add Gaussian noise #2');
答案 0 :(得分:2)
除了normrnd
将标准偏差作为输入而imnoise
期望差异(由@mainactual指出)时,还有数据类型和价值范围的问题。
imnoise
文档中有一条注释:
注意:“高斯”噪声类型的均值和方差参数始终指定为图像属于[0,1]范围内的
double
类。如果输入图像属于uint8
类,则imnoise
函数会将图像转换为double
,根据指定的类型和参数添加噪声,然后将噪声图像转换回相同的值class作为输入。
如果输入图像在[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')
答案 1 :(得分:1)
我加注了基本要素:
J = imnoise(I,'gaussian',M,V)
将平均m和方差 v的高斯白噪声添加到图像I.默认值为零均值噪声,方差为0.01。 http://se.mathworks.com/help/images/ref/imnoise.html
和
R = normrnd(mu,sigma)
使用平均参数mu和标准差参数sigma从正态分布生成随机数。 http://se.mathworks.com/help/stats/normrnd.html
我认为在纠正差异之后,即
之后,两种方式应该非常相等并且同样适用于您的任务和其他任何方式I_noise2 = imnoise( I, `gaussian`, 0, v^2 ); % orr sqrt(v) depends...