智能交通系统(Intelligent Transportation System,ITS)是一种将计算机、信息、通讯及自动化控制技术相结合的运用于交通方面的现代化管理体系。它的主要功能是解决城市交通拥挤和堵塞问题,在不增加现有交通道路建设的情况下,运用现代化的信息和通信方面的技术,提高交通道路的通行能力,改善交通拥挤问题。
汽车牌照识别技术(LicensePlateReeognition,LPR)是一种专用的计算机视觉系统,在智能交通系统中占有极其重要的地位。该系统的主要功能是,从一副含有车牌的汽车图片中,自动定位出车牌图像,并对车牌上的字符进行分割,最后识别出分割后的单个字符。
1、系统框图
整个系统可以大致分为下面几个模块:
图1-1 系统模块图
系统的处理过程如下图所示:
图1-2 系统处理流程
2、算法介绍
下面就对每个步骤的具体算法进行介绍:
预处理部分主要作用是为了增强图像和去除噪声,一边在后续处理时减少误差。使用的具体方法是先对图像进行拉氏变换和梯度变换来增强图像的边缘和细节。由于采集到的图像所包含的噪声属于高斯噪声,所以进行高斯滤波来去噪[2]。
拉式变换:
拉式算子:
上式中x值对应像素点所在位置的行数,y为所在位置的列数,f(x,y)为在第x行y列的像素点的像素值。所以拉式变换就转化为对待处理像素的邻域像素的带参运算。
梯度变换:
梯度算子
图2-1 待处理像素邻域像素
同样梯度算子转换成相应像素点的带参运算。高斯滤波的原理与拉氏变换和梯度变换相同,只是高斯滤波的参数是取自高斯函数。
这样就可以完成图像的预处理过程
车牌定位
(1)运用行扫描的方法定位牌照的上下边界: 若某一行的0→1(白到黑)和1→0(黑到白) 变化次数大于设定的阈值(如13,车牌有7个字符,所以跳变至少14次), 则设其为待处理像素邻域像素。
待测车牌的最低点,继续扫描直 至0→1 和1→0 变化次数小于阈值,将该阈值设为待测车牌的最高点。若最高点与最低点之差大于15(即车牌图像的高度),则认为目标已检测到,否则继续进行扫描;如果未检测到符合上述条件的目标,则自动门限值重复以上的操作,直到找到目标为止。
(2)垂直投影法定位牌照的左右边界:在找到车牌的上下限后,利用二值图像在竖直方向上的投影作为特征, 从左到右寻找目标的中心点坐标。
字符分割
字符分割可采用垂直投影法。由于字符块在竖直方向上的投影必然在字符间或字符内的间隙处取得局部最小值, 因此字符的正确分割位置应该在上述局部最小值的附近, 并且这个位置应满足车牌的字符书写格式、字符尺寸限制和一些其他条件。
利用垂直投影法, 对复杂环境下的汽车图像中的字符分割有较好的效果。
字符识别
字符识别使用模板匹配法。
首先将标准模板入库,把每一张“ 标准车牌”分割出来的字符归一化, 接着将归一化后的模板矩阵存入FPGA 中作为标准模板库。采用20×15 bit 大小的数组作为标准模板。
当车牌上的待识别字符归一化以后, 依次与标准库中的模板进行匹配,即矩阵对应位依次做差,分别计算总的相同像素个数,则有最大相同数目的那一组数认为是相似度最大,则用此时的标准模板所对应的数字或字母作为最终识别的结果。
3、Matlab仿真结果
用matlab对上述算法进行了仿真,仿真结果如下(仿真程序见附录):
图3-1 原彩色图像
图3-2 灰度图像
图3-3 二值化后的图像
图3-4 定位出的车牌图像
图3-5 字符分割的结果
将字符归一化为20*15的模板形式以后再与模板库里的字符相比较即可得到识别结果。
图3-6 归一化后的模板
模板库里的模板是与上面的具有相同大小的图像,将归一化后的图像与模板库里存储的图像进行比较运算,距离最小的即认为是判断字符。
从仿真结果来看,使用这种算法完全可以实现车牌识别,由于这种算法对每一个元素的处理过程非常清楚,可以由FPGA实现,从而可以保证整个系统的实时性,提高它的实用价值。
5、附录
Matlab仿真程序:
主函数:
RGB=imread('chepai.jpg');
figure,imshow(RGB),title('ÔͼÏñ');
GRAY=rgb2gray(RGB);
figure,imshow(GRAY),title('»Ò¶ÈͼÏñ');
%Ô¤´¦Àí£¬°üÀ¨Àʽ±ä»»£¬Ìݶȱ任£¬È»ºó¸ß˹Â˲¨
%ÀÊϱ任
l=[0,1,0;1,-4,1;0,1,0];
LAP=imfilter(GRAY,l);
%Ìݶȱ任£¨sobelËã×Ó£©
s=fspecial('sobel');
DIV=imfilter(LAP,s);
GRAY2=imsubtract(GRAY,DIV);
%¸ß˹Â˲¨
g=fspecial('gaussian',3,3);
GRAY3=imfilter(GRAY2,g);
%½Ç¶È±ä»»
%==================================================
theta=0:180;
RD=radon(GRAY3,theta);
thetaiw=maxtheta(RD);
GRAY4=imrotate(GRAY3,358);
%
%¶þÖµ»¯Í¼Ïñ
BW=im2bw(GRAY4);
%³µÅƶ¨Î»
[m,n]=size(BW);
for x=1:m
ch(x)=0;
end
%ͳ¼ÆÌø±ä´ÎÊý
for x=1:m
for y=2:n
if BW(x,y)~=BW(x,y-1)
ch(x)=ch(x)+1;
end
end
end
plot(ch),title('Ìø±ä´ÎÊý');
%È·¶¨³µÅÆͼÏñµÄÉÏϱ߽ç
k=1;
for x=1:m
if ch(x)>13
p(k)=x;
k=k+1;
else
if k<50
k=1;
else break;
end
end
end
p(1)
p(k-1)
% pÖаüº¬ÓÐÁ¬ÐøµÄ±ä»¯Êý³¬¹ý13µÄÐÐÊý
LINE=GRAY4(p(1):p(k-1),:);
figure,imshow(LINE),title('³µÅÆÐÐͼÏñ');
LINE1=BW(p(1):p(k-1),:);
figure,imshow(LINE1);
%È·¶¨³µÅƵÄ×óÓұ߽ç
for y=1:n
col(y)=0;
end
for y=1:n
for x=1:(k-1)
col(y)=col(y)+LINE1(x,y);
end
end
i=0;
j=0;
for y=2:n
if col(y)>0
if col(y-1)==0
i=i+1;
raise(i)=y;
end
else
if col(y-1)>0
j=j+1;
down(j)=y;
end
end
end
CP=LINE1(:,raise(1):down(j));
%¶Ô³µÅƽøÐÐ×Ö·û·Ö¸î
t=0;
for a=1:(i-1)
if raise(a+1)-down(a)>5
t=t+1;
raise1(t+1)=raise(a+1);
down1(t)=down(a);
end
end
raise1(1)=raise(1);
down1(t+1)=down(j);
w=raise(1);
for u=1:(t+1)
raise1(u)=raise1(u)-w+1;
down1(u)=down1(u)-w+1;
end
ZF1=CP(:,raise1(1):down1(1));
ZF2=CP(:,raise1(2):down1(2));
ZF3=CP(:,raise1(3):down1(3));
ZF4=CP(:,raise1(4):down1(4));
ZF5=CP(:,raise1(5):down1(5));
ZF6=CP(:,raise1(6):down1(6));
ZF7=CP(:,raise1(7):down1(7));
ZF8=CP(:,raise1(8):down1(8));
figure,imshow(ZF1),title('×Ö·û1');
figure,imshow(ZF2),title('×Ö·û2');
figure,imshow(ZF3),title('×Ö·û3');
figure,imshow(ZF4),title('×Ö·û4');
figure,imshow(ZF5),title('×Ö·û5');
figure,imshow(ZF6),title('×Ö·û6');
figure,imshow(ZF7),title('×Ö·û7');
figure,imshow(ZF8),title('×Ö·û8');
MB1=temp(ZF1);
MB2=temp(ZF2);
MB3=temp(ZF3);
MB4=temp(ZF4);
MB5=temp(ZF5);
MB6=temp(ZF6);
MB7=temp(ZF7);
MB8=temp(ZF8);
figure,imshow(MB1);
figure,imshow(MB2);
figure,imshow(MB3);
figure,imshow(MB4);
figure,imshow(MB5);
figure,imshow(MB6);
figure,imshow(MB7);
figure,imshow(MB8);
subplot(2,4,1),imshow(MB1);
subplot(2,4,2),imshow(MB2);
subplot(2,4,3),imshow(MB3);
subplot(2,4,4),imshow(MB4);
subplot(2,4,5),imshow(MB5);
subplot(2,4,6),imshow(MB6);
subplot(2,4,7),imshow(MB7);
subplot(2,4,8),imshow(MB8);
求偏转角的子程序(maxtheta):
function y =maxtheta(A)
%UNTITLED Summary of this function goes here
% Detailed explanation goes here
[m,n]=size(A);
k=0;
for i=1:m
for j=1:n
if A(i,j)>k
k=A(i,j);
x=i;
y=j;
end
end
end
制作模板的子程序(temp):
function B=temp(A)
%UNTITLED Summary of this function goes here
% Detailed explanation goes here
[m,n]=size(A);
B=zeros(20,15);
C=zeros(20,n);
a=m/19;
a1=m/20;
b=n/14,
b1=n/15;
%½«Í¼Ïñת»»Îª20ÐеÄͼÏñ
if m>=40
for y=1:n
for x=1:m
c=uint8(x/a)+1;
C(c,y)=C(c,y)+A(x,y);
end
end
elseif m>=20
for y=1:n
for x=1:m
c=uint8(x/a1);
C(c,y)=C(c,y)+A(x,y);
end
end
else
for y=1:n
for x=1:20
c=uint8(x*a1)
C(x,y)=A(c,y);
end
end
end
if n>=30
for x=1:20
for y=1:n
d=uint8(y/b)+1;
B(x,d)=B(x,d)+C(x,y);
end
end
elseif n>=15
for x=1:20
for y=1:n
d=uint8(y/b1);
B(x,d)=B(x,d)+C(x,y);
end
end
else
for x=1:20
for y=1:15
d=uint8(y*b1);
B(x,y)=C(x,d);
end
end
end
for x=1:20
for y=1:15
if B(x,y)~=0
B(x,y)=1;
else
B(x,y)=0;
end
end
end
end