车牌识别地matlab程序

合集下载

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

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

基于matlab的车牌识别系统一、对车辆图像进行预处理1.载入车牌图像:function [d]=main(jpg)[filename, pathname] = uigetfile({'*.jpg', 'JPEG 文件(*.jpg)'});if(filename == 0), return, endglobal FILENAME %定义全局变量FILENAME = [pathname filename];I=imread(FILENAME);figure(1),imshow(I);title('原图像');%将车牌的原图显示出来结果如下:2.将彩图转换为灰度图并绘制直方图:I1=rgb2gray(I);%将彩图转换为灰度图figure(2),subplot(1,2,1),imshow(I1);title('灰度图像');figure(2),subplot(1,2,2),imhist(I1);title('灰度图直方图');%绘制灰度图的直方图结果如下所示:3. 用roberts算子进行边缘检测:I2=edge(I1,'roberts',0.18,'both');%选择阈值0.18,用roberts算子进行边缘检测figure(3),imshow(I2);title('roberts 算子边缘检测图像');结果如下:4.图像实施腐蚀操作:se=[1;1;1];I3=imerode(I2,se);%对图像实施腐蚀操作,即膨胀的反操作figure(4),imshow(I3);title('腐蚀后图像');5.平滑图像se=strel('rectangle',[25,25]);%构造结构元素以正方形构造一个seI4=imclose(I3,se);% 图像聚类、填充图像figure(5),imshow(I4);title('平滑图像');结果如下所示:6. 删除二值图像的小对象I5=bwareaopen(I4,2000);% 去除聚团灰度值小于2000的部分figure(6),imshow(I5);title('从对象中移除小的对象');结果如下所示:二、车牌定位[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)%如果myI(i,j,1)即myI的图像中坐标为(i,j)的点值为1,即该点为车牌背景颜色蓝色 %则Blue_y(i,1)的值加1Blue_y(i,1)= Blue_y(i,1)+1;%蓝色像素点统计endendend[temp MaxY]=max(Blue_y);%Y方向车牌区域确定%temp为向量white_y的元素中的最大值,MaxY为该值的索引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,:,:);%x方向车牌区域确定%%%%%% X方向 %%%%%%%%%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('行方向合理区域');%行方向车牌区域确定figure(7),subplot(1,2,2),imshow(dw),title('定位裁剪后的车牌彩色图像');的车牌区域如下所示:三、字符分割及处理1.车牌的进一步处理对分割出的彩色车牌图像进行灰度转换、二值化、均值滤波、腐蚀膨胀以及字符分割以从车牌图像中分离出组成车牌号码的单个字符图像,对分割出来的字符进行预处理(二值化、归一化),然后分析提取,对分割出的字符图像进行识别给出文本形式的车牌号码。

如何使用Matlab技术进行车牌识别

如何使用Matlab技术进行车牌识别

如何使用Matlab技术进行车牌识别车牌识别技术是一种在现代交通管理、安保等领域应用广泛的技术。

通过使用Matlab软件,我们可以轻松实现车牌识别功能。

本文将介绍如何使用Matlab技术进行车牌识别。

一、图像预处理在进行车牌识别之前,首先需要对图像进行预处理。

图像预处理的目的是提取车牌信息并减小噪声干扰。

在Matlab中,我们可以使用一系列图像处理函数来实现图像预处理,包括图像二值化、边缘检测、形态学操作等。

这些函数可以帮助我们提取车牌轮廓,并去除背景和噪声。

二、车牌定位车牌定位是车牌识别的关键步骤之一。

通过车牌定位,我们可以找到图像中的车牌区域,并将其与其他区域进行区分。

在Matlab中,可以使用图像分割、形态学滤波等技术来实现车牌定位。

这些技术可以帮助我们提取车牌的形状、颜色和纹理等特征,并将其与其他区域进行区分。

三、字符分割一旦我们成功地定位了车牌区域,就需要将车牌中的字符进行分割。

字符分割是车牌识别中的一个重要环节。

通过将车牌中的字符进行分割,我们可以得到单个字符的图像,为后续的字符识别做准备。

在Matlab中,可以使用一系列图像处理函数来实现字符分割,包括边缘检测、连通性分析和投影分析等。

这些函数可以帮助我们将车牌中的字符与其他区域进行分离。

四、字符识别字符识别是车牌识别的核心任务。

通过对字符进行识别,我们可以得到车牌中的文本信息。

在Matlab中,可以使用模式识别、神经网络或者深度学习等技术来实现字符识别。

这些技术可以帮助我们训练一个分类器,将字符图像与对应的字符进行匹配。

通过匹配算法,我们可以得到车牌的文本信息。

五、车牌识别结果展示在进行车牌识别之后,我们可以将识别结果进行展示。

通过将识别结果与原始图像进行对比,我们可以验证车牌识别的准确性。

在Matlab中,可以使用图像绘制函数和文本显示函数来实现车牌识别结果的展示。

通过这些函数,我们可以在原始图像中标注出识别结果,并将结果显示在图像上。

matlab车牌识别原理

matlab车牌识别原理

matlab车牌识别原理
MATLAB车牌识别原理涉及图像处理和模式识别技术。

首先,图
像被获取并传入MATLAB环境。

然后,车牌识别过程通常包括以下步骤:
1. 图像预处理,包括灰度化、去噪、增强和边缘检测等。

这些
步骤有助于减少干扰和突出车牌区域。

2. 车牌定位,使用图像处理技术,如边缘检测、形态学操作和
轮廓分析,来定位图像中的车牌位置。

3. 字符分割,在车牌上识别出的字符需要被分割成单独的图像。

这通常需要使用分割算法和形态学转换来分离每个字符。

4. 字符识别,对每个单独的字符进行识别。

这可以使用基于模
式识别的方法,如人工神经网络或支持向量机等,来对字符进行分
类和识别。

MATLAB提供了丰富的图像处理和模式识别工具箱,包括用于图
像预处理、特征提取和分类的函数和工具。

通过结合这些工具,可
以实现车牌识别系统的各个步骤。

此外,MATLAB还支持深度学习工具箱,可以用于训练深度神经网络来进行车牌识别。

总的来说,MATLAB车牌识别原理涉及图像处理和模式识别技术的综合应用,通过一系列步骤对车牌图像进行处理和分析,最终实现对车牌的准确识别。

车牌识别的matlab程序(程序-讲解-模板)

车牌识别的matlab程序(程序-讲解-模板)

clcclearclose allI=imread('chepai.jpg');subplot(3,2,1);imshow(I), title('原始图像');I_gray=rgb2gray(I);subplot(3,2,2),imshow(I_gray),title('灰度图像');%====================== 形态学预处理======================I_edge=edge(I_gray,'sobel');subplot(3,2,3),imshow(I_edge),title('边缘检测后图像');se=[1;1;1];I_erode=imerode(I_edge,se);subplot(3,2,4),imshow(I_erode),title('腐蚀后边缘图像');se=strel('rectangle',[25,25]);I_close=imclose(I_erode,se); %图像闭合、填充图像subplot(3,2,5),imshow(I_close),title('填充后图像');I_final=bwareaopen(I_close,2000); %去除聚团灰度值小于2000的部分subplot(3,2,6),imshow(I_final),title('形态滤波后图像');%========================== 车牌分割============================= I_new=zeros(size(I_final,1),size(I_final,2));location_of_1=[];for i=1:size(I_final,1) %寻找二值图像中白的点的位置for j=1:size(I_final,2)if I_final(i,j)==1;newlocation=[i,j];location_of_1=[location_of_1;newlocation];endendendmini=inf;maxi=0;for i=1:size(location_of_1,1)%寻找所有白点中,x坐标与y坐标的和最大,最小的两个点的位置temp=location_of_1(i,1)+location_of_1(i,2);if temp<minimini=temp;a=i;endif temp>maximaxi=temp;b=i;endendfirst_point=location_of_1(a,:); %和最小的点为车牌的左上角last_point=location_of_1(b,:); %和最大的点为车牌的右下角x1=first_point(1)+4; %坐标值修正x2=last_point(1)-4;y1=first_point(2)+4;y2=last_point(2)-4;I_plate=I(x1:x2,y1:y2);I_plate=OTSU(I_plate); %以OTSU算法对分割出的车牌进行自适应二值化处理I_plate=bwareaopen(I_plate,50);figure,imshow(I_plate),title('车牌提取') %画出最终车牌%========================= 字符分割============================X=[]; %用来存放水平分割线的横坐标flag=0;for j=1:size(I_plate,2)sum_y=sum(I_plate(:,j));if logical(sum_y)~=flag %列和有变化时,记录下此列X=[X j];flag=logical(sum_y);endendfigurefor n=1:7char=I_plate(:,X(2*n-1):X(2*n)-1); %进行粗分割for i=1:size(char,1) %这两个for循环对分割字符的上下进行裁剪if sum(char(i,:))~=0top=i;breakendendfor i=1:size(char,1)if sum(char(size(char,1)-i,:))~=0bottom=size(char,1)-i;breakendendchar=char(top:bottom,:);subplot(2,4,n);imshow(char);char=imresize(char,[32,16],'nearest'); %归一化为32*16的大小,以便模板匹配eval(strcat('Char_',num2str(n),'=char;')); %将分割的字符放入Char_i中end%========================== 字符识别============================= char=[];store1=strcat('京','津','沪','渝','冀','晋','辽','吉','黑','苏','浙'... %汉字识别,'皖','闽','赣','鲁','豫','鄂','湘','粤','琼','川','贵','云','陕'...,'甘','青','藏','桂','皖','新','宁','港','鲁','蒙');for j=1:34Im=Char_1;Template=imread(strcat('chinese\',num2str(j),'.bmp')); %chinese文件附在最后Template=im2bw(Template);Differ=Im-Template;Compare(j)=sum(sum(abs(Differ)));endindex=find(Compare==(min(Compare)));char=[char store1(index)];store2=strcat('A','B','C','D','E','F','G','H','J','K','L','M','M','N','P','Q','R'...,'S','T','U','V','W','X','Y','Z','0','1','2','3','4','5','6','7','8','9');for i=2:7 %字母数字识别for j=1:35Im=eval(strcat('Char_',num2str(i)));Template=imread(strcat('cha&num\',num2str(j),'.bmp')); %cha&num文件附在最后Template=im2bw(Template);Differ=Im-Template;Compare(j)=sum(sum(abs(Differ)));endindex=find(Compare==(min(Compare)));char=[char store2(index)];endfigure,imshow(I),title(strcat('车牌为:',char))信研-11 XX 2011301XXXXXX模式识别作业—车牌识别1、作业要求:要求:任给一幅符合假定的图片,自动识别出车牌号。

车牌识别的matlab程序的难点与解决方法

车牌识别的matlab程序的难点与解决方法

车牌识别的matlab程序的难点与解决方法车牌识别是近年来越来越流行的人工智能技术之一,其应用包括智能停车、智能交通等领域。

在车牌识别的matlab程序中,存在许多难点和解决方法,下面我们将对其进行详细介绍和拓展。

一、车牌识别算法的难点1.图像质量要求高车牌识别算法对图像质量要求非常高,因为车牌图像的质量直接影响识别准确率。

图像噪声、光线变化、车牌的形状和大小等因素都会影响车牌识别的精度。

2.多牌识别困难在实际的车牌识别中,往往需要同时识别多张牌,如多个车牌、不同号码的车牌等。

这种情况下,多牌识别是一个难点,需要采用一些特殊的算法和技术来解决。

3.车牌号码提取困难车牌号码提取是车牌识别算法中非常重要的一个环节,但也是难点之一。

因为车牌号码提取需要对图像进行特征提取和字符识别,这对图像的清晰度、颜色深度等要求较高,同时也需要考虑到字符大小、字符形状等因素。

4.字符识别错误在车牌识别中,字符识别是一个重要的环节,但也是容易出现错误的。

因为车牌中的字符形状和大小不同,而且有些字符在图像中可能处于不同的位置,这些因素都可能导致字符识别错误。

二、车牌识别matlab程序的解决方法1.提高图像质量提高图像质量是解决车牌识别算法中图像质量要求高的问题的有效方法。

可以通过调整相机参数、使用高质量的图像编辑软件等方式来提高图像质量。

2.优化多牌识别算法针对多牌识别的难点,可以通过优化算法来实现多牌识别。

可以采用一些特殊的算法和技术,如图像分割、特征提取、字符相似度计算等,来提高车牌识别的准确率和稳定性。

3.优化字符识别算法针对字符识别的难点,可以通过优化字符识别算法来实现。

可以采用一些特殊的算法和技术,如图像分割、特征提取、字符相似度计算等,来提高字符识别的准确率和稳定性。

4.优化车牌号码提取算法针对车牌号码提取的难点,可以通过优化车牌号码提取算法来实现。

可以采用一些特殊的算法和技术,如图像分割、特征提取、字符相似度计算等,来提高车牌号码提取的准确率和稳定性。

(完整版)MATLAB车牌识别

(完整版)MATLAB车牌识别

目录1.引言 (2)2.设计概述 (3)2.1车牌识别技术 (3)2.2 车牌识别技术的发展 (3)2.3 车牌识别技术的国内外研究现状 (4)2.4 主要应用领域 (6)3.设计方案 (7)4.车牌识别系统的matlab实现 (8)4.1 图像的读取 (8)4.2 图像预处理 (9)4.2.1灰度变换 (9)4.2.2 图像校正 (10)4.3 牌照分割 (10)4.3.1 图像边缘提取及二值化 (11)4.3.2 BP神经网络 (14)4.4 车牌提取 (15)5.设计结果及分析 (16)5.1程序运行结果 (16)5.2程序结果分析 (17)总结体会 (18)参考文献 (19)附录1 (20)附录2 (28)1.引言伴随着世界各国车辆数量的增加,城市交通状况日益受到人们的重视。

如何有效地进行交通管理,越来越成为各国政府的相关部门所关注的焦点。

针对这一问题,人们运行先进的信息处理技术、导航定位技术、无线通信技术、自动控制技术、图像处理和识别技术及计算机网络技术等科学技术,相继研发了各种交通道路监视管理系统、车辆控制系统及公共交通系统。

这些系统将车辆和道路综合起来进行考虑,运行各种先进的技术解决道路交通的问题,统称为智能交通系统( Intelligent Transportation System,简称ITS)。

ITS 是20世纪90年代兴起的新一代交通运输系统。

它可以加强道路、车辆、驾驶员和管理人员的联系,实现道路交通管理自动化和车辆行驶的智能化,增强交通安全,减少交通堵塞,提高运输效率,减少环境污染,节约能源,提高经济活力。

智能交通系统以车辆的自动检测作为信息的来源,因而对车牌照等相关信息的自动采集和处理的一门新的交通信息获取技术——车牌识别(License Plate Recognition ,LPR) 技术逐渐发展起来,成为信息处理技术的一项重要研究课题。

车牌自动识别是智能交通管理系统中的关键技术之一。

车牌识别的matlab程序的难点与解决方法(一)

车牌识别的matlab程序的难点与解决方法(一)

车牌识别的matlab程序的难点与解决方法(一)车牌识别的matlab程序的难点与解决引言车牌识别是图像处理领域的一个重要应用,它可以在不同场景下自动识别和提取车辆的车牌信息。

在实际应用中,针对车牌识别的matlab程序存在着一些难点,本文将详细介绍这些难点及相应的解决方法,以帮助资深的创作者更好地实现车牌识别程序。

难点一:车牌识别算法选择子标题一:基于颜色特征的车牌识别算法•难点:车牌颜色在不同光照条件下会发生变化,导致识别算法的准确性下降。

•解决方法:采用颜色空间的变换(例如RGB到HSV),通过调整阈值和颜色范围,去除非车牌区域的干扰。

子标题二:基于边缘检测的车牌识别算法•难点:车牌边缘与周围物体边缘相似,容易造成误判。

•解决方法:利用形态学操作(如膨胀和腐蚀)来实现边缘闭合,并通过设定合适的阈值对边缘进行提取,降低误判概率。

子标题三:基于字符分割的车牌识别算法•难点:字符之间存在粘连和重叠情况,增加了字符分割的难度。

•解决方法:基于连通区域分析的方法,通过计算字符之间的间距和像素个数,对重叠和粘连的字符进行分割。

难点二:噪声影响的处理子标题一:图像预处理•难点:采集到的车牌图像可能存在噪声和模糊问题。

•解决方法:使用图像增强算法(如直方图均衡化和高斯滤波)对车牌图像进行预处理,提高图像的质量。

子标题二:光照不均匀的情况•难点:车牌图像在不同光照条件下会出现明暗不均的问题。

•解决方法:使用自适应阈值化算法,根据图像局部区域的光照情况对图像进行二值化处理,提高车牌识别的准确性。

难点三:多样化的车牌样式和字体子标题一:车牌样式的差异•难点:不同地区和不同国家的车牌样式存在差异,增加了车牌识别的难度。

•解决方法:基于模板匹配的方法,通过建立车牌模板库,对不同样式的车牌进行匹配比对,提高识别的准确性。

子标题二:字体的多样性•难点:不同车牌使用的字体风格各不相同。

•解决方法:使用字符特征提取算法,通过对字符轮廓和特征点的统计分析,识别不同字体的字符。

交通标志检测与识别matlab 和python

交通标志检测与识别matlab 和python

交通标志检测与识别可以使用MATLAB和Python进行实现。

这里给出一个简单的例子,使用Python和OpenCV库进行交通标志检测与识别。

首先,确保已经安装了Python和OpenCV库。

可以使用以下命令安装OpenCV:```bashpip install opencv-python```接下来,创建一个名为`traffic_sign_detection.py`的Python文件,并添加以下代码:```pythonimport cv2# 加载预训练的模型model = cv2.dnn.readNetFromTensorflow('frozen_inference_graph.pb', 'graph.pbtxt')# 读取图像image = cv2.imread('test_image.jpg')# 将图像转换为blob格式blob = cv2.dnn.blobFromImage(image, size=(300, 300), swapRB=True, crop=False)# 设置输入并进行前向传播model.setInput(blob)output = model.forward()# 获取检测结果for detection in output[0, 0, :, :]:confidence = detection[2]if confidence > 0.5:class_id = int(detection[1])x1, y1, x2, y2 = (detection[3:7] * [image.shape[1], image.shape[0], image.shape[1], image.shape[0]]).astype(int)# 绘制边界框和类别标签cv2.rectangle(image, (x1, y1), (x2, y2), (0, 255, 0), 2)label = f"Class {class_id}: {confidence:.2f}"cv2.putText(image, label, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)# 显示结果cv2.imshow('Traffic Sign Detection', image)cv2.waitKey(0)cv2.destroyAllWindows()```注意:这个例子需要一个预训练的模型(`frozen_inference_graph.pb`和`graph.pbtxt`),你可以从互联网上找到一些开源的交通标志检测模型。

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

(附录车牌识别程序clear ;close all;%Step1 获取图像装入待处理彩色图像并显示原始图像Scolor = imread('');%imread函数读取图像文件%将彩色图像转换为黑白并显示Sgray = rgb2gray(Scolor);%rgb2gray转换成灰度图"figure,imshow(Scolor),title('原始彩色图像');%figure命令同时显示两幅图figure,imshow(Sgray),title('原始黑白图像');%Step2 图像预处理对Sgray 原始黑白图像进行开操作得到图像背景s=strel('disk',13);%strel函数Bgray=imopen(Sgray,s);%打开sgray s图像figure,imshow(Bgray);title('背景图像');%输出背景图像%用原始图像与背景图像作减法,增强图像Egray=imsubtract(Sgray,Bgray);%两幅图相减¥figure,imshow(Egray);title('增强黑白图像');%输出黑白图像%Step3 取得最佳阈值,将图像二值化fmax1=double(max(max(Egray)));%egray的最大值并输出双精度型fmin1=double(min(min(Egray)));%egray的最小值并输出双精度型level=(fmax1-(fmax1-fmin1)/3)/255;%获得最佳阈值bw22=im2bw(Egray,level);%转换图像为二进制图像bw2=double(bw22);%Step4 对得到二值图像作开闭操作进行滤波、figure,imshow(bw2);title('图像二值化');%得到二值图像grd=edge(bw2,'canny')%用canny算子识别强度图像中的边界figure,imshow(grd);title('图像边缘提取');%输出图像边缘bg1=imclose(grd,strel('rectangle',[5,19]));%取矩形框的闭运算figure,imshow(bg1);title('图像闭运算[5,19]');%输出闭运算的图像bg3=imopen(bg1,strel('rectangle',[5,19]));%取矩形框的开运算figure,imshow(bg3);title('图像开运算[5,19]');%输出开运算的图像bg2=imopen(bg3,strel('rectangle',[19,1]));%取矩形框的开运算\figure,imshow(bg2);title('图像开运算[19,1]');%输出开运算的图像%Step5 对二值图像进行区域提取,并计算区域特征参数。

进行区域特征参数比较,提取车牌区域[L,num] = bwlabel(bg2,8);%标注二进制图像中已连接的部分Feastats = imfeature(L,'basic');%计算图像区域的特征尺寸Area=[];%区域面积BoundingBox=[];%[x y width height]车牌框架大小RGB = label2rgb(L, 'spring', 'k', 'shuffle'); %标志图像向RGB图像转换figure,imshow(RGB);title('图像彩色标记');%输出框架的彩色图像(lx=0;for l=1:numwidth=BoundingBox((l-1)*4+3);%框架宽度的计算hight=BoundingBox((l-1)*4+4);%框架高度的计算if (width>98 & width<160 & hight>25 & hight<50)%框架的宽度和高度的范围lx=lx+1;Getok(lx)=l;end|endfor k= 1:lxl=Getok(k);startcol=BoundingBox((l-1)*4+1)-2;%开始列startrow=BoundingBox((l-1)*4+2)-2;%开始行width=BoundingBox((l-1)*4+3)+8;%车牌宽hight=BoundingBox((l-1)*4+4)+2;%车牌高rato=width/hight;%计算车牌长宽比,if rato>2 & rato<4break;endendsbw1=bw2(startrow:startrow+hight,startcol:startcol+width-1); %获取车牌二值子图subcol1=Sgray(startrow:startrow+hight,startcol:startcol+width-1);%获取车牌灰度子图figure,subplot(2,1,1),imshow(subcol1);title('车牌灰度子图');%输出灰度图subplot(2,1,2),imshow(sbw1);title('车牌二值子图');%输出车牌的二值图~%Step6 计算车牌水平投影,并对水平投影进行峰谷分析histcol1=sum(sbw1); %计算垂直投影histrow=sum(sbw1'); %计算水平投影figure,subplot(2,1,1),bar(histcol1);title('垂直投影(含边框)');%输出垂直投影subplot(2,1,2),bar(histrow); title('水平投影(含边框)');%输出水平投影figure,subplot(2,1,1),bar(histrow); title('水平投影(含边框)');%输出水平投影subplot(2,1,2),imshow(sbw1);title('车牌二值子图');%输出二值图%对水平投影进行峰谷分析~meanrow=mean(histrow);%求水平投影的平均值minrow=min(histrow);%求水平投影的最小值levelrow=(meanrow+minrow)/2;%求水平投影的平均值count1=0;l=1;for k=1:hightif histrow(k)<=levelrowcount1=count1+1;]elseif count1>=1markrow(l)=k;%上升点markrow1(l)=count1;%谷宽度(下降点至下一个上升点) l=l+1;endcount1=0;end:endmarkrow2=diff(markrow);%峰距离(上升点至下一个上升点)[m1,n1]=size(markrow2);n1=n1+1;markrow(l)=hight;markrow1(l)=count1;markrow2(n1)=markrow(l)-markrow(l-1);l=0;!for k=1:n1markrow3(k)=markrow(k+1)-markrow1(k+1);%下降点markrow4(k)=markrow3(k)-markrow(k);%峰宽度(上升点至下降点) markrow5(k)=markrow3(k)-double(uint16(markrow4(k)/2));%峰中心位置end%Step7 计算车牌旋转角度%(1)在上升点至下降点找第一个为1的点[m2,n2]=size(sbw1);%sbw1的图像大小…[m1,n1]=size(markrow4);%markrow4的大小maxw=max(markrow4);%最大宽度为字符if markrow4(1) ~= maxw%检测上边ysite=1;k1=1;for l=1:n2for k=1:markrow3(ysite)%从顶边至第一个峰下降点扫描if sbw1(k,l)==1:xdata(k1)=l;ydata(k1)=k;k1=k1+1;break;endendendelse %检测下边,ysite=n1;if markrow4(n1) ==0if markrow4(n1-1) ==maxwysite= 0; %无下边elseysite= n1-1;endend|if ysite ~=0k1=1;for l=1:n2k=m2;while k>=markrow(ysite) %从底边至最后一个峰的上升点扫描 if sbw1(k,l)==1xdata(k1)=l;ydata(k1)=k;#k1=k1+1;break;endk=k-1;endendendend@%(2)线性拟合,计算与x夹角fresult = fit(xdata',ydata','poly1'); %poly1 Y = p1*x+p2 p1=;angle=atan*180/pi; %弧度换为度,360/2pi, pi=%(3)旋转车牌图象subcol = imrotate(subcol1,angle,'bilinear','crop'); %旋转车牌图象sbw = imrotate(sbw1,angle,'bilinear','crop');%旋转图像figure,subplot(2,1,1),imshow(subcol);title('车牌灰度子图');%输出车牌旋转后的灰度图像标题显示车牌灰度子图~subplot(2,1,2),imshow(sbw);title('');%输出车牌旋转后的灰度图像title(['车牌旋转角: ',num2str(angle),'度'] ,'Color','r');%显示车牌的旋转角度%Step8 旋转车牌后重新计算车牌水平投影,去掉车牌水平边框,获取字符高度histcol1=sum(sbw); %计算垂直投影histrow=sum(sbw'); %计算水平投影figure,subplot(2,1,1),bar(histcol1);title('垂直投影(旋转后)');subplot(2,1,2),bar(histrow); title('水平投影(旋转后)');figure,subplot(2,1,1),bar(histrow); title('水平投影(旋转后)');、subplot(2,1,2),imshow(sbw);title('车牌二值子图(旋转后)');%去水平(上下)边框,获取字符高度maxhight=max(markrow2);findc=find(markrow2==maxhight);rowtop=markrow(findc);rowbot=markrow(findc+1)-markrow1(findc+1);sbw2=sbw(rowtop:rowbot,:); %子图为(rowbot-rowtop+1)行maxhight=rowbot-rowtop+1; %字符高度(rowbot-rowtop+1) '%Step9 计算车牌垂直投影,去掉车牌垂直边框,获取车牌及字符平均宽度histcol=sum(sbw2); %计算垂直投影figure,subplot(2,1,1),bar(histcol);title('垂直投影(去水平边框后)');%输出车牌的垂直投影图像subplot(2,1,2),imshow(sbw2); %输出垂直投影图像title(['车牌字符高度: ',int2str(maxhight)],'Color','r');%输出车牌字符高度%对垂直投影进行峰谷分析meancol=mean(histcol);%求垂直投影的平均值mincol=min(histcol);%求垂直投影的平均值!levelcol=(meancol+mincol)/4;%求垂直投影的1/4count1=0;l=1;for k=1:widthif histcol(k)<=levelcolcount1=count1+1;elseif count1>=1>markcol(l)=k; %字符上升点markcol1(l)=count1; %谷宽度(下降点至下一个上升点) l=l+1;endcount1=0;endendmarkcol2=diff(markcol);%字符距离(上升点至下一个上升点) .[m1,n1]=size(markcol2);n1=n1+1;markcol(l)=width;markcol1(l)=count1;markcol2(n1)=markcol(l)-markcol(l-1);%Step10 计算车牌上每个字符中心位置,计算最大字符宽度maxwidth l=0;for k=1:n1&markcol3(k)=markcol(k+1)-markcol1(k+1);%字符下降点markcol4(k)=markcol3(k)-markcol(k); %字符宽度(上升点至下降点)markcol5(k)=markcol3(k)-double(uint16(markcol4(k)/2));%字符中心位置endmarkcol6=diff(markcol5); %字符中心距离(字符中心点至下一个字符中心点)maxs=max(markcol6); %查找最大值,即为第二字符与第三字符中心距离findmax=find(markcol6==maxs);markcol6(findmax)=0;、maxwidth=max(markcol6);%查找最大值,即为最大字符宽度%Step11 提取分割字符,并变换为22行14列标准子图l=1;[m2,n2]=size(subcol);figure;for k=findmax-1:findmax+5cleft=markcol5(k)-maxwidth/2;cright=markcol5(k)+maxwidth/2-2;'if cleft<1cleft=1;cright=maxwidth;endif cright>n2cright=n2;cleft=n2-maxwidth;end`SegGray=sbw(rowtop:rowbot,cleft:cright);SegBw1=sbw(rowtop:rowbot,cleft:cright);SegBw2 = imresize(SegBw1,[22 14]);%变换为22行14列标准子图subplot(2,n1,l),imshow(SegGray);if l==7title(['车牌字符宽度:',int2str(maxwidth)],'Color','r');endsubplot(2,n1,n1+l),imshow(SegBw2);#fname=strcat('c:\work\sam\image',int2str(k),'.jpg');imwrite(SegBw2,fname,'jpg')l=l+1;end%Step12 将计算计算获取的字符图像与样本库进行匹配,自动识别出字符代码。

相关文档
最新文档