车牌识别 含源码

需要完整源码的可以联系我 

摘要

静态场景下的车辆识别主要是通过对车牌的识别完成的,车牌中包括车辆识别的所有信息,如车牌号,车牌颜色,车主所在地等。车牌系统使车辆管理更智能化,数字化,有效的提升了交通管理的方便性和有效性。车牌识别系统主要包括了图像采集、图像预处理、车牌定位、车牌分割、字符识别等五大核心部分。本文主要介绍车牌的检测部分,即图像预处理、车牌定位模块的实现方法。本文的图像预处理模块是将图像灰度化和用Roberts算子进行边缘检测的步骤。车牌定位和分割采用的是利用数学形态法来确定车牌位置,再利用车牌彩色信息的彩色分割法来完成车牌部位分割。本文即是针对其核心部分进行阐述并使用MATLAB软件环境中进行字符分割的仿真实验。

关键词:MATLAB、图像预处理、车牌定位、车牌分割

 

1.模块及其作用

 

 
   


车牌检测的整体模块框图如下图1所示:

图1 整体模块

2.车辆灰度化

汽车图像样本目前大多都是通过摄像机、数码相机等设备拍摄获取的,预处理前的图像都是彩色图像。真彩色图像又称RGB图像,它是通过R、G、B分量表示一个像素的颜色,R、G、B分别代表红、绿、蓝3种不同的颜色,三基色可以合成出任意颜色。而每个分量有可取255种值,这样一个像素点可以有1600多万(255*255*255)的颜色的变化范围。而灰度图像是R、G、B三个分量相同的一种特殊的彩色图像,每一个像素点的变化范围为255种,所以在数字图像处理中一般先将各种格式的图像转变成灰度图像以使后续的图像的计算量变得少一些。灰度图像的描述与彩色图像一样仍然反映了整幅图像的整体和局部的色度和亮度等级的分布和特征。所以,对一个尺寸为m*n的彩色图像来说,存储为一个m*n*3的多维数组。

由于彩色图像中包含着大量的颜色信息,使得彩色图像不但在存储上开销很大,而且在处理上也会降低系统的执行速度。因为图像的每个象素都具有三个不同的颜色分量,存在许多与识别无关的信息,不便于进一步的识别工作,所以在对图像进行识别等处理中,经常将彩色图像转变为灰度图像,以加快处理速度。

数字图像分为彩色图像和灰度图像。在RGB模型中,如果R=G=B,则颜色表示一种灰度颜色,其中R=G=B的值叫做灰度值。由彩色转换为灰度的过程叫做灰度化处理。灰度图像就是只有强度信息而没有颜色信息的图像,存储灰度图像只需要一个数据矩阵,矩阵每个元素表示对应位置像素的灰度值。彩色图像的像素色为RGB (R,G,B),灰度图像的像素色为RGB(r,r,r),R,G,B可由彩色图像的颜色分解获得,而R,,G,B的取值范围是0-255,因此灰度的级别只有256级。

对于将彩色图像转换成灰度图像时,目前比较主流的灰度化方法叫平均值法,公式为:H=0.229R+0.588G+0.144B,公式中H表示灰度图的亮度值;R代表彩色图像红色分量值;G代表色彩图像绿色分量值;B代表彩色图像蓝色分量值。RGB三分量前的系数为经验加权值。加权系数的取值建立在人眼的视觉模型之上。对于人眼较为敏感的绿色取较大的权值;对人眼较为不敏感的蓝色则取较小的权值。通过该公式转换的灰度图能够比较好地反应原图像的亮度信息。

在MATLAB中我们可以调用im2gray函数对图像进行灰度化处理。

 

 
   


结果:

图2原图与灰度图

3.边缘检测

边缘是图像灰度发生空间突变或者在梯度方向上发生突变的像素的集合。用摄像机采集到的机动车图像会受到噪声干扰以及车辆本身的影响,会使得获得的图像质量不理想。因此,在进行对汽车牌照的定位及字符识别之前需要先对车辆图像进行边缘检测处理,以提高图像的质量,使车牌易于后面的分割和识别。通过良好的边缘检测可以大幅度的降低噪声、分离出复杂环境中的车辆图像、保留完好的车牌字符信息,方便了后面的车牌精确定位与字符识别。

由于车牌识别系统摄像头安装位置固定以及机动车车牌的固有属性,我们可以发现机动车车牌图像都处在水平的矩形区域,在图像中位置较为固定,车牌中字符都是按水平方向排列。因为有这些明显的特征,经过适当的图像变换,是可以清晰的呈现出车牌的边缘的。本文采用Roberts边缘检测算子来对图像进行边缘检测。检测完毕,对车牌进行定位。

4.车牌定位

该系统的摄像头拍摄的图片是整个机动车以及周围环境的图片,而只有车牌部分是对系统有用的。所以我们要对照片进行车牌定位和分割。车牌的定位和分割是从经过图像预处理后的灰度图像中确定牌照位置,并将车牌部分从整个图像中分割出来,从而进行字符识别。车牌图像的灰度图的车牌部分是一个水平度很高的长方形图样,在原图中比较集中,且灰度值和周围图样有明显差异,因此很容易用边缘检测来对图像进行分割。车牌定位和分割的准确度直接关系到最后的字符识别的质量。

 

 
   


机动车图像经过灰度化和边缘检测的处理后,边缘得到了加强,牌照区域已经非常明显。本文采用的是用数学形态学来进行图像处理和模式识别。数学形态学用具有一定形态的机构元素去量度和提取图像中的对应形状以达到对图像分析和识别的目的,能有效的去除噪声,保留图像原有信息的同时提取的边缘比较平滑,提取的图像骨架也比较连续,断点少。现在我们将经过预处理的图像进行图像腐蚀以及去除杂质,就可以得到相对准确的车牌位置。

结果:

图3 便于检测车牌定位结果

5.车牌分割

车牌字符分割是车牌自动识别系统中的重要步骤,这一模块的正确性受到很多因素的影响,最大问题是二值化不彻底使投影图像中字符间的波谷不够分明;其次,车牌污损、反光、光照不均等原因使车牌图像交差,存在大量噪声;再次,车牌边框和铆钉也会造成分割不正确;还有车牌的前两个字符和后面五个字符之间的间隔符(小圆点)对字符识别有影响;车牌旋转对水平分割有较大影响。本文车牌部分的分割采用的是利用车牌彩色信息的彩色分割法。使用统计彩色像素点的方法分割出车牌区域,确定车牌底色蓝色RGB对应的灰度范围,然后统计在行方向的颜色范围内的像素点数量,确定车牌在行方向的区域。然后,在分割出的行区域内,统计列方向蓝色像素点的数量,最终确定完整的车牌区域。

 

 
   


最后经过灰度变化及二值化分别显示车牌灰度图及二值化图。车牌识别结果如下

图:

图4 车牌识别结果

6.设计总体分析

该设计对于蓝色牌照的车辆正面图片的车牌检测准确。但是对于白色以及黄色的牌照无法检测,而且对于那些拍摄有一定角度的车辆,这无法正确地检测出车牌的位置,故方案有待改进。

7.程序

I=imread('cp.jpg');

figure(1),subplot(1,2,1);imshow(I);title('原图');    % 显示原图

gray_pic=rgb2gray(I);

subplot(1,2,2),imshow(gray_pic);title('灰度图');%显示灰度图

edge_pic=edge(gray_pic,'roberts',0.2,'both');    %进行robert边缘检测

figure(2),subplot(2,2,1);imshow(edge_pic);title('robert算子边缘检测');%显示robert边缘检测图

se=[1;1;1];

imerode_pic=imerode(edge_pic,se);                     %进行腐蚀

figure(2),subplot(2,2,2);imshow(imerode_pic);title('腐蚀后图像');   %显示腐蚀后图像

se=strel('rectangle',[25,25]);

imclose_pic=imclose(imerode_pic,se);                 %闭运算平滑轮廓

figure(2),subplot(2,2,3);imshow(imclose_pic);title('平滑图像的轮廓');

bopen_pic=bwareaopen(imclose_pic,1000);

figure(2),subplot(2,2,4);imshow(bopen_pic);title('移除小面积对象');%移除小面积对象

[y,x,z]=size(bopen_pic);          

myI=double(bopen_pic);

tic

%***************************Y方向*****************************%

 Blue_y=zeros(y,1);

 for i=1:y

    for j=1:x

             if(myI(i,j,1)==1)

                  Blue_y(i,1)= Blue_y(i,1)+1;%蓝色像素点统计

            end 

       end      

 end

 [temp MaxY]=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)&&(PY2<y))

        PY2=PY2+1;

 end

 IY=I(PY1:PY2,:,:);

 %************************ X方向************************** %

 Blue_x=zeros(1,x);%进一步确定x方向的车牌区域

 for j=1:x

     for i=PY1:PY2

            if(myI(i,j,1)==1)

                Blue_x(1,j)= Blue_x(1,j)+1;              

            end 

       end      

 end

 

 PX1=1;

 while ((Blue_x(1,PX1)<3)&&(PX1<x))

       PX1=PX1+1;

 end   

 PX2=x;

 while ((Blue_x(1,PX2)<3)&&(PX2>PX1))

        PX2=PX2-1;

 end

 PX1=PX1-1;                          %对车牌区域的校正

 PX2=PX2+1;

  cpz=I(PY1:PY2-8,PX1:PX2,:);

 t=toc;

figure(3),subplot(2,2,1),imshow(IY),title('行方向区域');

figure(3),subplot(2,2,2),imshow(cpz),title('定位后的彩色车牌图像');

imwrite(cpz,'cpz.jpg');              %将车牌图储存为cpz.jpg

a=imread('cpz.jpg');

b=rgb2gray(a);

imwrite(b,'车牌灰度图像.jpg');        %显示车牌灰度图像

figure(3);subplot(2,2,3);imshow(b),title('车牌灰度图像');

g_max=double(max(max(b)));

g_min=double(min(min(b)));

T=round(g_max-(g_max-g_min)/3);     % 二值化的阈值

[m,n]=size(b);

d=(double(b)>=T);                % 显示二值图像

imwrite(d,'车牌二值图像.jpg');

figure(3),subplot(2,2,4);imshow(d),title('车牌二值图像');tic

%***************************Y方向*****************************%

 Blue_y=zeros(y,1);

 for i=1:y

    for j=1:x

             if(myI(i,j,1)==1)

                  Blue_y(i,1)= Blue_y(i,1)+1;%蓝色像素点统计

            end 

       end      

 end

 [temp MaxY]=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)&&(PY2<y))

        PY2=PY2+1;

 end

 IY=I(PY1:PY2,:,:);

 %************************ X方向************************** %

 Blue_x=zeros(1,x);%进一步确定x方向的车牌区域

 for j=1:x

     for i=PY1:PY2

            if(myI(i,j,1)==1)

                Blue_x(1,j)= Blue_x(1,j)+1;              

            end 

       end      

 end

 

 PX1=1;

 while ((Blue_x(1,PX1)<3)&&(PX1<x))

       PX1=PX1+1;

 end   

 PX2=x;

 while ((Blue_x(1,PX2)<3)&&(PX2>PX1))

        PX2=PX2-1;

 end

 PX1=PX1-1;                          %对车牌区域的校正

 PX2=PX2+1;

  cpz=I(PY1:PY2-8,PX1:PX2,:);

 t=toc;

figure(7),subplot(1,2,1),imshow(IY),title('行方向区域');

figure(7),subplot(1,2,2),imshow(cpz),title('定位后的彩色车牌图像');

imwrite(cpz,'cpz.jpg');              %将车牌图储存为cpz.jpg

a=imread('cpz.jpg');

b=rgb2gray(a);

imwrite(b,'车牌灰度图像.jpg');        %显示车牌灰度图像

figure(8);imshow(b),title('车牌灰度图像');

g_max=double(max(max(b)));

g_min=double(min(min(b)));

T=round(g_max-(g_max-g_min)/3);     % 二值化的阈值

[m,n]=size(b);

d=(double(b)>=T);                % 显示二值图像

imwrite(d,'车牌二值图像.jpg');

figure(9),imshow(d),title('车牌二值图像');

 

猜你喜欢

转载自blog.csdn.net/majiawenzzz/article/details/81122828