PX1=PX1+1;
end
PX2=x;
while((Blue_x(1,PX2)<3)&&(PX2>PX1))
PX2=PX2-1;
end
subplot(2,3,3),plot(Blue_x);grid
title('X方向统计')
%对车牌区域的修正
PX1=PX1-2;
PX2=PX2+2;
Plate=I(PY1:
PY2,PX1-2:
PX2,:
);
subplot(2,3,5),imshow(Plate);
title('车牌显示');
imwrite(Plate,'chepai.bmp');
程序输出结果如下:
图4.1车牌定位结果
4.4图像的预处理
4.4.1预处理方法流程
由于本系统的车牌图像是在室外进行拍摄,因此不可避免地会受到自然季节、光线等因素的影响。
光照条件影响车牌图像的对比度,车辆外表环境会带来不必要的影响,车辆行驶状态也会影响到车牌的正常结构等;要去除这些干扰就得先对车牌图像进行预处理,预处理阶段处理的好坏直接影响到车牌提取与分割以及车牌字符识别的准确性[4][6-7][11][33]。
本文的图像预处理算法流程如图4.2所示
4.4.2图像的灰度化
通过摄像头采集的车牌图像是彩色的,图像包含了大量的颜色信息,对系统的存储与处理能力要求比较高,且存在色差。
经常会出现图像的灰度范围[a,b]没有利用显示装置所允许的最大灰度范围[c,d]这样的情况,从而导致图像的对比度太低,使一些细节不易被观察到。
而解决这个问题的最简单的方法是进行灰度的线性变换,可有如下数学式表达:
图4.2预处理算法流程
假定原图像f(x,y)的灰度范围为[a,b],变换后图像g(x,y)的灰度范围希望扩展到[c,d],线性变换表示式为:
4.1
对灰度作线性变换以后,把原始图像f(x,y)的灰度范围[a,b]强行扩展为显示装置所允许的最大灰度范围[c,d],从而提高了整幅图像的对比度,原来观察不到的一些图像细节可能突出了。
灰度变换函数为:
I1=rgb2gray(I)
效果图如下:
原始图像灰度图像
图4.3灰度处理
4.4.3中值滤波
数字图像中往往存在各种类型的噪声,产生噪声的途径与生成图像的方法有关。
对于数字图像,获取数据的设备、扫描操作以及电子传输等都可能引起噪声。
工具箱提供了多种方法来减少和删除图像中的噪声,常用的方法有线性滤波、中值滤波和自适应滤波。
本文用中值滤波方法可以有效去除图像中的噪声点,同时保护图像边缘的细节。
中值滤波是一种非线性滤波,通过在图像上移动一个滑动窗口,它把邻域内的所有像素按灰度值进行排序,然后取中间值作为窗口中心位置的象素值[13]。
因此关键在于滑动窗口的选取,本文采用3×3方形窗口进行滤波。
使用中值滤波器去除噪声的方法有很多,常用的一种方法是先使用小尺度邻域,后逐渐加大邻域尺寸进行处理;也可以交替使用一维滤波和二维滤波进行处理。
此外还有对输入图像反复进行迭代操作,直到输出不再有变化为止[6][8][13]。
中值滤波的突出优点是不仅消除噪声,还能很好的消除图像中孤立噪声点的干扰,有效的保护边界信息。
可以用函数imfilter来进行中值滤波:
rgb2=imfilter(rgb,H)
其中H表示滤波器的种类,中值滤波的H可以设为
,滤波结果如下:
图4.4中值滤波结果
4.4.4图像的二值化及其阀值处理
车牌二值化是识别图像的一个关键步骤,其目的是得到鲜明分离目标和背景的二值图[32]。
原始图像的数据一般比较大,对其进行处理的时间也较长,而由于实时性的要求,车牌的提取需要一次性处理就能把绝大多数特征提取出来,要求转化的结果图像不丢掉有用的形状信息,产生额外的空缺,必须具有良好的保形性等。
把得到的图像转化为二值图像,这样数据量就会大大减少。
在车牌识别中,通过图像的二值变化将车牌与背景分割开来,其关键在于确定合适的阀值。
阈值设置过小易产生噪声,阈值设置过大会降低分辨率,使非噪声信号被视为噪声而滤掉。
考虑到车牌字符具有规律性排列的特点,字符和牌照底色在灰度值上存在突变,因此选取了初始阈值进行图像二值化处理。
其原理是统计每幅图像灰度的分布特性,阈值设为T=(fmax+fmin)/2,fmax,fmin为图像中最大和最小灰度值。
在MATLAB中用函数im2bw来进行图像二值化处理。
二值化结果如图4.4所示。
图4.5图像二值化
4.4.5图像倾斜矫正
汽车行驶速度较快可能会导致拍摄到的车辆图像有一定的倾斜度,为保证图像的正确处理,需要对其进行倾斜度矫正[9-10][14][33]。
通过对大量的车牌图像进行观察,可以认为车牌图像,存在两种角度倾斜,一种是当车牌由于悬挂或者摄像的原因倾斜角度过大时,异致车牌图像存在一定的倾斜角度。
另一种是由于图像采集设备本身存在倾斜,导致同一采集设备采集到的图像都有相同的倾斜角度。
对于倾斜的车牌,一般的做法是从拍照中提取其倾斜度,加以处理。
常常使用Hough变换检测图像中的直线,对图像进行相应的矫正来处理倾斜问题。
虽然这种方法具有一定的抗干扰能力且易于实现,但计算过大,处理时间长,对要求存储空间较大,一般不适合应用于具有实时特性的图像处理。
因此,本文采用选择Radon变换进行实时图像处理。
Radon变换,就是将图像变换为由它在各个角度的投影表示。
图像f(x,y)在任一角度
上的定义为:
4.2
其中:
4.3
MATLAB中用radon函数进行radon变换计算,在指定的角度来检验图像对象的直线线性。
R=radon(I,theta)得到图像I在角度theta范围内的radon变换。
若theta是一个数值,那么角度theta的radon变换就返回一个向量R;如果theta是一个向量,那么就返回一个矩阵R,R的每一列对应一个角度的投影。
theta的缺省值为[0:
179]。
根据Radon变换的程序结果,上图的倾斜角度为6.1061,旋转后结果如下:
:
图4.6radon倾斜校正
4.4.6形态学处理
二值化后的图像有字符可能出现字符断裂等现象。
通过对图像的形态学腐蚀、膨胀、开运算、闭运算等操作,连通字符,去除铆钉和边框的非字符区域,使字符显示连通平滑的边界,为后续处理提供较好的图像。
具体操作如下[35]:
I=imread('chepai.bmp');
I1=rgb2gray(I);%转换成灰度图像
s=strel('disk',25);%建立结构元素
rgb2=imopen(I1,s);%开运算
rgb3=imsubtract(I1,rgb2);%除去背景
h=[000,0.50,0.50];
rgb5=imfilter(rgb3,h);%垂直滤波
fmax1=double(max(max(rgb5)));
fmin1=double(min(min(rgb5)));
level=(fmax1-(fmax1-fmin1)/2)/255;%寻找二值化阈值
rgb4=im2bw(rgb5,level);%二值化
bw=bwareaopen(rgb4,600);%面积开运算,滤去面积小的非车牌区域
I=medfilt2(bw,[3,3]);%中值滤波
预处理后结果如下:
图4.7预处理结果
根据车牌底色等有关的先验知识,采用彩色像素点统计的方法分割出合理的车牌区域。
下面以蓝底白字车牌区域为例说明彩色像素点统计底色分割法。
CCD摄像头拍摄的图像一般为RGB彩色图像(如图4.1a),确定车牌底色(蓝色)RGB对应的各自灰度范围,然后行方向统计在此颜色范围内的像素点数量如图4.1b,设定合理阙值,确定车牌在行方向的合理区域如图4.1c。
然后,在分割出的行区域内,统计列方向蓝色像素点的数量如图4.1d。
最终车牌的完整区域如图4.1e
定位提取车牌的程序如下:
clear;
closeall;
I=imread('car.bmp');
[y,x,z]=size(I);
myI=double(I);
%%%%%%%%%%%RGBtoHSI%%%%%%%%
tic%测定算法执行的时间,开始计时
%%%%%%%%%%%统计分析%%%%%%%%%%%%%%%
%%%%%%%%Y方向%%%%%%%%%%
Blue_y=zeros(y,1);
fori=1:
y
forj=1:
x
if((myI(i,j,1)<=30)&&((myI(i,j,2)<=62)&&(myI(i,j,2)>=51))&&((myI(i,j,3)<=142)&&(myI(i,j,3)>=119)))
%蓝色RGB的灰度范围
Blue_y(i,1)=Blue_y(i,1)+1;%蓝色象素点统计
end
end
end
[tempMaxY]=max(Blue_y);%Y方向车牌区域确定
PY1=MaxY;
while((Blue_y(PY1,1)>=5)&&(PY1>1))
PY1=PY1-1;
end
PY2=MaxY;
while((Blue_y(PY2,1)>=5)&&(PY2PY2=PY2+1;
end
IY=I(PY1:
PY2,:
:
);
%%%%%%%%X方向%%%%%%%%%%
Blue_x=zeros(1,x);%进一步确定X方向的车牌区域
forj=1:
x
fori=PY1:
PY2
if((myI(i,j,1)<=30)&&((myI(i,j,2)<=62)&&(myI(i,j,2)>=51))&&((myI(i,j,3)<=142)&&(myI(i,j,3)>=119)))
Blue_x(1,j)=Blue_x(1,j)+1;
end
end
end
PX1=1;
while((Blue_x(1,PX1)<3)&&(PX1PX1=PX1+1;
end
PX2=x;
while((Blue_x(1,PX2)<3)&&(PX2>PX1))
PX2=PX2-1;
end
PX1=PX1-8;%对车牌区域的修正
PX2=PX2+8;
Plate=I(PY1:
PY2,PX1-2:
PX2,:
);
t=toc%读取计时
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
figure,imshow(I);
figure,plot(Blue_y);grid
figure,plot(Blue_x);grid
figure,imshow(IY);
figure,imshow(Plate);
imrite(Plate,’chepai.bmp’);
4.3车牌图像的预处理
4.3.1预处理流程
我们获得的车牌图像通常都是彩色图像,由于这些彩色图像尺寸不一、干扰噪声大,而且需要很大的存储开销,所以首先要对它进行预处理。
车牌图像的预处理是车牌识别中一个非常重要的模块,直接影响到后续车牌字符分割、字符特征提取和字符识别的效果。
通过车牌图像预处理模块,不但能去除图像噪声、提高图像质量、降低车牌字符识别中要遇到的各种阻扰因素,而且可以有效地降低系统的存储空间需求。
本文的预处理流程如图4.2所示:
4.3.2图像的灰度化
一般所采集的车牌图像都是通过数码相机拍摄获取的,因此预处理前的图像都是彩色图像。
彩色图像又称RGB图像,它是利用R、G、B三个分量表示一个像素的颜色,R、G、B分别代表红、绿、蓝三种颜色,通过这三个基本色可以合成出任意的颜色。
因此,对一个尺寸为M*N大小的彩色图像来说,存储该图像需要一个M'N*3的三维数组。
彩色图像包含了大量的颜色信息,不但在存储空间上开销很大,而且在处理上也会降低系统的执行速度。
因为图像的每个像素都具有R、G、B三个不同的颜色分量,识别上并用不着其中很多无关的信息,这对进一步的识别也是不利的。
因此,在对图像进行进一步的处理之前,需要将彩色图像转换成为灰度图像,目的就是为了节省存储空间和加快处理速度。
在RGB模型中。
如果R=G=B,则颜色表示一种灰度颜色,其中R=G=-B的值叫做灰度值。
而由彩色图像转换为灰度图像的过程就叫做图像的灰度化处理。
灰度图像就是只有强度信息,而没有颜色信息的图像。
存储一个灰度图像只需要一个二维的矩阵,矩阵的每个元素表示对应位簧的像素的灰度值。
彩色图像的像素色为RGB(R,G,B)。
灰度图像的像素色为RGB(r,r,r),R、G、B可由彩色图像的颜色分解获得。
R、G、B的取值范围为0-255,所以灰度的级别只有256级。
扶度化的处理方法主要采用加权平均值法:
根据某个指标例如重要性给R、G、B赋予不同的权值,井使R、G、B等于它们的值的加权和平均。
即:
(1)
其中,WR,WG,WB分别是R、G、B的权值。
由于人眼对绿色的敏感度最高,对红色的敏感度次之,对蓝色的敏感度域低,研究表明.当
时,可以得到由彩色图像转换过来的最合理的灰度图像。
处理程序如下:
clearall
I=imread('chepai.bmp');
I2=rgb2gray(I);
imshow(I);
figure,imshow(I2);
imwrite(I2,’gray.bmp’)
效果图如图4.3:
4.4.3图像增强
由于灰度化得到的图像比较暗淡,可能会造成滤波效果不佳最终导致二值化效果不理想,因此进行一次基于灰度变换的方法增强图像的对比度。
运行结果对比如图4.4:
实现程序如下:
I=imread('gray.bmp');
imshow(I);
figure,imhist(I);
J=imadjust(I,[0.150.9],[01]);
figure,imshow(J);
figure,imhist(J);
imwrite(J,'huiduzengqiang.bmp')
4.4.4中值滤波
数字图像中往往存在各种类型的噪声,产生噪声的途径与生成图像的方法有关。
对于数字图像,获取数据的设备、扫描操作以及电子传输等都可能引起噪声。
工具箱提供了多种方法来减少和删除图像中的噪声,常用的方法有线性滤波、中值滤波和自适应滤波。
本文用中值滤波方法可以有效去除图像中的噪声点,同时保护图像边缘的细节。
中值滤波是一种非线性滤波,通过在图像上移动一个滑动窗口,它把邻域内的所有像素按灰度值进行排序,然后取中间值作为窗口中心位置的象素值[20]。
因此关键在于滑动窗口的选取,本文采用3×3方形窗口进行滤波。
使用中值滤波器去除噪声的方法有很多,常用的一种方法是先使用小尺度邻域,后逐渐加大邻域尺寸进行处理;也可以交替使用一维滤波和二维滤波进行处理。
此外还有对输入图像反复进行迭代操作,直到输出不再有变化为止[7][16][20]。
中值滤波的突出优点是不仅消除噪声,还能很好的消除图像中孤立噪声点的干扰,有效的保护边界信息。
可以用函数imfilter函数来进行中值滤波:
RGB2=imfilter(RGB,H)
(2)
其中H表示滤波器的种类,中值滤波的H可以设为
,滤波结果如下:
处理程序如下:
clearall
I=imread('huiduzengqiang.bmp');
hsize=[3:
3]
H=fspecial('average',hsize);
I2=imfilter(I,H);
figure,imshow(I);
figure,imshow(I2);
imwrite(I2.'lvbo.bmp');
4.4.5图像的二值化
二值化图像是指整幅图像画面内只有黑、白两个颜色的图像。
图像二值化算法原理比较简单,即选定一个阈值,当灰度图像某像素的亮度值低于该阈值时,我们设该像素值为0;当灰度图像某像素的亮度值大于等于该阈值时,我们就设该像素值为1,这样我们就完成了二值化的过程。
(3)
其中,B为二值图像某像素的像素值,L为该像素在灰度图像中对应的灰度值,
为选定的阈值。
关于阈值
如何选取,主要有三类方法:
全局阈值法、局部阈值法和动态阈值法。
常见的算法有Ostu法[11]和熵函数法,但是都需要运算较长的时间。
因此,通常采用平均值的办法进行二值化,取阈值为TH,如式(4)所示:
(4)
其中,G(i,j)为像素灰度值,X为图像宽度,Y为图像高度。
系数N可根据三种情况确定:
A.整幅图像背景几乎没有干扰,平均值很小;
B.整幅图像背景有干扰,平均值较大;
C.整幅图像光照很暗,平均值中等。
图4.5为二值化处理之后的结果:
处理程序如下:
clearall;
I=imread('lvbo.bmp');
I2=im2bw(I);
figure,imshow(I);
figure,imshow(I2);
imwrite(I2,'bw.bmp');