首页 > 编程语言 >基于matlab的汽车牌照识别程序

基于matlab的汽车牌照识别程序

时间:2024-08-04 21:54:42浏览次数:14  
标签:牌照 end I1 pretreatment matlab 图像 imread 识别 车牌

摘要:本次作业的任务是设计一个基于matlab的汽车牌照识别程序,能够实现车牌图像预处理,车牌定位,字符分割,然后通过神经网络对车牌进行字符识别,最终从一幅图像中提取车牌中的字母和数字,给出文本形式的车牌号码。

关键词:车牌识别,matlab,神经网络

1 引言

随着我国交通运输的不断发展,智能交通系统(Intelligent Traffic System,简称ITS)的推广变的越来越重要,而作为ITS的一个重要组成部分,车辆牌照识别系统(vehicle license plate recognition system,简称LPR)对于交通管理、治安处罚等工作的智能化起着十分重要的作用。它可广泛应用于交通流量检测,交通控制于诱导,机场,港口,小区的车辆管理,不停车自动收费,闯红灯等违章车辆监控以及车辆安全防盗等领域,具有广阔的应用前景。由于牌照是机动车辆管理的唯一标识符号,因此,车辆牌照识别系统的研究在机动车管理方面具有十分重要的实际意义。

2 车辆牌照识别系统工作原理

车辆牌照识别系统的基本工作原理为:将摄像头拍摄到的包含车辆牌照的图像通过视频卡输入到计算机中进行预处理,再由检索模块对牌照进行搜索、检测、定位,并分割出包含牌照字符的矩形区域,然后对牌照字符进行二值化并将其分割为单个字符,然后输入JPEG或BMP格式的数字,输出则为车牌号码的数字。

3 车辆牌照识别系统组成

(1)图像预处理:对汽车图像进行图像转换、图像增强和边缘检测等。

(2)车牌定位:从预处理后的汽车图像中分割出车牌图像。即在一幅车辆图像中找到车牌所在的位置。

(3)字符分割:对车牌图像进行几何校正、去噪、二值化以及字符分割以从车牌图像中分离出组成车牌号码的单个字符图像

(4)字符识别:对分割出来的字符进行预处理(二值化、归一化),然后分析提取,对分割出的字符图像进行识别给出文本形式的车牌号码。

4 汽车牌照识别系统的matlab实现

4.1  图像预处理与车牌定位

输入的彩色图像包含大量颜色信息,会占用较多的存储空间,且处理时也会降低系统的执行速度,因此对图像进行识别等处理时,常将彩色图像转换为灰度图像,以加快处理速度。对图像进行灰度化处理、边缘提取、再利用形态学方法对车牌进行定位。具体步骤如下:首先对图像进行灰度转换,二值化处理然后采用4X1的结构元素对图像进行腐蚀,去除图像的噪声。采用25X25的结构元素,对图像进行闭合应算使车牌所在的区域形成连通。在进行形态学滤波去除其它区域。

I=imread('DSC01344.jpg');%读取图像

figure();  subplot(3,2,1),imshow(I), title('原始图像');

I1=rgb2gray(I);%转化为灰度图像

subplot(3,2,2),imshow(I1),title('灰度图像');

I2=edge(I1,'robert',0.09,'both');%采用robert算子进行边缘检测

subplot(3,2,3),imshow(I2),title('边缘检测后图像');

se=[1;1;1]; %线型结构元素 

I3=imerode(I2,se);    %腐蚀图像

subplot(3,2,4),imshow(I3),title('腐蚀后边缘图像');

se=strel('rectangle',[25,25]);  矩形结构元素

I4=imclose(I3,se);%图像聚类、填充图像

subplot(3,2,5),imshow(I4),title('填充后图像');

I5=bwareaopen(I4,2000);%去除聚团灰度值小于2000的部分

subplot(3,2,6),imshow(I5),title('形态滤波后图像');

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

I6=double(I5);

 Y1=zeros(y,1);

 for i=1:y

    for j=1:x

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

                Y1(i,1)= Y1(i,1)+1;

            end  

     end       

 end

 [temp MaxY]=max(Y1);

 figure();

 subplot(3,2,1),plot(0:y-1,Y1),title('行方向像素点灰度值累计和'),xlabel('行值'),ylabel('像素');

 %%%%%%%求的车牌的行起始位置和终止位置%%%%%%%%%

 PY1=MaxY;

 while ((Y1(PY1,1)>=50)&&(PY1>1))

        PY1=PY1-1;

 end    

 PY2=MaxY;

 while ((Y1(PY2,1)>=50)&&(PY2<y))

        PY2=PY2+1;

 end

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

 X1=zeros(1,x);

 for j=1:x

     for i=PY1:PY2

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

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

            end  

     end       end

 subplot(3,2,2),plot(0:x-1,X1),title('列方向像素点灰度值累计和'),xlabel('列值'),ylabel('像数');

 %%%%%%%求的车牌的列起始位置和终止位置%%%%%%%%%

 PX1=1;

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

       PX1=PX1+1;

 end    

 PX2=x;

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

        PX2=PX2-1;

 end

 PX1=PX1-1;

 PX2=PX2+1;

 %分割出车牌图像%

dw=I(PY1:PY2,PX1:PX2,:);

subplot(3,2,3),imshow(dw),title('定位剪切后的彩色车牌图像')

4.2 车牌字符分割

确定车牌位置后下一步的任务就是进行字符切分分离出车牌号码的全部字符图像

if isrgb(I)

   I1 = rgb2gray(I);    %将RGB图像转化为灰度图像

else   I1=I;  end

g_max=double(max(max(I1)));

g_min=double(min(min(I1)));

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

[m,n]=size(I1);% d:二值图像

%h=graythresh(I1);

I1=im2bw(I1,T/256);

subplot(3,2,4);

imshow(I1),title('二值化车牌图像');

I2=bwareaopen(I1,20);

subplot(3,2,5);

imshow(I2),title('形态学滤波后的二值化图像');

[y1,x1,z1]=size(I2);

I3=double(I2);

TT=1;

%%%%%%%去除图像顶端和底端的不感兴趣区域%%%%%

Y1=zeros(y1,1);

 for i=1:y1

    for j=1:x1

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

                Y1(i,1)= Y1(i,1)+1 ;

            end  

     end       

 end

Py1=1;

Py0=1;

while ((Y1(Py0,1)<20)&&(Py0<y1))

      Py0=Py0+1;

end

Py1=Py0;

 while((Y1(Py1,1)>=20)&&(Py1<y1))

         Py1=Py1+1;

 end

I2=I2(Py0:Py1,:,:);

subplot(3,2,6);

imshow(I2),title('目标车牌区域');

%%%%%% 分割字符按行积累量%%%%%%%

X1=zeros(1,x1);

for j=1:x1

    for i=1:y1

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

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

            end  

     end       

end

figure(5);

plot(0:x1-1,X1),title('列方向像素点灰度值累计和'),xlabel('列值'),ylabel('累计像素量');

Px0=1;

Px1=1;

%%%%%%%%%%%%分割字符%%%%%%%%%%%%%%%%%%

for i=1:7

  while ((X1(1,Px0)<3)&&(Px0<x1))

      Px0=Px0+1;

  end

  Px1=Px0;

  while (((X1(1,Px1)>=3)&&(Px1<x1))||((Px1-Px0)<10))

      Px1=Px1+1;

  end

  Z=I2(:,Px0:Px1,:);

  switch strcat('Z',num2str(i))

      case 'Z1'

          PIN0=Z;

      case 'Z2'

          PIN1=Z;

      case 'Z3'

          PIN2=Z;

      case 'Z4'

          PIN3=Z;

      case 'Z5'

          PIN4=Z;

      case 'Z6'

          PIN5=Z;

      otherwise

          PIN6=Z;

  end

  figure(3);

  subplot(1,7,i);

  imshow(Z);

  Px0=Px1;

End

4.3 车牌字符识别

字符识别方法主要有基于模板匹配算法和基于人工神经网络算法。基于模板匹配算法是首先将分割后的字符二值化,并将其尺寸缩放为字符数据库中模板的大小,然后与所有模板进行匹配,最后选取最佳匹配作为结果。建立数字库对该方法在车牌识别过程中很重要, 数字库准确才能保证检测出的数据正确。基于人工神经元网络的算法有两种,一种是先对特征提取待识别字符,然后用所获得的特征训练神经网络分配器;另一种是直接将待处理图像输入网络由网络自动实现特征提取直至识别结果。在本程序中用基于人工神经元网络识别车牌字符。在车牌字符识别部分, 字符集中包含约50个汉字, 26个大写英文字母及10个阿拉伯数字。总的字符样本并不太多。

4.3.1 构造训练样本如下图所示的数字和字母,

  

将样本进行归一化为50X20大小,再将图像按列转换成一个1000X1的行向量,将上述18个图像的样本排列在一起构成1000X18的矩阵样本,尽可能多的采集汽车图像提取车牌,部分切分出车牌字符,构造出更多1000X18的矩形样本,用构造好的样本库对神经网络进行训练。

function  inpt  = pretreatment(I)

%YUCHULI Summary of this function goes here

%   Detailed explanation goes here

if isrgb(I)

   I1 = rgb2gray(I);

else

   I1=I;

end

I1=imresize(I1,[50 20]);%将图片统一划为50*20大小

I1=im2bw(I1,0.9);

[m,n]=size(I1);

inpt=zeros(1,m*n);

%%%%%%将图像按列转换成一个行向量

for j=1:n

    for i=1:m

        inpt(1,m*(j-1)+i)=I1(i,j);

    end

end

4.3.2 构造输入样本,按同样的方法,将前面分割出的样本归一化。

4.3.3 神经网络进行识别。

close all;

clear all;

%%%%归一化训练样本%%%%%%

I0=pretreatment(imread('0.jpg'));

I1=pretreatment(imread('1.jpg'));

I2=pretreatment(imread('2.jpg'));

I3=pretreatment(imread('3.jpg'));

I4=pretreatment(imread('4.jpg'));

I5=pretreatment(imread('5.jpg'));

I6=pretreatment(imread('6.jpg'));

I7=pretreatment(imread('7.jpg'));

I8=pretreatment(imread('8.jpg'));

I9=pretreatment(imread('9.jpg'));

I10=pretreatment(imread('A.jpg'));

I11=pretreatment(imread('C.jpg'));

I12=pretreatment(imread('G.jpg'));

I13=pretreatment(imread('L.jpg'));

I14=pretreatment(imread('M.jpg'));

I15=pretreatment(imread('R.jpg'));

I16=pretreatment(imread('H.jpg'));

I17=pretreatment(imread('N.jpg'));

P=[I0',I1',I2',I3',I4',I5',I6',I7',I8',I9',I10',I11',I12',I13',I14',I15',I16',I17'];

%输出样本%%%

T=eye(18,18);

%%bp神经网络参数设置

net=newff(minmax(P),[1000,32,18],{'logsig','logsig','logsig'},'trainrp');

net.inputWeights{1,1}.initFcn ='randnr';

net.layerWeights{2,1}.initFcn ='randnr';

net.trainparam.epochs=5000;

net.trainparam.show=50;

%net.trainparam.lr=0.003;

net.trainparam.goal=0.0000000001;

net=init(net);

%%%训练样本%%%%

[net,tr]=train(net,P,T);

%%%%%%%测试%%%%%%%%%

%I=imread('DSC01323.jpg');

I=imread('DSC01344.jpg');

dw=location(I);%车牌定位

[PIN0,PIN1,PIN2,PIN3,PIN4,PIN5,PIN6]=StringSplit(dw);%字符分割及处理

%%%%%%%%%%%测试字符,得到识别数值%%%%

PIN0=pretreatment(PIN0);

PIN1=pretreatment(PIN1);

PIN2=pretreatment(PIN2);

PIN3=pretreatment(PIN3);

PIN4=pretreatment(PIN4);

PIN5=pretreatment(PIN5);

PIN6=pretreatment(PIN6);

P0=[PIN0',PIN1',PIN2',PIN3',PIN4',PIN5',PIN6'];

for i=2:7

  T0= sim(net ,P0(:,i));

  T1 = compet (T0) ;

  d =find(T1 == 1) - 1

 if (d==10)

    str='A';

 elseif (d==11)

     str='C';

 elseif (d==12)

     str='G';

 elseif (d==13)

     str='L';

 elseif (d==14)

     str='M';

 elseif (d==15)

     str='R';

 elseif (d==16)

     str='H';

 elseif (d==17)

     str='N';

 else

    str=num2str(d);

 end

 switch i

     case 2

         str1=str;

     case 3

         str2=str;

     case 4

         str3=str;

     case 5

         str4=str;

     case 6

         str5=str;

     otherwise

         str6=str;

  end

end

%%%%%%%显示定位后的分割出的车牌彩图,%%%

标签:牌照,end,I1,pretreatment,matlab,图像,imread,识别,车牌
From: https://blog.csdn.net/2401_86539719/article/details/140912727

相关文章

  • MATLAB边缘检测系统实现
    MATLAB边缘检测一、目的: 熟悉边缘检测原理,并运用matlab软件实现图像的canny边缘检测,体会canny边缘检测的优缺点。二、内容:编写matlab程序,实现对lena图像的边缘检测,输出程序运行结果。三、原理或步骤:首先回顾一下边缘检测的一般步骤:边缘检测算法一般包含如下四个步骤:1.......
  • 【学习笔记】Matlab和python双语言的学习(蒙特卡洛法)
    文章目录前言一、蒙特卡洛二、经典示例:计算圆周率π1.代码实现----Matlab2.代码实现----python三、示例2:三门问题1.代码实现----Matlab2.代码实现----python总结前言通过模型算法,熟练对Matlab和python的应用。学习视频链接:https://www.bilibili.com/video/BV1E......
  • 利用MATLAB打造混凝土结构裂缝识别系统(二)
    文章目录前言一、操作说明二、导入图像三、选择裂缝识别方法1.“单裂缝识别”方法2.“多裂缝识别”方法四、结果输出与保存实际识别效果展示墙体裂缝:道路裂缝:衬砌裂缝:桥面裂缝:房屋楼板裂缝:前言本节主要介绍所设计的混凝土结构裂缝识别系统各个组件的具体操作与......
  • 如何在 java 或 python 中使用 HTTP(S) 解决无法解析的主机名或无法识别的名称错误?
    我尝试以编程方式访问网站的信息,但在Java和Python上都无法解析主机名。如果我指定IP地址,则会将错误更改为TLSV1_UNRECOGNIZED_NAME。不过,这个网站无需任何额外的工作就可以通过任何浏览器解决。我在这里浏览了很多潜在的解决方案,但对于Python,它说这个问题应该在2.7......
  • 网易易盾图标点选验证码识别代码
    简介网易图标点选一直都是一个大难题,如上图所示。难点之一是图标变幻莫测,很难刷出有重复的图标,所以使用传统等等方式去标注、识别具有较大的难度。经过我们大量的数据标注,终于完成了这款验证码的识别。目前我们提供两种识别方:原图识别、截图识别。1.1原图识别需要通过......
  • Matlab实现GAF-PCNN-MATT、GASF-CNN、GADF-CNN的多特征输入数据分类预测/故障诊断
    对于使用GAF-PCNN-MATT、GASF-CNN、GADF-CNN技术来进行多特征输入数据的分类预测或故障诊断,你可以考虑以下步骤:数据准备:准备你的多特征输入数据集,确保数据的质量和一致性。每个样本应该包含多个特征。特征提取:使用GramianAngularField(GAF)、GramianAngularSecto......
  • UI界面设计-Fer2013面部表情识别/基于pytorch
    基于tensorflow代码请参考主页:http://t.csdnimg.cn/beYP5http://t.csdnimg.cn/beYP5本文使用torch框架构建模型做出UI界面,将所有调参变量做到UI界面上一、项目概述本项目开发了一款集成深度学习的情绪识别软件,采用PyTorch框架构建卷积神经网络模型。该软件通过摄像头捕获......
  • 基于IEEE802.11g标准的OFDM信号帧检测matlab仿真
    1.程序功能描述     现有的无线通信信道共享的无线信号识别为将来的软件定义的无线电系统是一个巨大的挑战。在这个项目中,学生将制定IEEE802.11无线信号在AWGN信道,利用MATLAB/Simulink技术来识别。一个完整的发射机模式将开发和实施。在AWGN信道下的性能进行评估。 基......
  • 如何利用Matlab网格生成器画太极
    注:首先要懂几何函数的定义!代码:1.主函数:clc,clear;closeall;g1=[1111;20-20;0-202;020-2;20-20;1221;0000;0000;0000;2222];%大○g2=[1111;010-1;10-10;-2-121;-1010;2211;1122;0000;-1-111;1111];%......
  • MATLAB生成各类区域网格剖分
    一、双洞模型代码:hg=[1111111120-20010-10-20210-10020-2012120-2012101111000000001111000000000000111122221111];ug=[1111010-1......