哪一个是模拟加性高斯噪声的正确方法

时间:2016-04-09 16:17:31

标签: matlab image-processing noise

我有一张无噪音的图片I。我想模拟添加到图像中的加性高斯噪声(零均值和变化vnmodel的输出是:

Z = I + n

为了模拟它,我们有两种方式:

  1. 创建高斯噪音并将其添加到图像
  2. 在MATLAB中使用imnoise函数。
  3. 我使用了两种方式,但他们给出了不同的结果。你能确定哪一个是正确的吗?为什么他们不等同?据我所知,我认为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');
    

    output

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')

image-gaussian-noise

答案 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...