摘 要:本实验主要实现图像的加噪和去噪。模拟数字图像的噪声主要由于噪声广泛存在于图像的产生和传输过程。图像传感器的工作情况受各种因素的影响,如图像的获取中的环境条件和传感器自身的质量。图像在传输过程中主要由于所用的传输信道的干扰而受到噪声污染。在本次实验的加噪过程中使用的是椒盐噪声,有时也被称为脉冲噪声、散粒噪声或尖峰噪声。脉冲噪声主要表现在成像中的短暂停留中,例如错误的开关操作。去噪过程中采用了3 3中值滤波算法。中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值。该方法被广泛使用于各种随机噪声的去除。
数字图像的噪声主要来源于图像的产生和传输过程。图像传感器的工作情况受各种因素的影响,如图像的获取中的环境条件和传感器自身的质量。图像在传输过程中主要由于所用的传输信道的干扰而受到噪声污染。
首先定义椒盐噪声的概率密度函数:
对于尺寸为的输入图像,我们假设每个像素点变成胡椒噪声或盐粉噪声的概率分别为和 。
噪声脉冲可以是正的,也可以是负的。标定通常是图像数字化过程的一部分。因为脉冲干扰通常与图像信号的强度相比较大,因此在一幅图像中,脉冲噪声总是数字化为最大值(纯白或纯黑)。这样,通常假设a和b为饱和值。从某种意义上看,在数字化图像中,它们等于所允许的最大值和最小值。对于一个8位图像,这意味着a=255(白),a=0(黑)。
在实际处理中,可以生成一个与尺寸为的输入图像相对应的矩阵,该矩阵中每个元素都为0到1之间的随机数,这样可以规定 、 两个区间内的元素相对应的输入图像的元素分别变成 (白)和 (黑),在MATLAB中使用find()函数可以找出这些元素的坐标。
图1给出添加了椒盐噪声的图像的直方图,当概率 和 取值越大,则各像素点取灰度值为0和255的概率越大。
图1 椒盐噪声图像及其直方图
由于本实验所用的中值滤波器是顺序统计滤波器中的一种,因此需要介绍一下统计滤波器的相关知识。
顺序统计滤波器这是一种非线性的空间滤波器,它的响应基于图像滤波器包围的图像区域中像素的排序,然后由统计排序结果决定的值代替中心像素的值。
一个数值集合的中值K 是这样的数值,即在数值集合中,有一半小于或等于K ,还有一半大于或等于K 。对于一幅图像,对某个像素点做中值滤波处理,必须先将掩膜内欲求的像素点及其领域的像素值排序,确定出中值,并将该中值赋予该像素点。例如,对于一个3×3的区域,其中值就是第五个值,而在一个5×5的区域中,中值就是第十三个值。而当一个领域中的所有像素值相同时,它们中的任何一个都可以作为中值。中值滤波器的主要功能是使拥有不同灰度的点看起来更接近于它的临近值,以下给出一个取中值的过程。
对于一个3×3的矩阵,需要将其映射到一个一列或一行的矩阵再进行排序,在MATLAB中可以调用reshape(A,m,n)和sort(X)函数,函数的功能如下所示:
reshape(A,m,n) 功能:返回一个m*n的矩阵B,B中元素是按列从A中得到的。
sort(X) 功能:返回对向量X中的元素按列或按行升序排列的新向量。
在调用reshape(A,m,n)时需注意A的表示。当第一个参数为A时表示按照列优先进行排列,若想按矩阵的每一行进行排列,需改为A',如图2所示。
图2 reshape(A,m,n)的不同用法
sort(X)的功能如图3所示。
图3 sort(X)的用法
编写函数salt_pepper(ima,a,b)产生椒盐噪声,其中ima为输入图像,a,b分别是两个噪声分量的概率值。本实验要求a,b取0.2,即各像素点产生胡椒噪声和盐粉噪声的概率均为20%。
在程序中通过定义两个区间,当随机矩阵A中元素值在0到a区间时判定为胡椒微粒,在(1-b)到1区间时判定为盐粉微粒,并使用find()函数求出这些元素的位置,映射到原图像ima上,输出带有椒盐噪声的图像imt,图4给出a,b取不同值时的加噪图像的效果图。
图4 a,b取不同值时的加噪图像效果图
对比图4中的噪声图像易知,当a和b的取值越大,图像上叠加的胡椒和盐粉噪声越多,在实际使用中可以根据需要调整a和b的取值。当a和b取值过大,图像的有用信号将被淹没在噪声信号中。
下面验证中值滤波法滤除椒盐噪声的效果,噪声系数为0.2。
由图5所示,对加噪图像进行一次3×3中值滤波处理后,噪点明显减少,且图像能保留大部分的细节,但噪声污染依然严重,因此验证对图像进行多次中值滤波的可行性。而从图6可以看出,多次中值滤波可以有效滤除椒盐噪声点,图像经过多次滤波后效果越来越好。
像素点原始值包含在中值的计算结果中,中值滤波器的应用也非常普遍。对于很多种随机噪声,它都有良好的去噪能力,而且在相同尺寸下比起线性平滑滤波器引起的模糊较少。正如本实验输出图像所示,中值滤波器对椒盐噪声干扰的图像有非常好的处理效果。
但是,中值滤波存在一个无法解决的问题:图像的边缘部分噪声无法滤除。对于尺寸为M×N的图像,中值滤波算法只作用于[2,M-1]和[2,N-1]区间的像素点,而无法改善边缘一圈的像素点。
本实验使用冈萨雷斯主编数字图像处理第三版中的素材Fig5.07(a).jpg进行加噪处理,并对噪声图像进行中值滤波,验证中值滤波法的有效性。
图5 对加噪图像进行一次3×3中值滤波的效果
图6 对加噪图像进行多次中值滤波
下面给出简单的MATLAB代码:
% 编写函数salt_pepper()产生椒盐噪声
% ima为,a,b分别是两个噪声分量的概率值
function imt = salt_pepper(ima,a,b)
imt=ima;
[m,n]=size(ima);
A=rand(m,n); % 生成一个m*n尺寸的矩阵,每个元素为[0,1]之间的随机值
% 当A中元素值小于a时判定为胡椒微粒
B=find(A<=a); % find()函数找出符合条件的元素的位置,B存储这些位置
imt(B)=0; % 属于位置B中的元素产生胡椒微粒
% 当A中元素值大于1-b时判定为盐分微粒
B=find(A>=1-b);
imt(B)=255; % 属于位置B中的元素产生盐分微粒
return
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 中值滤波主程序
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function proj05()
ima=imread('Fig5.07(a).jpg');
subplot(2,3,1),imshow(ima),title('输入图像');
sp_imt = salt_pepper(ima,0.1,0.1); % 调用自编函数,两个噪声分量的概率值均为0.2
%subplot(2,3,2),
imshow(sp_imt),title('输入参数0.2,0.2的椒盐噪声图像');
% sp_imt = salt_pepper(ima,0.05,0.05); % 调用自编函数,两个噪声分量的概率值均为0.2
% subplot(1,3,2),imshow(sp_imt),title('输入参数0.05,0.05的椒盐噪声图像');
%
% sp_imt = salt_pepper(ima,0.02,0.02); % 调用自编函数,两个噪声分量的概率值均为0.2
% subplot(1,3,3),imshow(sp_imt),title('输入参数0.02,0.02的椒盐噪声图像');
output = sp_imt; % output为待处理图像
[xs,ys]=size(sp_imt);
% 3*3中值滤波
for i=2:xs-1 % 在图像的[2,xs-1],[2,ys-1]区域取3×3的方格求中值
for j=2:ys-1
m=1;
n=1;
for x=i-1:i+1
for y=j-1:j+1
block(m,n)=sp_imt(x,y); % 求出点(i,j)处的3×3方格,存在block中
n=n+1;
end
m=m+1;
n=1;
end
% 将3×3矩阵块排列成一维数组,然后再进行大小排列和中值提取
medianfilter = reshape(block',9,1); % block为列优先,在排列时要求行优先,需改为block'
queue = sort(medianfilter); % 返回对向量One中的元素按列升序排列的新向量。
median = queue(5); % 在3*3模版中,第五个值为中值
output(i,j)=median; % 将各点中值赋给输出图像output
end
end
%subplot(2,3,3);
imshow(output),title('3*3中值滤波后的图像');