图像去噪是数字图像处理中最为关键的环节,去噪效果的好坏也会影响到图像的后续处理,比如图像分割、特征提取、目标识别等。数字图像在产生和传输过程中都可能会受到噪声的破坏,一般有高斯噪声、脉冲噪声、泊松噪声等。在进行数字图像去噪实验时,我们经常使用MATLAB工具去实现,本文主要讲解的是如何使用MATLAB对上述噪声进行模拟仿真。
1、高斯噪声
高斯噪声,从字面含义上可以看出,其概率密度函数服从高斯高分。如果某噪声,其幅度分布服从高斯分布,而它的功率谱密度服从均匀分布,那么称此噪声为高斯白噪声。在数字图像中,高斯噪声产生的原因主要有图像传感器在拍摄时市场不够明亮、亮度不均匀,电路各元器件自身噪声或者图像传感器长期工作而造成温度过高等造成的。
在MATLAB中,我们可以通过下述程序对其进行模拟仿真。
sigma = 30; % noise variance
InputImg = double(imread('Lena.gif'));
randn('seed', 0)
NoiseImg = InputImg + sigma*randn(size(InputImg));
figure(1);
subplot(121); imshow(InputImg,[]); title('Clear Image')
subplot(122), imshow(NoiseImg,[]); title('Noise Image')
执行效果:
2、脉冲噪声
脉冲噪声产生的原因通常是由传感器单元中的死像素、硬件中的内存位置错误或者数字转换器错误等引起的。脉冲噪声分为两种类型,即椒盐噪声(salt & pepper noise (SPN))和随机值脉冲噪声(random-valued impulse noise (RVIN))。椒盐噪声是一种随机出现的白点或黑点,可能在亮的区域有黑色像素或者在暗区域有白色像素。在灰色图像中,常表现为最大灰度值或最小灰度值,即0或255。随机值脉冲噪声的噪声灰度值主要是在最小灰度值和最大灰度值的范围内的任意值,即在[0 255]中的任一个灰度值。
在MATLAB中,可以使用下述程序对其进行模拟仿真。
function [img,Narr] = impulsenoise(varargin)
%% input
% img: Given an image (noise free image)
% ND : Noise denosity (the value of ND varies from 1 to 1)
% NT : Noise type (0 - salt & pepper noise; 1 - random value impulse noise)
%% output
% img : impluse noise image
%% Example
% NoiseImg = impulsenoise(InputImg, 0.4, 0)
if length(varargin) == 1
img = varargin{1};
ND = 0.2;
NT = 0;
elseif length(varargin) > 1 && length(varargin) < 3
img = varargin{1};
ND = varargin{2};
NT = 0;
elseif length(varargin) == 3
img = varargin{1};
ND = varargin{2};
NT = varargin{3};
else
disp('not enough input parameter');
img = 0;
return;
end
rand('seed', 0)
Narr = rand(size(img));
if isempty(NT) || NT == 0
img(Narr<ND/2) = 0;
img((Narr>=ND/2)&(Narr<ND)) = 255;
elseif NT == 1
N = Narr;
N(N>=ND)=0;
N1 = N;
N1 = N1(N1>0);
Imn=min(N1(:));
Imx=max(N1(:));
N=(((N-Imn).*(255-0))./(Imx-Imn));
img(Narr<ND) = N(Narr<ND);
else
disp('Invalid selection');
end
执行效果:
3、泊松噪声
泊松噪声是指噪声分布服从泊松分布模型。关于泊松分布的详细解释可以参考下述网址:
https://zh.wikipedia.org/wiki/%E6%B3%8A%E6%9D%BE%E5%88%86%E4%BD%88
在MATLAB中,可以使用下述代码进行模拟仿真:
InputImg = double(imread('Lena.gif'));
quantum_well_depth = 150;
PhotoelectronsImg = round(InputImg*quantum_well_depth/2^8);
NoiseImg = poissrnd( PhotoelectronsImg);
figure(3),
subplot(121), imshow(InputImg,[]), title('Clear Image')
subplot(122), imshow(NoiseImg,[]), title('Poisson Noise Image')
执行效果:
来源:https://blog.csdn.net/xuehuitanwan123/article/details/100146310