📜  使用MATLAB估计噪声图像中的高斯噪声

📅  最后修改于: 2022-05-13 01:55:02.127000             🧑  作者: Mango

使用MATLAB估计噪声图像中的高斯噪声

噪点是不需要的东西,很难观察图像中的细节。图像噪声是图像中亮度或颜色信息的随机变化,通常是电子噪声的一个方面。它可以由扫描仪或数码相机的图像传感器和电路产生。

不希望有的电波动也称为“噪声”。

常见的噪音类型:

  • Rician 噪声: Rician 噪声是幅值 MRI 图像采集过程中固有的一种伪影,使诊断变得困难。
  • 周期性噪声:图像中常见的周期性噪声来自图像捕获过程中某个点的电气或机电干扰。受周期性噪声影响的照片看起来像是在原始图像之上引入了重复样本。在频域中,这种噪声可能表现为离散尖峰。这种噪声的显着降低可以通过在频域中使用陷波滤波器的方式来完成。
  • 椒盐噪声:这是在图像中随机创建纯白色或黑色(高/低)像素的结果。这在尖端图像传感器中很少见,即使在相机传感器故障的形式中通常可以最大程度地看到(热像素通常在最大深度或坏点通常可以是黑色)。这种噪声也称为脉冲噪声。
  • 高斯噪声:在这种情况下,图像信号在其期望值附近的随机变量遵循高斯或正态分布。这是图像处理中最常用的噪声模型,成功地描述了图像处理管道中遇到的大多数随机噪声。这种噪声也称为加性噪声。

椒盐噪声

周期性噪声

高斯噪声

高斯噪声是概率密度函数(PDF) 等于正态分布的统计噪声,也称为高斯分布。换句话说,噪声可以采用的值是高斯分布的。这种噪音的平均值约为。零。有时它被称为零均值高斯噪声。



例子:

Matlab
% MATLAB code for gaussian noise 
% Reading the color image.
image=imread("img2.jfif");
  
% converting into gray.
image=rgb2gray(image);
  
% create the random gaussian noise of std=25
gaussian_noise=25*randn(size(image));
  
% display the noise
imtool(gaussian_noise,[]);
  
% display the gray image.
imtool(image,[]);


Matlab
% MATLAB code for demonstration of gaussian 
% noisy image 
% Reading the color image.
image=imread("k1.jfif");
  
% converting into gray.
image=rgb2gray(image);
  
% create the random gaussian noise of std=25
gaussian_noise=25*randn(size(image));
  
% display the gray image.
imtool(image,[]);
  
% add noise to the original image
noisy_image=double(image)+gaussian_noise;
  
% display the noisy image
imtool(noisy_image,[]);


Matlab
% MATLAB code for estimate the level of Gaussian
% noise in the given image manually
% Reading the color image.
image=imread("cameraman.jpg");
  
% converting into gray.
image=rgb2gray(image);
  
% create the random gaussian noise of std=25
gaussian_noise=25*randn(size(image));
  
% add noise to the original image
noisy_image=double(image)+gaussian_noise;
  
% display the noisy image
imtool(noisy_image,[]);


Matlab
% MATLAB code for homogeneous part of the image
% and find the standard deviation of that part,
% it will give us the estimation of gaussian 
% noise in the noisy image. 
image=imread("cameraman.jpg");
  
% create the random gaussian noise of std=25
gaussian_noise=25*randn(size(image));
  
% display the gray image.
imtool(image,[]);
  
% add noise to the original image
noisy_image=double(image)+gaussian_noise;
  
% display the noisy image
imtool(noisy_image,[]);
  
% crop the homogeneous part of the noisy image.
% display the cropped part.
imtool(cropped_image,[]);
  
% standard deviation of the noise.
std(noise(:))
  
% standard deviation of cropped homogeneous part.
std(cropped_image(:))


Matlab
% MATLAB code for automate the estimation 
% of gaussian noise in the image
image=imread("cameraman.jpg");
  
% create the random gaussian noise of std=25
gaussian_noise=25*randn(size(image));
  
% add noise to the original image
noisy_image=double(image)+gaussian_noise;
  
% std of noise.
std(noise(:)) %output=25.1444
  
% list of std by using a sliding filter of [5 5].
list_of_std=uint8(colfilt(noisy_image, [5 5], 'sliding', @std));
  
% print the mode of this std list.
mode(list_of_std(:))


输出:

例子:

MATLAB

% MATLAB code for demonstration of gaussian 
% noisy image 
% Reading the color image.
image=imread("k1.jfif");
  
% converting into gray.
image=rgb2gray(image);
  
% create the random gaussian noise of std=25
gaussian_noise=25*randn(size(image));
  
% display the gray image.
imtool(image,[]);
  
% add noise to the original image
noisy_image=double(image)+gaussian_noise;
  
% display the noisy image
imtool(noisy_image,[]);

输出:



现在我们看看如何手动估计给定图像中的高斯噪声水平。为此,我们首先生成噪声图像。

例子一:

MATLAB

% MATLAB code for estimate the level of Gaussian
% noise in the given image manually
% Reading the color image.
image=imread("cameraman.jpg");
  
% converting into gray.
image=rgb2gray(image);
  
% create the random gaussian noise of std=25
gaussian_noise=25*randn(size(image));
  
% add noise to the original image
noisy_image=double(image)+gaussian_noise;
  
% display the noisy image
imtool(noisy_image,[]);

输出:

高斯噪声本质上是可加的。这意味着要创建噪声图像,只需在原始图像中添加噪声。

然后,我们裁剪图像的同质部分并保存。现在找到那部分的标准偏差,它将为我们提供噪声图像中高斯噪声的估计。

例二:

MATLAB

% MATLAB code for homogeneous part of the image
% and find the standard deviation of that part,
% it will give us the estimation of gaussian 
% noise in the noisy image. 
image=imread("cameraman.jpg");
  
% create the random gaussian noise of std=25
gaussian_noise=25*randn(size(image));
  
% display the gray image.
imtool(image,[]);
  
% add noise to the original image
noisy_image=double(image)+gaussian_noise;
  
% display the noisy image
imtool(noisy_image,[]);
  
% crop the homogeneous part of the noisy image.
% display the cropped part.
imtool(cropped_image,[]);
  
% standard deviation of the noise.
std(noise(:))
  
% standard deviation of cropped homogeneous part.
std(cropped_image(:))

输出:



现在验证结果。将噪声的标准偏差与得到的结果相匹配。如果大致相等,则表示裁剪的同质部分是正确的,否则选择不同的同质部分。在图像中找到完美的同质部分需要专业知识。

这就是为什么手动估算是非常耗时的过程。接下来,我们将看到如何自动执行此操作。

如何自动估计图像中的高斯噪声?

我们将从图像中裁剪同质部分并计算它们的标准偏差。图像的同质部分将始终给出相同的标准偏差。因此,在许多标准偏差的列表中,最常出现的将属于同质部分,或者我们可以说是噪声。

因此,思路是取滑动窗口得到的标准差的众数。这是自动方法。

第一步:创建一个滑动窗口。将其滑过图像并找到它们的标准偏差。

第二步:找模式。

注意:仔细选择滑动窗口的大小。应该根据原始噪声图像的大小来选择它。通常,[5, 5] 窗口是最佳选择。

例子:

MATLAB

% MATLAB code for automate the estimation 
% of gaussian noise in the image
image=imread("cameraman.jpg");
  
% create the random gaussian noise of std=25
gaussian_noise=25*randn(size(image));
  
% add noise to the original image
noisy_image=double(image)+gaussian_noise;
  
% std of noise.
std(noise(:)) %output=25.1444
  
% list of std by using a sliding filter of [5 5].
list_of_std=uint8(colfilt(noisy_image, [5 5], 'sliding', @std));
  
% print the mode of this std list.
mode(list_of_std(:))

输出: