智能交通体系(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 k50
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
|