数字图像处理——基于matlab的车牌号智能识别系统

(有小伙伴看了文章,想要字符模板,这里给出模板链接,下载后把字符模块文件夹放在程序的文件目录下就好)
字符模板
(后续加了GUI,参见下边)
GUI入门:给车牌识别系统加个GUI
(源码资源有常私我vx:xdsqczkyqs713)
先上个动图给个效果:

车牌识别技术的推广普及对加强道路管理、城市交通事故、违章停车、处理车辆被盗案件、保障社会稳定等方面有非常重大的影响。本文以生活中最常见的蓝底白字的小型汽车的车牌照为例,介绍一种通过车牌区域颜色特征来标定图片中的车牌位置,继而分割出车牌区域图像,二值化,形态学处理,分割单个字符,规整字符图像大小,与已有字符模板比对,按照逻辑值相差最小原则匹配字符,作为车牌号码识别结果输出。

一、图像预处理
预处理的具体操作是规整大小、噪声滤波,规整为统一大小便于后续处理的参数设置,提高定位精确度及识别正确率。
规整大小函数:imresize(I,[row,col])

接着进行图像平滑滤波。RGB图像的平滑滤波,需要将R,G,B三个色道分别提取出,分别滤波。这里采用3*3的中值滤波算子,对三个色道分别滤波,然后使用cat函数将三色道整合起来。

R=K(:,:,1);G=K(:,:,2);B=K(:,:,3);%提取色道
R=medfilt2(R,[3,3]);
G=medfilt2(G,[3,3]);
B=medfilt2(B,[3,3]);%3*3模板中值滤波
K=cat(3,R,G,B); %将三个色道整合

二、车牌定位
车牌定位依据的是车牌蓝色底色的特点,即颜色区分法,因此,确定车牌底色的蓝色RGB值范围非常重要。先打开一幅车牌图片,查看下车牌底色的RGB值。
数字图像处理——基于matlab的车牌号智能识别系统_第1张图片
车牌底色为蓝色,因此B值较高,R和G值较小,初步考虑车牌底色RGB范围应是:R<=RT, G<=GT, B>=BT (RT,GT,BT分别为RGB三色道的颜色阈值)
从网络上查询相应资料,并实际取点查看RGB色值,最终确定的判断门限为:((K(i,j,1)<=76)&&(K(i,j,2)<=146)&&(K(i,j,3)>=115))
有了这个判断门限条件,对图像进行遍历,符合蓝色条件的赋值为1(白色)。

%车牌号定位%rgb蓝底颜色区分法%
Blue=zeros(m,n);
for i=1:m    
  for j=1:n        
      if(((K(i,j,1)<=76)&&(K(i,j,2)<=146)&&(K(i,j,3)>=115)))           
       %%%蓝色度RGB的灰度范知围道          
        Blue(i,j)=1;        
      end    
   end
 end%得到车牌蓝色区域初始判断的二值图像

考虑到颜色阈值设置不精准、有噪声斑点等情况,对初判图像进行闭运算,填平区域中的小孔,平滑区域边界,再去除可能产生干扰的散点。
p1= bwmorph(Blue,‘close’); %闭运算平滑区域边界
p1=bwareaopen(p1,20); % 去除零散蓝点防止干扰

然后对二值图像分别行列遍历,以白色区域的所在行或列它的逻辑值比较大为条件,设置阈值,确定车牌的上下边界、左右边界。
根据定下来的边界,计算车牌区域尺寸,考虑到误差的情况,稍微放大计算的区域,避免车牌区域缺失、信息遗漏。然后从原图中标定出车牌,并截取下来。
数字图像处理——基于matlab的车牌号智能识别系统_第2张图片
数字图像处理——基于matlab的车牌号智能识别系统_第3张图片
三、车牌区域处理
区域边框、铆钉、车牌字符的间隔点,都是后续字符分割的干扰因素,使用二值图像的形态学处理去除这些干扰因素。
bw=im2bw(pic2);%转为二值图像
bw1=imclearborder(bw);%清理、平滑边界
bw2=bwareaopen(bw1,20);%删除小于20的连通域除去散点(锈迹、污渍等)
bw2=bwareaopen(bw2,80);%删除小于80的连通域去掉间隔点
数字图像处理——基于matlab的车牌号智能识别系统_第4张图片
再次依据车牌区域的行列逻辑值较高,精准定位车牌字符区域,以30个像素点作为判断阈值,去除边缘位置的铆钉。

bw3=bw2;
[H,L]=size(bw3);
 
WL=0;
while sum(bw3(:,WL+1))<2 && WL<L-2
    WL=WL+1;
end
WR=L-1;
while sum(bw3(:,WR-1))<2 && WR>2
    WR=WR-1;
end
 
top=3;
bot=H-3;
while sum(bw3(top,WL:WR))<=30
    top=top+1;
end
while sum(bw3(bot,WL:WR))<=30
    bot=bot-1;
end
 
WL=WL-2;
WR=WR+2;
bw3=imcrop(bw3,[WL top WR-WL bot-top]);
figure()
imshow(bw3)
title('字符区域精取');

数字图像处理——基于matlab的车牌号智能识别系统_第5张图片
四、字符分割
字符区域确定下来后,只要对列进行遍历,提高边界判断的要求,逻辑值为0,判断为黑色区域,逻辑值为1,判断为包含字符的区域,或者自己设置一个较小的阈值也ok。将字符分割,从原二值图像中截取下来。

%车牌字符分割
[H,L]=size(bw3);
w1=0;
while sum(bw3(:,w1+1))==0 && w1<L-2
    w1=w1+1;
end
w2=w1;
while sum(bw3(:,w2+1))~=0 && w2<L-2
    w2=w2+1;
end
 
e1=imcrop(bw3,[w1 1 w2-w1 H]);
figure()
imshow(e1)
title('第一个字符分割')

数字图像处理——基于matlab的车牌号智能识别系统_第6张图片

后一个字符的左边界,从前一个字符的右边界开始遍历,碰到某列逻辑值非0,视为抵达字符左边界。接着遍历,碰到某列的逻辑值归0后,视为有边界。依次分割出7个字符。
数字图像处理——基于matlab的车牌号智能识别系统_第7张图片

五、 字符识别
字符识别需要有相应的模板库
保存下分割后的字符图像,开始进行字符识别。第一个字符为行省简称,其余六个字符为数字与字母的组合,据此分别构建行省简称字符模板与数字、字母字符模板,供识别匹配备用。字符模板制作统一为40*20的二值图像,利用模字制作软件,制模后保存在同一个文件夹中以备用
数字图像处理——基于matlab的车牌号智能识别系统_第8张图片

对分割出的七个字符图像进行遍历,规整车牌字符与字符模板相同大小,将车牌字符与每个模板字符相减,把所有相减的结果记录在误差数组error中,取相差最小的那个模板字符为识别结果输出。
为了提高匹配速度,依据车牌字符的特点,将字符分为两组,汉字组character和数字字母组numberAlphabet组。将匹配结果放下字符数组result中,作为结果输出


charWith=40;
charHigh=20;%模字大小设置
chars={e1,e2,e3,e4,e5,e6,e7};
character=['鄂','粤','京','鲁','辽','浙','陕','津','豫'];
numberAlphabet=['0','1','2','3','4','5','6','7','8','9',...
    'A','B','C','D','E','F','G','H','K','M','N','L','S','W','J','N','U','Q'];
result=[];
index=ones(1,7);
Num1=length(character);
Num2=length(numberAlphabet);
error=zeros(1,Num1);
Error=zeros(1,Num2);
for i=1:7
    e=(chars(i));
    e=cell2mat(e);%转换为二值型
    e=imresize(e,[charWith,charHigh]);%规整大小
    if i==1
        for j=1:Num1
            fname=strcat('字符模板\',character(j),'.jpg');
            model=imread(fname);
            model=im2bw(model);
            error(j)=sum(sum(abs(e-model)));
        end
        best=min(error);
        index(i)=find(error==best);
        result=character(index(i));
    else
        for j=1:Num2
            fname=strcat('字符模板\',numberAlphabet(j),'.jpg');
            model=imread(fname);
            model=im2bw(model);
            Error(j)=sum(sum(abs(e-model)));
        end
        best=min(Error);
        index(i)=find(Error==best);
        result=[result,numberAlphabet(index(i))];
    end
end
result

识别结果:
数字图像处理——基于matlab的车牌号智能识别系统_第9张图片
结果还行哈,对图片的清晰度有要求,程序比较粗糙,不能保证很高的识别成功率。
这里已经给了程序中包括识别在内的关键代码,GUI实在太大了就不放了哈。
有帮助记得双击么么哒!

下边是我思考的一些优化方法:
可以考虑使用HSV颜色空间系统,优化代码,添加图片亮度检测环节,判定图片情景的光照条件,依据光照强度的不同,匹配不同的颜色判断系统,进而优化定位判断;引入边缘检测环节,锁定检测的蓝色区域边界大致为长方形的判断为车牌区域以区分图像中的其他蓝色区域;形态学处理的时候进一步添加标准车牌的字符区与边框大小,边框比例,间隔大小,等参数,优化字符串区域提取环节;字符识别匹配环节中,可增加多套字符模板,添加不同角度的字符样板,多次匹配,提高识别正确率等。

你可能感兴趣的:(数字图像处理,车牌号自动识别)