基于matlab的车牌识别(含子程序)

这篇具有很好参考价值的文章主要介绍了基于matlab的车牌识别(含子程序)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

基于matlab的车牌识别系统

一、对车辆图像进行预处理

1.载入车牌图像:

function [d]=main(jpg)
[filename, pathname] = uigetfile({'*.jpg', 'JPEG 文件(*.jpg)'});
if(filename == 0), return, end
global FILENAME  %定义全局变量
FILENAME = [pathname filename];
I=imread(FILENAME);
figure(1),imshow(I);title('原图像');%将车牌的原图显示出来结果如下:
基于matlab的车牌识别(含子程序)

2.将彩图转换为灰度图并绘制直方图:

I1=rgb2gray(I);%将彩图转换为灰度图

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

figure(2),subplot(1,2,2),imhist(I1);title('灰度图直方图');%绘制灰度图的直方图结果如下所示:

基于matlab的车牌识别(含子程序)

3. 用roberts算子进行边缘检测:

I2=edge(I1,'roberts',0.18,'both');%选择阈值0.18,用roberts算子进行边缘检测

figure(3),imshow(I2);title('roberts 算子边缘检测图像');

结果如下:

基于matlab的车牌识别(含子程序)

4.图像实施腐蚀操作:

se=[1;1;1];

I3=imerode(I2,se);%对图像实施腐蚀操作,即膨胀的反操作

figure(4),imshow(I3);title('腐蚀后图像');

基于matlab的车牌识别(含子程序)

5.平滑图像

se=strel('rectangle',[25,25]);%构造结构元素以正方形构造一个se

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

figure(5),imshow(I4);title('平滑图像');

结果如下所示:

基于matlab的车牌识别(含子程序)

6. 删除二值图像的小对象

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

figure(6),imshow(I5);title('从对象中移除小的对象');

结果如下所示 :

基于matlab的车牌识别(含子程序)

二、车牌定位

[y,x,z]=size(I5);%返回I5各维的尺寸,存储在x,y,z中
myI=double(I5);%将I5转换成双精度
tic      %tic表示计时的开始,toc表示计时的结束
 Blue_y=zeros(y,1);%产生一个y*1的零阵
 for i=1:y
    for j=1:x
             if(myI(i,j,1)==1) 
  %如果myI(i,j,1)即myI的图像中坐标为(i,j)的点值为1,即该点为车牌背景颜色蓝色
  %则Blue_y(i,1)的值加1
                Blue_y(i,1)= Blue_y(i,1)+1;%蓝色像素点统计 
            end  
     end       
 end
 [temp MaxY]=max(Blue_y);%Y方向车牌区域确定
  %temp为向量white_y的元素中的最大值,MaxY为该值的索引
 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方向车牌区域确定
 %%%%%% 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;
  dw=I(PY1:PY2-8,PX1:PX2,:);
 t=toc; 
 figure(7),subplot(1,2,1),imshow(IY),title('行方向合理区域');%行方向车牌区域确定
 figure(7),subplot(1,2,2),imshow(dw),title('定位裁剪后的车牌彩色图像');的车牌区域如下所示:
基于matlab的车牌识别(含子程序)

三、字符分割及处理

1.车牌的进一步处理

对分割出的彩色车牌图像进行灰度转换、二值化、均值滤波、腐蚀膨胀以及字符分割以从车牌图像中分离出组成车牌号码的单个字符图像,对分割出来的字符进行预处理(二值化、归一化),然后分析提取,对分割出的字符图像进行识别给出文本形式的车牌号码。代码如下:

imwrite(dw,'彩色车牌.jpg');%将彩色车牌写入彩色车牌文件中

a=imread('彩色车牌.jpg');%读取车牌文件中的数据

b=rgb2gray(a);%将车牌图像转换为灰度图

imwrite(b,'车牌灰度图像.jpg');%将灰度图像写入文件中

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

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

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

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

[m,n]=size(b);

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

imwrite(d,'均值滤波前.jpg');

subplot(3,2,2),imshow(d),title('均值滤波前')

%均值滤波前

% 滤波

h=fspecial('average',3);

%建立预定义的滤波算子,average为均值滤波,模板的尺寸为3*3

d=im2bw(round(filter2(h,d)));%使用指定的滤波器h对h进行d即均值滤波

imwrite(d,'均值滤波后.jpg');

subplot(3,2,3),imshow(d),title('均值滤波后')

% 某些图像进行操作

% 膨胀或腐蚀

% se=strel('square',3); % 使用一个3X3的正方形结果元素对象对创建的图像进行膨胀

% 'line'/'diamond'/'ball'...

se=eye(2); % eye(n) returns the n-by-n identity matrix 单位矩阵

[m,n]=size(d);%返回矩阵b的尺寸信息, 并存储在m,n中

if bwarea(d)/m/n>=0.365 %计算二值图像中对象的总面积与整个面积的比是否大于0.365

d=imerode(d,se);%如果大于0.365则图像进行腐蚀

elseif bwarea(d)/m/n<=0.235 %计算二值图像中对象的总面积与整个面积的比是否小于0.235

d=imdilate(d,se);%如果小于则实现膨胀操作

end

imwrite(d,'膨胀或腐蚀处理后.jpg');

subplot(3,2,4),imshow(d),title('膨胀或腐蚀处理后');

运行结果如下所示:

基于matlab的车牌识别(含子程序)

2.字符分割

在汽车牌照自动识别过程中,字符分割有承前启后的作用。它在前期牌照定位的基础上进行字符的分割,然后再利用分割的结果进行字符识别。字符识别的算法很多,因为车牌字符间间隔较大,不会出现字符粘连情况,所以此处采用的方法为寻找连续有文字的块,若长度大于某阈值,则认为该块有两个字符组成,需要分割。一般分割出来的字符要进行进一步的处理,以满足下一步字符识别的需要。但是对于车牌的识别,并不需要太多的处理就已经可以达到正确识别的目的。在此只进行了归一化处理,然后进行后期处理。

% 寻找连续有文字的块,若长度大于某阈值,则认为该块有两个字符组成,需要分割

%首先创建子函数qiege与getword,而后调用子程序,将车牌的字符分割开并且进行归一化处理

d=qiege(d);
[m,n]=size(d);
  % subplot(3,2,5),imshow(d),title(n)
k1=1;k2=1;s=sum(d);j=1;
while j~=n
    while s(j)==0
        j=j+1;
    end
    k1=j;
    while s(j)~=0 && j<=n-1
        j=j+1;
    end
    k2=j-1;
    if k2-k1>=round(n/6.5)
        [val,num]=min(sum(d(:,[k1+5:k2-5])));
        d(:,k1+num+5)=0;  % 分割
    end
end
% 再切割
d=qiege(d);
% 切割出 7 个字符
y1=10;y2=0.25;flag=0;word1=[];
while flag==0
    [m,n]=size(d);
    left=1;wide=0;
    while sum(d(:,wide+1))~=0
        wide=wide+1;
    end
    if wide<y1   % 认为是左侧干扰
        d(:,[1:wide])=0;
        d=qiege(d);
    else
        temp=qiege(imcrop(d,[1 1 wide m]));
        [m,n]=size(temp);
        all=sum(sum(temp));
        two_thirds=sum(sum(temp([round(m/3):2*round(m/3)],:)));
        if two_thirds/all>y2
            flag=1;word1=temp;   
        end
        d(:,[1:wide])=0;d=qiege(d);
    end
end
% 分割出第二个字符
[word2,d]=getword(d);
% 分割出第三个字符
[word3,d]=getword(d);
% 分割出第四个字符
[word4,d]=getword(d);
% 分割出第五个字符
[word5,d]=getword(d);
% 分割出第六个字符
[word6,d]=getword(d);
% 分割出第七个字符
[word7,d]=getword(d);
figure(9);
subplot(2,7,1),imshow(word1),title('1');
subplot(2,7,2),imshow(word2),title('2');
subplot(2,7,3),imshow(word3),title('3');
subplot(2,7,4),imshow(word4),title('4');
subplot(2,7,5),imshow(word5),title('5');
subplot(2,7,6),imshow(word6),title('6');
subplot(2,7,7),imshow(word7),title('7');
[m,n]=size(word1);
% 商用系统程序中归一化大小为 40*20,此处演示
word1=imresize(word1,[40 20]);
word2=imresize(word2,[40 20]);
word3=imresize(word3,[40 20]);
word4=imresize(word4,[40 20]);
word5=imresize(word5,[40 20]);
word6=imresize(word6,[40 20]);
word7=imresize(word7,[40 20]);

subplot(2,7,8),imshow(word1),title('1');
subplot(2,7,9),imshow(word2),title('2');
subplot(2,7,10),imshow(word3),title('3');
subplot(2,7,11),imshow(word4),title('4');
subplot(2,7,12),imshow(word5),title('5');
subplot(2,7,13),imshow(word6),title('6');
subplot(2,7,14),imshow(word7),title('7');
imwrite(word1,'1.jpg');
imwrite(word2,'2.jpg');
imwrite(word3,'3.jpg');
imwrite(word4,'4.jpg');
imwrite(word5,'5.jpg');
imwrite(word6,'6.jpg');
imwrite(word7,'7.jpg');运行结果如下:
基于matlab的车牌识别(含子程序)
  1. 车牌匹配识别

模板匹配是图象识别方法中最具代表性的基本方法之一,它是将从待识别的图象或图象区域f(i,j)中提取的若干特征量与模板T(i,j)相应的特征量逐个进行比较,计算它们之间规格化的互相关量,其中互相关量最大的一个就表示期间相似程度最高,可将图象归于相应的类。也可以计算图象与模板特征量之间的距离,用最小距离法判定所属类。

此处采用相减的方法来求得字符与模板中哪一个字符最相似,然后找到相似度最大的输出。汽车牌照的字符一般有七个,大部分车牌第一位是汉字,通常代表车辆所属省份,紧接其后的为字母与数字。车牌字符识别与一般文字识别在于它的字符数有限,汉字共约50多个,大写英文字母26个,数字10个。为了实验方便,结合本次设计所选汽车牌照的特点,只建立了7个数字26个字母与10个数字的模板。其他模板设计的方法与此相同。

首先取字符模板,接着依次取待识别字符与模板进行匹配,将其与模板字符相减,得到的0越多那么就越匹配。把每一幅相减后的图的0值个数保存,即为识别出来的结果。

识别的流程图如下所示:

建立自动识别的代码表

读取分割出来的字符

第一个字符与模板中的汉字模板进行匹配

第二个字符与模板中的字母模板进行匹配

待识别字符与模板字符相减,值越小相似度越大,找到最小的一个即为匹配的最好的

识别完成,输出此模板对应值

后5个字符与模板中的字母与数字模板进行匹配

源代码如下:

liccode=char(['0':'9' 'A':'Z' '京辽鲁陕苏豫浙']); %建立自动识别字符代码表

SubBw2=zeros(40,20); %产生40*20的全0矩阵

l=1;

for I=1:7

ii=int2str(I); %转为串

t=imread([ii,'.jpg']); %读取图片文件中的数据

SegBw2=imresize(t,[40 20],'nearest'); %对图像做缩放处理

SegBw2=double(SegBw2)>20;

if l==1 %第一位汉字识别

kmin=37;

kmax=43;

elseif l==2 %第二位 A~Z 字母识别

kmin=11;

kmax=36;

else l>=3 %第三位以后是字母或数字识别

kmin=1;

kmax=36;

end

for k2=kmin:kmax

fname=strcat('字符模板\',liccode(k2),'.jpg'); %把行向量转化成字符串

SamBw2 = imread(fname);

SamBw2=double(SamBw2)>1;

for i=1:40

for j=1:20

SubBw2(i,j)=SegBw2(i,j)-SamBw2(i,j);

end

end

% 以上相当于两幅图相减得到第三幅图

Dmax=0;

for k1=1:40

for l1=1:20

if ( SubBw2(k1,l1) > 0 | SubBw2(k1,l1) <0 )

Dmax=Dmax+1;

end

end

end

Error(k2)=Dmax;

end

Error1=Error(kmin:kmax);

MinError=min(Error1);

findc=find(Error1==MinError);

Code(l*2-1)=liccode(findc(1)+kmin-1);

Code(l*2)=' '; %输出最大相关图像

l=l+1;

end

figure(10),imshow(dw),title (['车牌号码:', Code],'Color','r');

基于matlab的车牌识别(含子程序)

子程序代码:文章来源地址https://www.toymoban.com/news/detail-421424.html

function e=qiege(d)
[m,n]=size(d);
top=1;bottom=m;left=1;right=n; %int
while sum(d(top,:))==0&&top<=m
    top=top+1;
end
while sum(d(bottom,:))==0&&bottom>1
    bottom=bottom-1;
end
while sum(d(:,left))==0&&left<n
    left=left+1;
end
while sum(d(:,right))==0&&right>=1
    right=right-1;
end
dd=right-left;
hh=bottom-top;
e=imcrop(d,[left top dd hh]); %返回图像的一个裁剪区域


function [word,result]=getword(d)
word=[];flag=0;y1=8;y2=0.5;
 while flag==0
     [m,n]=size(d);
     wide=0;
     while sum(d(:,wide+1))~=0&&wide<=n-2
         wide=wide+1;
     end
     temp=qiege(imcrop(d,[1 1 wide m]));
     [m1,n1]=size(temp);
     if wide<y1&&n1/m1>y2
         d(:,[1:wide])=0;
         if sum(sum(d))~=0
             d=qiege(d);%切割出最小范围
         else word=[];flag=1;
         end
     else
         word=qiege(imcrop(d,[1 1 wide m]));
         d(:,[1:wide])=0;
         if sum(sum(d))~=0
             d=qiege(d);flag=1;
         else d=[];
         end
     end
 end
 result=d;

对另一幅车牌图片进行识别监测程序,结果如下所示:

基于matlab的车牌识别(含子程序)
基于matlab的车牌识别(含子程序)
基于matlab的车牌识别(含子程序)
基于matlab的车牌识别(含子程序)
基于matlab的车牌识别(含子程序)
基于matlab的车牌识别(含子程序)
基于matlab的车牌识别(含子程序)
基于matlab的车牌识别(含子程序)
基于matlab的车牌识别(含子程序)
基于matlab的车牌识别(含子程序)

到了这里,关于基于matlab的车牌识别(含子程序)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于matlab的车牌识别

    20221126 新增 首先说一下这个工程的思路,很多朋友妄想直接拿着工程用,那是不可能的,自己学去叭,我是先将车牌号预处理之后,整个图片干净一点之后,进行每个字符的切割,但是是很投机取巧的方法,是先切好第一个字符,再根据切割坐标,切割下一个字符,直到将所

    2024年02月11日
    浏览(28)
  • 基于MATLAB车牌识别系统设计

    基于MATLAB车牌识别系统设计   智能交通系统已成为现代社会道路交通发展趋势。在智能交通系统中,车牌自动识别系统是一个非常重要的发展方向。对于车牌识别系统的要满足当车辆通过摄像头采集车辆图片,将其图片进行图像预处理、车牌定位、字符分割、字符识别、输

    2024年02月06日
    浏览(33)
  • 21夜间车牌识别(matlab程序)

    1. 简述        简单说一下实现思路: 读取图片,转灰度,计算灰度直方图,估算阈值(这里的阈值计算很重要,经过阈值算法,选取一个最恰当的阈值),之后二值化。显示图像即可。 实现目标 输入一张车牌图片,实现车牌定位,字符切割和字符识别三步骤。同时可以根

    2024年02月13日
    浏览(23)
  • 基于matlab的车牌识别系统的实现

            随着人们生活水平的提高,机动车辆的数量也逐渐增加,2020年全国的机动车保有总数量为3.72亿辆,其中汽车保有量为2.81亿辆,占75.54%。如此庞大的汽车保有量,为交通行业的管理带来了很大的压力。依靠人工进行道路管理,工作量大、出错率高。所以,需要寻找

    2024年02月03日
    浏览(40)
  • 毕业设计-基于 MATLAB 的车牌识别系统设计

    目录 前言 课题背景和意义 实现技术思路 一、车牌识别系统总体方案设计 二、车牌识别系统硬件设计 三、车牌识别系统软件设计 四、 实验结果与分析 部分源代码 实现效果图样例 最后     📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升

    2023年04月18日
    浏览(68)
  • 【图像处理】基于MATLAB的RGB车牌识别

    目录 基于MATLAB的RGB车牌识别 基于MATLAB的RGB车牌识别通常可以分为以下步骤: 读入待处理图像,将RGB图像转换为HSV图像; 提取HSV图像中的Hue和Saturation通道; 利用颜色索引表的方式对提取出的Hue和Saturation进行阈值分割,得到二值化图像; 对二值化图像进行形态学操作,实现

    2023年04月22日
    浏览(30)
  • 基于MATLAB的车牌识别系统+GUI界面的毕业设计(完整源码+课题报告+说明文档+数据)

    近年来,随着交通现代化的发展要求,汽车牌照自动识别技术已经越来越受到人们的重视.车牌自动识别技术中车牌定位、字符切割、字符识别及后处理是其关键技术.由于受到运算速度及内存大小的限制,以往的车牌识别大都是基于灰度图象处理的识别技术.其中首先要求正确可靠

    2024年02月11日
    浏览(40)
  • MATLAB车牌识别技术实现

    目 录 一. 课程设计任务11 二. 课程设计原理及设计方案22 1.系统简述22 2.图像预处理33 2.1灰度变换33 2.2边缘提取44 3.车牌定位55 4.字符分割55 5.字符识别66 三. 课程设计的步骤和结果88 四. 设计总结2222 五. 设计体会2323 六. 参考文献2424 课程设计任务 在交通管理过程中,通常采用视

    2024年02月05日
    浏览(27)
  • 用Matlab实现车牌分割(可识别大部分蓝色、绿色车牌)

          最近学习了数字图像处理的腐蚀、膨胀、闭运算、开运算等内容,于是想进行实践。车牌分割是一个不错的选择,里面涉及到了很多知识点。       这里先简述一下车牌分割的思路和流程(这里以绿色车牌为例): 1.定位绿色车牌区域 2.车牌矫正(如果图像中车牌是倾

    2024年02月12日
    浏览(33)
  • 数字图像处理之matlab大作业:车牌识别

    1、基于模板的车牌识别,带GUI GitHub - joeyos/LicensePlateRecognition: License plate recognition 2、基于模板的车牌识别,注释详细 https://github.com/hangxyz/License-Plate-Recognition-by-MATLAB 3、其他优秀作品 1)董同学:带语音播报的车牌识别 车牌识别-基于模板匹配_勇敢歪歪的博客-CSDN博客_车牌识

    2024年02月08日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包