【问题标题】:Which one is the correct way of simulating addtive Gaussian noise哪一种是模拟加性高斯噪声的正确方法
【发布时间】:2023-03-05 06:35:01
【问题描述】:

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

Z = I + n

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

  1. 创建高斯噪声并将其添加到图像中,
  2. 在 MATLAB 中使用 imnoise 函数。

我使用了这两种方法,但它们给出了不同的结果。你能确定哪一个是正确的吗?为什么它们不相等?据我所知,我认为imnoise 是正确的。

在我的模拟中,我将噪声百分比定义为

“百分比噪声”数字表示高斯噪声的标准偏差与整个图像的信号的百分比。

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

【问题讨论】:

  • 我测试了您的代码并在“I_noise1=I+n;”行中出现错误。它说矩阵尺寸必须一致。我没有原始的“eight.tif”,所以我不得不使用另一张图片
  • @VMMF:上面的代码假设一个灰度图像(如果图像是 RGB,则计算出错误的大小)

标签: matlab image-processing noise


【解决方案1】:

除了 normrnd标准偏差 作为输入而 imnoise 期望 variance(如 @mainactual 所述)这一事实之外,还有一个问题数据类型和取值范围。

imnoise 文档中有注释:

注意:“高斯”噪声类型的均值和方差参数始终指定为好像图像属于 [0, 1] 范围内的 double 类。如果输入图像属于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')

【讨论】:

【解决方案2】:

我用粗体表示了要点:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-01
    • 2016-02-07
    • 1970-01-01
    • 2012-03-27
    • 2011-09-12
    • 1970-01-01
    • 2014-08-26
    • 2016-08-17
    相关资源
    最近更新 更多