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
。系统的输出为:

要模拟它,我们有两种方法:

  • 创建高斯噪声并将其添加到图像中
  • 在MATLAB中使用
    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')