车牌识别(附源代码)

合集下载

车牌识别系统源代码

车牌识别系统源代码

num=0;
for j=1:b
if goal(i,j)==1
num=num+1;
end
end
if num<(b*0.1)
line_down=i;
break;
end
x(k)=uint8(x(k));
if x(k)>0 %当所选区域不为空时进行输出
11=11+1;% 用来记录输出的字符数
s(11)=char(x(k));
end
temp(32,32)=0;
imshow(temp);
end
now=now+2;
goalboundary=boundary;
s=min(goalboundary,[],1);
e=max(goalboundary,[],1);
goal=imcrop(Image,[s(2) s(1) e(2)- s(2) e(1)-s(1)]);
end
text(boundray(1,2)-35,boundray(1,1)+13,metric_string,'Color','g','FontSize',14,'FontWeight','bold');%显示匹配度字串
B6=imerode(B5,se);
[B,L]=bwboundaries(B6,4);%对边界图进行小区域联通,是车牌区域连通为一个方块
imshow(label2rgb(L,@jet,[.5 .5 .5]))%对连通区域进行标记
hold on
for k=1:length(B)

基于opencv的车牌识别的代码

基于opencv的车牌识别的代码

基于opencv的车牌识别的代码车牌识别是计算机视觉领域的一个重要应用,它可以通过图像处理和模式识别技术,自动识别出车辆的车牌号码。

OpenCV是一个开源的计算机视觉库,提供了丰富的图像处理和机器学习算法,非常适合用于车牌识别的开发。

下面是一个基于OpenCV的车牌识别的代码示例:```pythonimport cv2import numpy as np# 加载车牌识别模型plate_cascade =cv2.CascadeClassifier('haarcascade_russian_plate_number.xml') # 加载车牌字符识别模型char_cascade =cv2.CascadeClassifier('haarcascade_russian_plate_number_char.xml') # 读取图像img = cv2.imread('car.jpg')# 转换为灰度图像gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 检测车牌plates = plate_cascade.detectMultiScale(gray, 1.1, 4)# 遍历每个车牌for (x, y, w, h) in plates:# 绘制车牌区域cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)# 提取车牌区域plate = gray[y:y+h, x:x+w]# 检测车牌字符chars = char_cascade.detectMultiScale(plate, 1.1, 4)# 遍历每个字符for (cx, cy, cw, ch) in chars:# 绘制字符区域cv2.rectangle(img, (x+cx, y+cy), (x+cx+cw, y+cy+ch), (0, 255, 0), 2)# 提取字符区域char = plate[cy:cy+ch, cx:cx+cw]# 进行字符识别# ...# 在这里可以使用机器学习或深度学习算法对字符进行识别# 显示结果图像cv2.imshow('License Plate Recognition', img)cv2.waitKey(0)cv2.destroyAllWindows()```在这个代码示例中,首先我们加载了车牌识别模型和车牌字符识别模型。

实验报告用MATLAB实现车牌识别系统

实验报告用MATLAB实现车牌识别系统

图像处理大作业实验报告--用MATLAB实现车牌识别系统作者东南大学电子系李浩翔06006435指导老师张雄实验日期2010-1-10索引:实验目的实验原理实验步骤1.预处理2.边缘识别3.小区块联通4.车牌区域的识别并截取5.字符截取6.字符识别实验思路分析本程序的局限性附录附录1 程序源代码1.主程序2.子函数(code)附录2 测试图像处理过程汇总1.测试图像12.测试图像2附录3 参考文献及参考程序实验目的(返回索引)使用MATLAB对包含车牌的图片进行处理,利用算法识别出车牌所在的区域,并辨认其数字及字母,最后在屏幕上输出所识别出的车牌号。

实验原理(返回索引)1.将拍摄下的彩色图像转换为灰度图,之后用中值滤波对灰度图像进行预处理,从而减少干扰信息。

2.使用sobel算子识别出图像的边缘,并转化为二值化图像。

并对二值化之后的图像进行卷积,加强边缘的轮廓。

3.用膨胀-再腐蚀的方法分别作用于图像的横轴与纵轴,将小块的联通区域连接起来,使车牌的形状更加清晰,为下一步的识别做好准备。

4.利用车牌长宽比的特性对各个联通区域进行判断,识别出车牌所在区域,并截取。

5.对截取出的车牌区域进行进一步的处理,分割出各个字符。

6.对分割出的字符进行特征判断,从而识别出具体的车牌号。

实验步骤(返回索引)1.预处理(返回索引)A. 将拍摄下的彩色图像转换为灰度图,便于进行接下来的算法处理。

图1 拍摄下的图片B.对灰度图进行中值滤波,减少干扰点对二值化运算结果的影响。

图3 进行中值滤波后的灰度图C.将中值滤波后的灰度图用设定门限灰度的方法(取门限值为0.2)转化为二值化图像,在后继的车牌区域截取运算中作为源图像使用。

图4 使用设定灰度门限的方法获得的二值化图像2.边缘识别(返回索引)A.利用sobel算子识别出图3中的边缘区域,并将其转换为二值化图像。

在转换后的二值化图像中,边缘区域被作为白点标出,而非边缘区域被黑色区域覆盖。

基于 OpenCV 和 Python 车牌识别系统的设计与实现代码大全

基于 OpenCV 和 Python 车牌识别系统的设计与实现代码大全

题目基于OpenCV和Python车牌识别系统的设计与实现1.1 题目的主要研究内容(1)工作的主要描述利用python中自带的opencv库中的模式识别算法制作一个简易的模式识别系统,使用自己搜集到的数据集对模型进行训练,最终完成特征提取、分类等工作,并且在最后的推理过程中,实现了车牌识别的工作。

(2)系统流程图1.2 题目研究的工作基础或实验条件项目的编程环境为python,编译器使用pycharm2021.3 x64,设计一个车牌识别系统,有GUI界面。

选择一张有车牌的图片后,完成车牌定位、倾斜校正、字符分割,最后通过k-NN 算法对车牌的字母和数字进行识别,将识别结果在GUI界面中显示出来1.3 数据集描述车牌定位就是在图片中识别出哪个位置有车牌,是字符分割和字母数字识别的前提,是车牌识别系统的关键和难点。

:例如,训练数据的目录结构树如下所示:1.4 特征提取过程描述1.对原始图像进行高斯模糊,减少噪点。

2.提取图像边缘。

首先将彩色图像转为灰度图gray,利用大核对灰度图进行开操作得到图像open,相当于对灰度图进行涂抹操作,将灰度图gray和开操作后的图像open按1:-1的比例融合得到图像add,以上操作可以将大面积灰度值相似的地方置黑,可以减少车灯、背景、地面、挡风玻璃等细节。

接着使用canny 算法对融合图像add提取边缘,得到图像canny。

3.使用横向长条作为核对边缘图像进行一次闭操作,得到图像close,相当于对边缘横向涂抹,因为一般视角车牌是宽大于高的矩形。

再对图像close进行一次开操作,得到图像open2,消除较细的线条和不大的竖向线条,从而将车牌位置的连通区域独立出来。

4.查找连通区域,通过最小外接矩形的宽高比2~5.5筛选合适的连通区域。

5.将最小外接矩形图像旋转矫正,上下左右向外扩展一点范围,避免连通区域没能覆盖车牌造成影响。

6.将连通区域原图转为HSV图像,确定图像的主要颜色,若不为蓝、黄、绿,则排除。

车牌识别模板匹配优质代码

车牌识别模板匹配优质代码

close allclc[filename,filepath]=uigetfile('.jpg','输入一个需要识别的车牌图像');% 直接自动读入%file=strcat(filepath,filename); %strcat函数:连接字符串;把filepath的字符串与filename的连接,即路径/文件名I=imread(file);figure('name','原图'),imshow(I);title('原图')%图像增强% h=ones(5,5)/25; %过滤器h% I=imfilter(I,h);%真彩色增强% figure('name','真彩色增强');imshow(I);title('真彩色增强');I1=rgb2gray(I); % RGB图像转灰度图像% %figure('name','灰度处理前'),subplot(1,2,1),imshow(I1);title('灰度处理前的灰度图');% % subplot(1,2,2),imhist(I1);title('灰度处理前的灰度图直方图');%线性灰度变换I1=imadjust(I1,[0.3,0.7],[]);figure('name','灰度处理后'),subplot(1,2,1),imshow(I1);title('灰度处理后的灰度图');subplot(1,2,2),imhist(I1);title('灰度处理后的灰度图直方图');%进行中值滤波I1=medfilt2(I1);figure,imshow(I1);title('中值滤波');%边缘检测:sobel,roberts,canny,prewitt等I2=edge(I1,'roberts',0.25,'both'); %边缘检测算法,强度小于阈值0.15的边缘被省略掉,'both'两个方向检测(缺省默认)figure('name','边缘检测'),imshow(I2);title('robert算子边缘检测')se=[1;1;1];I3=imerode(I2,se);% 腐蚀Imerode(X,SE).其中X是待处理的图像,SE是结构元素对象figure('name','腐蚀后图像'),imshow(I3);title('腐蚀后的图像');se=strel('rectangle',[20,20]); % 25X25的矩形strel(膨胀、腐蚀、开运算、闭运算)是创建由指定形状shape对应的结构元素,se=strel('rectangle',20,20)%SE = strel('rectangle', MN)I4=imclose(I3,se);% 用25*25的矩形对图像进行闭运算(先膨胀后腐蚀)有平滑边界作用figure('name','平滑处理'),imshow(I4);title('平滑图像的轮廓');I5=bwareaopen(I4,1000);% 从二进制图像中移除所有少于2000像素的连接对象,消失的是连续的白色像素数量少于2000的字符figure('name','移除小对象'),imshow(I5);title('从对象中移除小对象');[y,x,z]=size(I5);% y是行数,x是列数,z是维数myI=double(I5);% 转成双精度型tic % 开始计时Blue_y=zeros(y,1);% zeros(M,N) 表示的是M行*N列的全0矩阵for i=1:yfor j=1:xif(myI(i,j,1)==1) %% 判断蓝色像素Blue_y(i,1)= Blue_y(i,1)+1;% 蓝色像素点统计endendend[temp MaxY]=max(Blue_y);% Y方向车牌区域确定[temp MaxY]临时变量MaxYPY1=MaxY; % 以下为找车牌Y方向最小值while ((Blue_y(PY1,1)>=5)&&(PY1>1))PY1=PY1-1;endPY2=MaxY; % 以下为找车牌Y方向最大值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:xfor i=PY1:PY2 % 只需扫描的行if(myI(i,j,1)==1) %% 判断蓝色像素Blue_x(1,j)= Blue_x(1,j)+1; % 蓝色像素点统计endendendPX1=1;% 以下为找车牌X方向最小值while ((Blue_x(1,PX1)<5)&&(PX1<x))%% 为什么判断蓝色像素点<3(不算蓝色?)PX1=PX1+1;endPX2=x;% 以下为找车牌X方向最大值while ((Blue_x(1,PX2)<3)&&(PX2>PX1))PX2=PX2-1;endPY1=PY1-2;% 对车牌区域的校正为什么要这么+-PX1=PX1-2;PX2=PX2+3;PY2=PY2+10;dw=I(PY1:PY2-8,PX1:PX2,:);% 裁剪图像toc %t=toc; % 停止计时%figure(7),subplot(1,2,1),imshow(IY),title('行方向合理区域');figure('name','定位剪切后的彩色车牌图像'),%subplot(1,2,2),imshow(dw),title('定位剪切后的彩色车牌图像')imwrite(dw,'dw.jpg');a=imread('dw.jpg');b=rgb2gray(a);imwrite(b,'1.车牌灰度图像.jpg');figure('name','车牌处理');subplot(3,2,1),imshow(b),title('1.车牌灰度图像')%g_max=double(max(max(b)));% 以下作阈值化(灰度图转二值图)%线性灰度变换b=imadjust(b,[0.3,0.7],[]);subplot(3,2,2),imshow(b);title('2.线性灰度处理后的灰度图');%进行二值化处理d=im2bw(b,0.4);%将灰度图像进行二值化处理imwrite(d,'2.车牌二值图像.jpg');subplot(3,2,3),imshow(d),title('3.车牌二值图像');%显示二值化图像%进行中值滤波d=medfilt2(d);imwrite(d,'4.均值滤波后.jpg');subplot(3,2,4),imshow(d);title('4.中值滤波后');se=eye(2); % eye(n) 返回n乘n单一矩阵;单位矩阵[m,n]=size(d);if bwarea(d)/m/n>=0.365 % 函数bwarea 计算目标物的面积,单位是像素;bwarea/m/n即为单个像素??d=imerode(d,se);% 腐蚀elseif bwarea(d)/m/n<=0.235d=imdilate(d,se);% 膨胀endimopen(d,se);%se=eye(7);%imopen(d,se);imwrite(d,'5.膨胀或腐蚀处理后.jpg');subplot(3,2,5),imshow(d),title('5.膨胀或腐蚀处理后')%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%进行字符识别%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 寻找连续有文字的块,若长度大于某阈值,则认为该块有两个字符组成,需要分割d=qiege(d);% 调用qiege()子程序[m,n]=size(d);figure,subplot(2,1,1),imshow(d),title(n)k1=1;k2=1;j=1;s=sum(d);%sum(x)就是竖向相加,求每列的和,结果是行向量;sum(x,2)表示矩阵x的横向相加,求每行的和,结果是列向量。

车牌识别代码

车牌识别代码

车牌识别代码[fn,pn,fi]=uigetfile;%读入文件I=imread([pn fn]);figure,imshow(I);%显示原始图像title;Im1=rgb2gray(I);figure(2),subplot(1,2,1),imshow(Im1);title('灰度图');tic %计时开始[height,width]=size(Im1);%预处理I_edge=zeros(height,width);% 创建height*width的矩阵for i=1:width-1 % 对每一列开始遍历I_edge(:,i)=abs(I(:,i+1)-I(:,i));% 每列的值赋为原图像中左右两列相减的绝对值(即梯度) end% 归一化处理(0~255)I_edge=(255/(max(max(I_edge))-min(min(I_edge))))*(I_edge-min(min(I_edge)));figureimshow(I_edge);title('归一化处理')[I_edge,y1]=select(I_edge,height,width); %%%%%%调用select函数figureimshow(I_edge);title('选择')BW2 = I_edge;%%%%%%%%%%%%%%%%%一些形态学处理SE=strel('rectangle',[10,10]);IM2=imerode(BW2,SE);%腐蚀figureimshow(IM2);title('腐蚀');IM2=bwareaopen(IM2,20);%开运算,消除细小物体figureimshow(IM2);title('开运算');IM3=imdilate(IM2,SE);%膨胀figureimshow(IM2);title('膨胀'); %%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%投影以粗略估计车牌位置p_h=projection(double(IM3),'h'); %调用projection函数if(p_h(1)>0)p_h=[0,p_h];endp_v=projection(double(IM3),'v'); %调用projection函数if(p_v(1)>0)p_v=[0,p_v];end%%%%%%p_h=double((p_h>5));p_h=find(((p_h(1:end-1)-p_h(2:end))~=0));len_h=length(p_h)/2;%%%%%p_v=double((p_v>5));p_v=find(((p_v(1:end-1)-p_v(2:end))~=0));len_v=length(p_v)/2;%%%%%%%%%%%%%%%%%%%%%%%%%%%%粗略计算车牌候选区k=1;for i=1:len_hfor j=1:len_vs=IM3(p_h(2*i-1):p_h(2*i),p_v(2*j-1):p_v(2*j));if(mean(mean(s))>0.1)p{k}=[p_h(2*i-1),p_h(2*i)+1,p_v(2*j-1),p_v(2*j)+1];k=k+1;endendendk=k-1;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%进一步缩小车牌候选区for i=1:kedge_IM3=double(edge(double(IM3(p{i}(1):p{i}(2),p{i}(3):p{i}(4))),'canny'));[x,y]=find(edge_IM3==1);p{i}=[p{i}(1)+min(x),p{i}(2)-(p{i}(2)-p{i}(1)+1-max(x)),...p{i}(3)+min(y),p{i}(4)-(p{i}(4)-p{i}(3)+1-max(y))];p_center{i}=[fix((p{i}(1)+p{i}(2))/2),fix((p{i}(3)+p{i}(4))/2)];p_ratio(i)=(p{i}(4)-p{i}(3))/(p{i}(2)-p{i}(1));end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%对上面参数和变量的说明:p为一胞元,用于存放每个图像块的左上和右下两个点的坐标;%存放格式为:p{k}=[x1,x2,y1,y2];x1,x2分别为行坐标,y1,y2为列坐标%p_center为一胞元,用于存放每个图像块的中心坐标,p_center{k}=[x,y];x,y分别为行,列坐标%p_ratio为一矩阵,用来存放图像块的长宽比例%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%合并临近区域%%%%%%%%如果有多个区域则执行合并if k>1n=0;ncount=zeros(1,k);for i=1:k-1%%%需要调整if条件中的比例%%%需要调整%检查是否满足合并条件if(abs(p{i}(1)+p{i}(2)-p{i+1}(1)-p{i+1}(2))<=height/30&&abs(p{i+1}(3)-p{i}(4))<=width/15) p{i+1}(1)=min(p{i}(1),p{i+1}(1));p{i+1}(2)=max(p{i}(2),p{i+1}(2));p{i+1}(3)=min(p{i}(3),p{i+1}(3));p{i+1}(4)=max(p{i}(4),p{i+1}(4)); %向后合并n=n+1;ncount(n)=i+1;endend%如果有合并,求出合并后最终区域if(n>0)d_ncount=ncount(2:n+1)-ncount(1:n);%避免重复记录临近的多个区域。

基于Python实现的车牌识别项目

基于Python实现的车牌识别项目

基于Python实现的车牌识别项⽬车牌识别在⾼速公路中有着⼴泛的应⽤,⽐如我们常见的电⼦收费(ETC)系统和交通违章车辆的检测,除此之外像⼩区或地下车库门禁也会⽤到,基本上凡是需要对车辆进⾏⾝份检测的地⽅都会⽤到。

简介车牌识别系统(Vehicle License Plate Recognition)是计算机视频图像识别技术在车辆牌照识别中的⼀种应⽤,通常⼀个车牌识别系统主要包括以下这四个部分:车辆图像获取车牌定位车牌字符分割车牌字符识别我们再来看⼀下百科中对车牌识别技术的描述:车牌识别技术要求能够将运动中的汽车牌照从复杂背景中提取并识别出来,通过车牌提取、图像预处理、特征提取、车牌字符识别等技术,识别车辆牌号、颜⾊等信息,⽬前最新的技术⽔平为字母和数字的识别率可达到 99.7%,汉字的识别率可达到99%。

实现⽅式我们这⾥不做太复杂的车辆动态识别,只演⽰从图像中识别车牌信息,车牌识别功能的实现⽅式⼤致分为两种,⼀种是⾃⼰编写代码实现,另⼀种是借助第三⽅ API 接⼝实现。

⾃⼰实现如果我们想要通过 Python ⾃⼰⼿动编码实现车牌识别功能,可以借助⼀些 Python 库,⽐如:OpenCV、TensorFlow 等,这种⽅式因为每⼀个功能点都需要我们⾃⼰编码实现,所有会相对复杂⼀些,另⼀⽅⾯如果我们想要保证识别的准确性,可能需要做⼤量的实验,也就是说会花费更多的时间。

第三⽅接⼝现在已经有⼀些第三⽅平台实现好了车牌识别的功能,并且他们对外提供了 API 接⼝,我们只需要调⽤他们提供的接⼝即可,这种⽅式实现就相对简单了⼀些,并且通常接⼝提供⽅对外提供的接⼝功能的准确性也是基本可以保证的,原因很简单,如果接⼝功能太差的话,⼀是⾃⼰打脸,还有就是基本不会有什么⼈使⽤,也就失去了接⼝对外提供的价值了,另外第三⽅接⼝可能会收取⼀定费⽤,因此,如果现实中我们具体实现的话要综合考虑。

具体实现SDK 安装百度云 SDK 对多种语⾔提供了⽀持,⽐如:Python、Java、C++、IOS、Android 等,这⾥我们安装 Python 版的 SDK,安装很简单,使⽤pip install baidu-aip命令即可。

车牌识别代码OpenCV

车牌识别代码OpenCV

车牌识别代码OpenCV#include<opencv2\opencv.hpp>#include<iostream> using namespace cv; using namespace std; int areas;//该函数⽤来验证是否是我们想要的区域,车牌定位原理其实就是在图⽚上寻找矩形,我们可以⽤长宽⽐例以及⾯积来验证是否是我们想要的矩形,宽⾼⽐为520/110=4.7272 (车牌的长除以宽),区域⾯积最⼩为15个像素,最⼤为125个像素bool VerifySize(RotatedRect candidate) { float error = 0.4; //40%的误差范围float aspect = 4.7272;//宽⾼⽐例int min = 25 * aspect * 25; //最⼩像素为15int max = 125 * aspect * 125;//最⼤像素为125float rmin = aspect - aspect*error;//最⼩误差float rmax = aspect + aspect*error;//最⼤误差int area = candidate.size.height*candidate.size.width;//求⾯积float r = (float)candidate.size.width / (float)candidate.size.height;//长宽⽐if (r < 1)r = 1 / r;if (area<min || area>max || r<rmin || r>rmax)return false;elsereturn true; } int main(int argc, char** argv) {Mat src;src = imread("D:\\Car1.jpg");//读取含车牌的图⽚if (!src.data) {cout << "Could not open Car.jph.." << endl;return -1;}Mat img_gray;cvtColor(src, img_gray, CV_BGR2GRAY);//灰度转换Mat img_blur;blur(img_gray, img_blur, Size(5, 5));//⽤来降噪Mat img_sobel;Sobel(img_gray, img_sobel, CV_8U, 1, 0, 3);//Sobel滤波,对x进⾏求导,就是强调y⽅向,对y进⾏求导,就是强调x⽅向,在此我们对x求导,查找图⽚中的竖直边Mat img_threshold;threshold(img_sobel, img_threshold, 0, 255, THRESH_BINARY | THRESH_OTSU);Mat element = getStructuringElement(MORPH_RECT, Size(21, 5));//这个Size很重要!!不同的图⽚适应不同的Size,待会在下⾯放图,⼤家就知道区别了morphologyEx(img_threshold, img_threshold,MORPH_CLOSE,element);//闭操作,就是先膨胀后腐蚀,⽬的就是将图⽚联通起来,取决于element的Size。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

车牌识别电子1301 孙洪江 20一、目的与要求车牌定位系统的目的在于正确获取整个图像中车牌的区域,并识别出车牌号。

通过设计实现车牌识别系统,能够提高学生分析问题和解决问题的能力,还能培养一定的科研能力二、设计原理:牌照自动识别是一项利用车辆的动态视频或静态图像进行牌照号码、牌照颜色自动识别的模式识别技术。

其硬件基础一般包括触发设备、摄像设备、照明设备、图像采集设备、识别车牌号码的处理机等,其软件核心包括车牌定位算法、车牌字符分割算法和光学字符识别算法等。

某些牌照识别系统还具有通过视频图像判断车辆驶入视野的功能称之为视频车辆检测。

一个完整的牌照识别系统应包括车辆检测、图像采集、牌照识别等几部分。

当车辆检测部分检测到车辆到达时触发图像采集单元,采集当前的视频图像。

牌照识别单元对图像进行处理,定位出牌照位置,再将牌照中的字符分割出来进行识别,然后组成牌照号码输出。

三、详细设计步骤:为了进行牌照识别,需要以下几个基本的步骤:a.牌照定位,定位图片中的牌照位置;b.牌照字符分割,把牌照中的字符分割出来;c.牌照字符识别,把分割好的字符进行识别,最终组成牌照号码。

牌照识别过程中,牌照颜色的识别依据算法不同,可能在上述不同步骤实现,通常与牌照识别互相配合、互相验证。

(1)牌照定位:自然环境下,汽车图像背景复杂、光照不均匀,如何在自然背景中准确地确定牌照区域是整个识别过程的关键。

首先对采集到的视频图像进行大范围相关搜索,找到符合汽车牌照特征的若干区域作为候选区,然后对这些侯选区域做进一步分析、评判,最后选定一个最佳的区域作为牌照区域,并将其从图象中分割出来。

(2)牌照字符分割 :完成牌照区域的定位后,再将牌照区域分割成单个字符,然后进行识别。

字符分割一般采用垂直投影法。

由于字符在垂直方向上的投影必然在字符间或字符内的间隙处取得局部最小值的附近,并且这个位置应满足牌照的字符书写格式、字符、尺寸限制和一些其他条件。

利用垂直投影法对复杂环境下的汽车图像中的字符分割有较好的效果。

(3)牌照字符识别 :字符识别方法目前主要有基于模板匹配算法和基于人工神经网络算法。

基于模板匹配算法首先将分割后的字符二值化,并将其尺寸大小缩放为字符数据库中模板的大小,然后与所有的模板进行匹配,最后选最佳匹配作为结果。

基于人工神经元网络的算法有两种:一种是先对待识别字符进行特征提取,然后用所获得特征来训练神经网络分配器;另一种方法是直接把待处理图像输入网络,由网络自动实现特征提取直至识别出结果。

实际应用中,牌照识别系统的识别率与牌照质量和拍摄质量密切相关。

牌照质量会受到各种因素的影响,如生锈、污损、油漆剥落、字体褪色、牌照被遮挡、牌照倾斜、高亮反光、多牌照、假牌照等等;实际拍摄过程也会受到环境亮度、拍摄亮度、车辆速度等等因素的影响。

这些影响因素不同程度上降低了牌照识别的识别率,也正是牌照识别系统的困难和挑战所在。

为了提高识别率,除了不断的完善识别算法,还应该想办法克服各种光照条件,使采集到的图像最利于识别。

四、各个功能模块的主要实现程序1.载入车牌图像:I=imread('');figure(1),imshow(I);title('original image');%将车牌的原图显示出来,结果如下:2.将彩图转换为灰度图并绘制直方图:I1=rgb2gray(I);%将彩图转换为灰度图figure(2),subplot(1,2,1),imshow(I1);title('gray image');figure(2),subplot(1,2,2),imhist(I1);title('灰度图直方图');%绘制灰度图的直方图结果如下所示:3. 用roberts算子进行边缘检测:I2=edge(I1,'roberts',,'both');%选择阈值,用roberts算子进行边缘检测figure(3),imshow(I2);title('roberts operator edge detection image');结果如下:4.图像实施腐蚀操作:se=[1;1;1];I3=imerode(I2,se);%对图像实施腐蚀操作,即膨胀的反操作figure(4),imshow(I3);title('corrosion image');5.平滑图像se=strel('rectangle',[25,25]);%构造结构元素以正方形构造一个seI4=imclose(I3,se);figure(5),imshow(I4);title('smothing image');结果如下所示:6. 删除二值图像的小对象I5=bwareaopen(I4,2000);%去除聚团灰度值小于2000的部分figure(6),imshow(I5);title('remove the small objects'); %用imshow函数显示滤波后图像结果如下所示:7.车牌定位[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:yfor j=1:xif(myI(i,j,1)==1)Blue_y(i,1)= Blue_y(i,1)+1;%蓝色像素点统计 endendend[temp MaxY]=max(Blue_y);%Y方向车牌区域确定PY1=MaxY;while ((Blue_y(PY1,1)>=5)&&(PY1>1))PY1=PY1-1;endPY2=MaxY;while ((Blue_y(PY2,1)>=5)&&(PY2<y))PY2=PY2+1;endIY=I(PY1:PY2,:,:);Blue_x=zeros(1,x);%进一步确定x方向的车牌区域for j=1:xfor i=PY1:PY2if(myI(i,j,1)==1)Blue_x(1,j)= Blue_x(1,j)+1;endendendPX1=1;while ((Blue_x(1,PX1)<3)&&(PX1<x))PX1=PX1+1;endPX2=x;while ((Blue_x(1,PX2)<3)&&(PX2>PX1))PX2=PX2-1;endPX1=PX1-1;%对车牌区域的校正PX2=PX2+1;dw=I(PY1:PY2-8,PX1:PX2,:);t=toc;figure(7),subplot(1,2,1),imshow(IY),title('Line direction areas'); figure(7),subplot(1,2,2),imshow(dw),title('positioning color images');8.字符分割与识别对分割出的彩色车牌图像进行灰度转换、二值化、均值滤波、腐蚀膨胀以及字符分割以从车牌图像中分离出组成车牌号码的单个字符图像,对分割出来的字符进行预处理(二值化、归一化),然后分析提取,对分割出的字符图像进行识别给出文本形式的车牌号码。

代码如下:imwrite(dw,'');%将彩色车牌写入dw文件中a=imread('');%读取车牌文件中的数据b=rgb2gray(a);%将车牌图像转换为灰度图imwrite(b,'gray licence ');%将灰度图像写入文件中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,'binary licence ');subplot(3,2,2),imshow(d),title('before filtering binary licence plate')h=fspecial('average',3);d=im2bw(round(filter2(h,d)));%使用指定的滤波器h对h进行d即均值滤波imwrite(d,'after average licence ');subplot(3,2,3),imshow(d),title('after average licence plate')se=eye(2); % eye(n) returns the n-by-n identity matrix 单位矩阵[m,n]=size(d);%返回矩阵b的尺寸信息,并存储在m,n中if bwarea(d)/m/n>= %计算二值图像中对象的总面积与整个面积的比是否大于d=imerode(d,se);%如果大于则图像进行腐蚀elseif bwarea(d)/m/n<= %计算二值图像中对象的总面积与整个面积的比是否小于d=imdilate(d,se);%如果小于则实现膨胀操作endimwrite(d,'expansion or corrosion the licence ');subplot(3,2,4),imshow(d),title('expansion or corrosion the licence plate');运行结果如下所示:9.字符分割在汽车牌照自动识别过程中,字符分割有承前启后的作用。

它在前期牌照定位的基础上进行字符的分割,然后再利用分割的结果进行字符识别。

字符识别的算法很多,因为车牌字符间间隔较大,不会出现字符粘连情况,所以此处采用的方法为寻找连续有文字的块,若长度大于某阈值,则认为该块有两个字符组成,需要分割。

一般分割出来的字符要进行进一步的处理,以满足下一步字符识别的需要。

但是对于车牌的识别,并不需要太多的处理就已经可以达到正确识别的目的。

在此只进行了归一化处理,然后进行后期处理。

% 寻找连续有文字的块,若长度大于某阈值,则认为该块有两个字符组成,需要分割%首先创建子函数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~=nwhile s(j)==0j=j+1;endk1=j;while s(j)~=0 && j<=n-1j=j+1;endk2=j-1;if k2-k1>=round(n/[val,num]=min(sum(d(:,[k1+5:k2-5]))); d(:,k1+num+5)=0; % 分割endendd=qiege(d);y1=10;y2=;flag=0;word1=[];while flag==0[m,n]=size(d);left=1;wide=0;while sum(d(:,wide+1))~=0wide=wide+1;endif wide<y1d(:,[1:wide])=0;d=qiege(d);elsetemp=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>y2flag=1;word1=temp; % WORD 1endd(:,[1:wide])=0;d=qiege(d);endend[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);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,'');imwrite(word2,'');imwrite(word3,'');imwrite(word4,'');imwrite(word5,'');imwrite(word6,'');imwrite(word7,'');运行结果如下:10.车牌识别:模板匹配是图象识别方法中最具代表性的基本方法之一,它是将从待识别的图象或图象区域f(i,j)中提取的若干特征量与模板T(i,j)相应的特征量逐个进行比较,计算它们之间规格化的互相关量,其中互相关量最大的一个就表示期间相似程度最高,可将图象归于相应的类。

相关文档
最新文档