【问题标题】:How to add specific amount of gaussian or salt & pepper noise using matlab function?如何使用 matlab 函数添加特定量的高斯或椒盐噪声?
【发布时间】:2013-10-04 11:46:22
【问题描述】:

这个问题对其他人来说可能很傻,但对我来说却很难。

您好,我是 MATLAB 的初学者,我最近正在阅读一篇论文,其中我们必须通过以下方式在图像中添加噪声。

高斯噪声 => sigma = 10

椒盐噪声 => p = 20% sp

我知道 MATLAB 函数用于添加噪声,我们使用 imnoise() 函数。

noise_image = imnoise(input_image, 'salt & pepper', gaus_val)

会添加椒盐噪声和

noise_image = imnoise(input_image, 'gaussian', 0 , salt_pepper_val);

将添加零均值高斯方差噪声salt_pepper_val

现在我的问题是使用 imnoise() 函数如何添加以下噪声量。换句话说,对于 gaus_val 和 salt_pepper_val 的值,我将得到 sigma = 10%、20%、......的量的高斯噪声和 20%、30%......的量的椒盐噪声。 ........

高斯噪声 => sigma = 10

椒盐噪声 => p = 20% sp

【问题讨论】:

  • 反对的选民或希望结束此问题的人,请敢于提出您的 cmets,这对我来说是一个困难的问题,希望对您来说不是。
  • variance = sigma^2,除此之外,我想你已经回答了你自己的问题......如果你的问题是如何添加两个,你可以添加一个然后另一个,只需输入 noise_image到第二个imnoise
  • 尽管进行了编辑,但我仍然不明白您的问题。您要求一种方法来实现一些噪音,您希望它是imnoise,然后您提供回答您自己问题的相关代码。您可能想再次提出您的问题,或者更具体地获得答案。
  • 现在您完全删除了自己的尝试,告诉我们他们出了什么问题不是更好吗?
  • 方差或标准差是变量的(平方)单位。假设“10%”噪声意味着相对于图像基线的 10%,那么: // 使用 SNR 的这个定义: SNR = mu/std; ns = 0.1*mean(mean(noise_image);noise_image = noise_image + normrnd(0,ns,size(noise_image));

标签: matlab image-processing noise


【解决方案1】:

使用不同的参数是因为这两种噪声的特征不同:

  1. 高斯噪声会破坏整个图像,如果它是白色的(即没有空间协方差)且均值为零(平均而言,它不会使图像变亮或变暗),那么它完全由噪声幅度 sigma 定义。如果您阅读文档 www.mathworks.com/help/images/ref/imnoise.html,那么您会看到您可以指定均值和方差(sigma*sigma -- 如果 sigma = 10,则方差 = 100)。然后,您可以使用 sigma 10 添加噪声:

    >> noise_image = imnoise(input_image, 'gaussian', 0 , 100);
    
  2. 椒盐噪声是图像中的白色(盐)和黑色(胡椒)斑点,即它们不会影响每个像素。 sp 是图像损坏的百分比(默认为 5% 或 0.05),因此 sp = 20% = 0.2 表示 5 个像素中有 1 个被损坏:

    >> noise_image = imnoise(input_image, 'salt & pepper', 0.2);
    

完全按照帮助页面上的描述。

编辑:请注意,imnoise() 用于强度在 0 和 1 之间的图像,并且 [0,1] 范围之外的值会被剪裁 - 方差可能不是您指定的值。

你也可以不使用 imnoise 轻松地做同样的事情:

(1) 将图像加载为 [0,1] 灰度:

  >> input_image = mean(imread('peppers.png'),3)/256;

(2) 添加 0.1 * 图像的 sigma 的高斯噪声:

  >> image2 = randn(size(input_image)); 
  >> image2 = input_image+image2*0.1*std(input_image(:))/std(image2(:)); 

(3) 在 20% 的像素中添加 s&p 噪声:

  >> image3 = input_image; 
  >> li=randperm(length(image3(:))); 
  >> image3(li(1:(end/5)))=1; 
  >> image3(li(1:(end/10)))=0; 

(4) 并排显示:

  >> imagesc([input_image image2 image3])

【讨论】:

    猜你喜欢
    • 2021-11-12
    • 2013-01-04
    • 2013-03-14
    • 2021-04-09
    • 2015-02-04
    • 1970-01-01
    • 2013-10-14
    • 2014-05-21
    • 1970-01-01
    相关资源
    最近更新 更多