基于MATLAB的图像研究
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于MATLAB 的图像研究
直方图均衡化处理
基本原理
在实际应用中,希望能够有目的地增强某个灰度区间的图像, 即能够人为地修正直方图的形状, 使之与期望的形状相匹配,这就是直方图规定化的基本思想。换句话说,希望可以人为地改变直方图形状,使之成为某个特定的形状,直方图规定化就是针对上述要求提出来的一种增强技术,它可以按照预先设定的某个形状来调整图像的直方图。每一可能的灰度层次所占的像素个数尽量均等,每个像素具有同样的显示机会,从而使图像细节清晰,改善图像的整体对比度。
直方图及其均衡化结果
0.005
0.010.0150.020.025
00.005
0.010.0150.020.025
图1 直方图及其均衡化
空域图像处理
均值滤波
对一些图像进行线性滤波可以去除图像中某些类型的噪声。领域平均法就是一种非常适合去除通过扫描得到的图像中的噪声颗粒的线性滤波。
领域平均法是空间域平滑噪声技术。对于给定的图像()j i f ,中的每个像素点
()n m ,,取其领域S 。设S 含有M 个像素,取其平均值作为处理后所得图像像素
点()n m ,处的灰度。用一像素领域内各像素灰度平均值来代替该像素原来的灰度,即领域平均技术。
领域S 的形状和大小根据图像特点确定。一般取的形状是正方形、矩形及十字形等,S 的形状和大小可以在全图处理过程中保持不变,也可以根据图像的局部统计特性而变化,点(m,n)一般位于S 的中心。如S 为3×3领域,点(m,n)位于S 中心,则
()()∑∑-=-=++=111
1
,91,i j j n i m f n m f
中值滤波
中值滤波是一种非线性滤波,由于它在实际运算过程中并不需要图像的统计特性,所以比较方便。但是对一些细节多,特别是点、线、尖顶细节多的图像不宜采用中值滤波的方法。中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替。
设有一个一维序列1f ,,…,n f ,取窗口长度为m(m 为奇数),对此序列进行中值滤波,就是从输入序列中2f 相继抽出m 个数,v i f -,…,1-i f ,…,1f ,…,
1+i f ,…,v i f +,其中i 为窗口的中心位置,2
1
-=
m v ,再将这m 个点按其数值大小排列,取其序号为正中间的那作为输出。用数学公式表示为:
{}v i i v i i f f f Med Y +-=,,,,ΛΛ
2
1
,-=
∈m v Z i
在进行滤波前,首先给图像添加噪声,在此,给图像添加高斯噪声和椒盐噪声,并进行均值滤波和中值滤波得到图像如下:
加入高斯噪声后图像加入椒盐噪声后图像
高斯噪声下均值滤波椒盐噪声下均值滤波
高斯噪声下中值滤波椒盐噪声下中值滤波
图2高斯噪声与椒盐噪声下的均值滤波与中值滤波
结果分析
中值滤波和均值滤波后,都残留一些噪点,但是均值滤波残留的噪点量要明显小于中值滤波。说明均值滤波对于线性的高斯噪声的滤波效果要优于中值滤波。
图像锐化
图像锐化的基本概述
图像在传输过程中,通常质量都要降低,除了噪声因素外,图像一般都要变得模糊。这主要是因为图像的传输或转换系统的传递函数对高频成分的衰减作用,造成图像的细节轮廓不清晰。图像锐化就是使灰度反差增强,从而增强图像中边缘信息,有利于轮廓抽取。因为轮廓或边缘就是图像中灰度变化率最大的地
方。因此,为了把轮廓抽取出来,就是要找一种方法把图像的最大灰度变化处找出来。
在拉普拉斯算子下的空域锐化结果如下:
拉普拉斯滤波图像(ui nt8)拉普拉斯滤波图像(doubl e)
原始图像中减去ui nt8原始图像中减去doubl e
图3 拉普拉斯算子下的空域锐化结果
频域图像处理
频率域平滑处理就是选择合适的低通滤波器对其频谱成分进行调整,然后经逆傅立叶变换得到平滑图像。其中常用的频率域平滑处理方法一般为频率域低通滤波法。频率域低通滤波是在分析图像信号的频率特征性时,一幅图像中的边缘、跳跃部分以及颗粒噪声代表图像信号的高频分量,而大面积的背景区则代表图像信号的低频分量。用滤波的方法滤除其高频部分就能去除噪声,使图像得到平滑。
Butterworth 滤波器下的平滑锐化处理
0.2
0.40.60.81
图4 频域低通滤波(平滑)
0.20.40.60.8
图5 频域高通滤波(锐化)
附录
%%%%%%%%%直方图及其均衡化
clear;
I=imread('peng.jpg');
I=rgb2gray(I);
I2=I;
add=[];
add1=[];
tab1=zeros(1,256);
tab2=zeros(1,256);
for n=0:255
X=I==n;
add=[add;sum(sum(X))];
end;
[a,b]=size(I);
final=add/(a*b);
for n=1:256
for i=1:n
tab1(n)=tab1(n)+final(i);
end;
end;
tab1=tab1*255;
tab2=round(tab1);
for n=1:a
for m=1:b
for t=0:255
if I(n,m)==t
I2(n,m)=tab2(t+1);
end;
end;