使用 imnoise 为图像添加高斯噪声

Posted

技术标签:

【中文标题】使用 imnoise 为图像添加高斯噪声【英文标题】:Using imnoise to add gaussian noise to an image 【发布时间】:2013-04-07 03:46:11 【问题描述】:

如何使用imnoise向图像添加 SNR=5dB 的高斯白噪声?

我知道语法是:

J = imnoise(I,type,parameters)

和:

SNR = 10log<sub>10</sub>[var(image)/var(error image)]

如何使用此 SNR 值向图像添加噪点?

【问题讨论】:

【参考方案1】:

让我们先看看 SNR 与噪声的关系。您的错误图像是原始图像和噪声图像之间的差异,这意味着错误图像是噪声本身。因此,SNR 实际上是:

SNR = 10log<sub>10</sub>[var(image)/var(noise)]

对于给定的图像和 SNR=5db,噪声的方差为:

var(noise) = var(image)/10<sup>SNR/10</sup> = var(image)/sqrt(10)

现在让我们将所有这些转换成 MATLAB 代码。要使用imnoise 命令将高斯白噪声添加到图像(表示为I),语法为:

I_noisy = imnoise(I, 'gaussian', m, v)

其中m 是平均噪声,v 是它的方差。还需要注意的是,imnoise 假设图像I 中的强度范围为 0 到 1。

在我们的例子中,我们将添加零均值噪声,其方差为v = var(I(:))/sqrt(10)。完整代码为:

%// Adjust intensities in image I to range from 0 to 1
I = I - min(I(:));
I = I / max(I(:));

%// Add noise to image
v = var(I(:)) / sqrt(10);
I_noisy = imnoise(I, 'gaussian', 0, v);

澄清:我们使用var(I(:)) 来计算图像I 中所有样本的方差(而不是var(I),它计算沿列的方差)。

希望这会有所帮助!

示例

I = imread('eight.tif');
I = double(I);

%// Adjust intensities in image I to range from 0 to 1
I = I - min(I(:));
I = I / max(I(:));

%// Add noise to image
v = var(I(:)) / sqrt(10);
I_noisy = imnoise(I, 'gaussian', 0, v);

%// Show images
figure
subplot(1, 2, 1), imshow(I), title('Original image')
subplot(1, 2, 2), imshow(I_noisy), title('Noisy image, SNR=5db')

结果如下:

【讨论】:

对于相同的高斯噪声方差,我得到不同图像的不同 PSNR 值。为什么会这样? @Sndn 很可能不同的图像具有不同的信号功率,因此对于相同的高斯噪声功率,您可能会得到不同的 SNR 值。

以上是关于使用 imnoise 为图像添加高斯噪声的主要内容,如果未能解决你的问题,请参考以下文章

基于MATLAB给数据点添加高斯噪声

用matlab给图像加高斯噪声和椒盐噪声(不调用imnoise函数)

我用matlab中的imnoise函数给图像加椒盐噪声为啥产生的噪声不是黑白的?

如何从 MATLAB 中的图像中去除高斯噪声?

图像质量评价:合成失真图像方法

怎样用matlab实现加入高斯噪声、椒盐噪声、脉冲噪声和乘性噪声,然后采取合适的滤波器进行去噪处理~~~~