MATLAB车牌识别系统设计
首先通过图像二值化方法后,将有利于图像的进一步处理,使得图像变得简单,且数据量减小,这样就能凸显感兴趣的目标的轮廓。在MATLAB中,二值化处理后的图像常用只有0和1的数组表示。二值化的常用算法有全局二值化算法和局部自适应二值化算法两种。全局二值化算法是对每一幅图计算一个单一的阀值,灰度级大于阈值的像素被标记为背景色,否则为前景色。局部自适应二值化算法以像素的邻域的信息为基础来计算每一个像素的阈值,其中一些方法还会计算整个图像中的一个阈值面,如果图像中的一个像的灰度级高于在点的阈值面的计算值,那么把像素标记为背景,否则为前景字符。
1. 基于车牌颜色特征的定位方法
根据彩色图像的RGB比例定位出近似蓝色的候选区域,但是由于RGB三原色空间中两点间的欧氏距离与颜色距离不成线性比例,在设定蓝色区域的定位范围时不能很好的控制,因此造成的定位出错是最主要的。这样在图片中出现较多的蓝色背景情况下识别率会下降,不能有效提取车牌区域。对此本文提出了自适应调节方案。对分割出来的区域进行识别调整。根据长宽比,蓝白色比对候选区域进行多次定位,最终找到车牌区域。
2. 车牌倾斜校正
车牌矫正算法主要是Hough变换法、Radon变换法。由于本文主要运用了Radon变换算法,因此这里主要介绍Radon变换法图像投影,就是说将图像在某一方向上做线性积分。如果将图像看成二维函数,则其投影就是在特定方向上的线性积分,比如在垂直方向上的线性积分就是其在轴上的投影;在水平方向上的线积分就是其在轴上的投影。通过这些投影,可以获取图像在指定方向上的突出特性,这在图像模式识别等处理中可能会用到。Radon变换就是将数字图像矩阵在某一指定角度射线方向上做投影变换。这就是说可以沿着任意角度来做Radon变换。
3. 字符分割
(1)确定图像中字符的大致高度范围:先自下而上对图像进行逐行扫描,直到遇到第一个黑素像素,记下行号,然后自上而下对图像进行逐行扫描,直到遇到第一个黑素像素,记下行号。这两个行号就标志出了字符大致的高度范围。
(2)确定每个字符的左起始和右终止位置:在第一步得到的高度范围内进行自左向右逐列扫描,遇到第一个黑色像素时,认为是字符分割的起始位,然后继续扫描,直到遇到有一列中没有黑色像素,认为是这个字符的右终止位置,准备开始进行下一个字符的分割。按照上述方法继续扫描,直到扫描到图像的最右端。这样就得到了每个字符的比较精确的快读范围。
(3)在已知的每个字符比较精确的宽度范围内,再按照第一步的方法,分别自下而上和自上而下,逐行扫描,来获取每个字符精确的高度范围。
分割车牌字符左右边界时,通过垂直扫描过程,由于数字和字母具有连通性,所以分割数字和字母比较容易。通过垂直扫描过程,统计黑色像素点的个数,由于两个字符之间没有黑像素,所以可以作为字符分割的界限。
(4)由于图像采集时图像的像素值不一样,经切割出来的字符的大小也不会不一样,所以在进行匹配前必须先进行字符图像归一化,使图像大小跟模板图像大小一致。Matlab中提供一个改变图像大小的函数,该函数用于对图像做缩放处理,返回的图像的长宽是原图像的倍,若大于1,则放大图像,若小于1,则缩小图像。
4. 字符识别
(1)依次取出模板字符,将模板字符按照上、下、左、右四个方向,在周围五个像素的范围内滑动,每次分别计算出相似度为值,取其中的最大值作为字符与模板字符之间的相似度函数。
(2)依次从待识别的字符与模板字符的相似度中找出最大相似度所对应的模板字符,判断是否大于该字符的阈值,如果大于,那么待识别的字符的匹配结果就是该模板字符,反之,如果小于,表示不匹配,则需要重新检测。
5. 车牌识别仿真主程序
clc; %清空命令行
clear all; %清除工作空间所有变量
close all; %关闭所有图形窗口
% ==============开始计时==============================
tic
%=====================读入图片=========================
[fn,pn,fi] = uigetfile('汽车图片\*.jpg','选择图片');%显示检索文件的对话框 fn返回的文件名 pn返回的文件的路径名 fi返回选择的文件类型
I = imread([pn fn]); %读入彩色图像
figure('NumberTitle','off','Name','原始图像');
imshow(I);title('原始图像'); %显示原始图像
%==================加入进度条===========================
waitbar_;
%================图像分割区域(车牌定位)==========================
picture =image_segmentation(I);
threshold=50;
%========================倾斜校正=================
[picture_1,angle] = rando_bianhuan(picture); %倾斜校正 picture 返回校正后的图片 angle 返回倾斜角度
%=========================形态学操作====================
picture_6 = xingtaixue(picture_1);%主要对图像
%=============对图像进一步裁剪,保证边框贴近字体===========
bw = caijian(picture_6);
%=================文字分割 ===================================
image=qiege(bw);
%=================显示分割图像结果================================
bb =zifu_shibie(image);
imshow(picture_1),title (['识别车牌号码:', bb],'Color','r');
%=====================导出文本===========================
fid=fopen('Data.txt','a+');
fprintf(fid,'%s\r\n',bb,datestr(now));
fclose(fid);
================读取计时===================================
t= toc;