基于MATLAB 的车牌定位及提取算法与实现1.车牌定位的基本理论与算法1.1彩色图像灰度化彩色图像包含着大量的颜色信息,不但在存储上开销很大,而且在处理上也会降低系统的执行速度,因此在对图像进行识别等处理中经常将彩色图像转变为灰度图像,以加快处理速度。
经过灰度变换后,像素的动态范围增加,图像的对比度扩展,使图像变得更加清晰、细腻、容易识别。
在车牌识别中要利用灰度分布的特征进行进一步的分割、识别,因此对车牌图像进行灰度化成为车牌定位的必要步骤之一。
1.2灰度拉伸车牌图像定位是个难点,抓拍图像受环境因素影响很大,尤其当外界光照条件过强或过弱时,容易使得整幅图像偏亮或偏暗,这种情况成为低对比度。
为了提高对比度,把感兴趣的灰度范围拉开,使得该范围内的像素,亮的越亮,暗的越暗,就要对图像进行灰度拉伸,使图像上的边缘更加凸显,这样牌照区的笔画特征就会更加明显,更有益于下一步的处理。
灰度拉伸变换原理图如图10.3所示,函数表达式为⎪⎪⎪⎩⎪⎪⎪⎨⎧>---≤≤+---<=b x b x b d bx a c a x ab c d a x x ad x f ),(255255,)()( (10.5)式(10.5)中(a,c)和(b,d)是图10.3中的两个转折点的坐标。
设图像为mxn 像素,其直方图为h(i),a 取满足10)(0mni h ai ≥∑=的最小整数,b 取满足 mn i h ai 109)(0≤∑=的最大整数,c 和d 分别可以在程序中动态设定,也可以根据经验自行设定。
在图10.4中取23,9.0bd a c ==1.3边缘检测图像的边缘是图像的最基本特征。
所谓边缘是指其周围像素灰度有阶跃变化或屋顶变化的那些像素的集合。
边缘广泛存在于物体和背景之间、物体和物体之间、基元和基元之间。
因此,它是图像分割所依赖的重要特征。
常用的边缘检测方法有Sobel 边缘算子、Prewitt 边缘算子、Kirseh 边缘算子、高斯--拉普拉斯算子等等。
该文采用的是Canny 边缘检测的方法。
该方法为最优的阶梯型边缘检测算法。
1.4开闭操作图像滤波形态学的数学基础和所用语言是集合论,其基本运算有四种:膨胀、腐蚀、开启和闭合。
基于这些基本运算,还可以推导和组合成各种数学形态学实用算法。
对图像做了开运算和闭运算,闭运算可以使图像的轮廓线更为光滑,它通常用来消掉狭窄的间断和长细的鸿沟,消除小的孔洞,并弥补轮廓线中的断裂。
1.5 区域标记对二值图像进行区域提取时,首先需要对对图像每个区域进行标记,其中应用到了连通对象进行标注函数bwlabel 主要对二维二值图像中各个分离部分进行标注,其用法如下:[L,num] = bwlabel(BW,n)其中,L 表示返回和BW 相同大小的数组,而且包含了连通对象的标注。
参数n 为4或8,分别对应4邻域和8邻域,默认值为8。
Num 为返回连通数。
然后,需要得到图像区域属性。
计算每个区域的图像特征参数:区域中心位置、最小包含矩形、面积。
这里给出在Matlab 图像处理工具箱中非常重要的一个图像分析函数:regionprops 。
它的用途是get the properties of region ,即用来度量图像区域属性的函数。
其用法如下:S = regionprops(L,properties)其中,测量标注矩阵L中每一个标注区域的一系列属性。
L中不同的正整数元素对应不同的区域,例如:L中等于整数1的元素对应区域1;L中等于整数2的元素对应区域2;以此类推。
返回值S是一个长度为max(L(:))的结构数组,结构数组的相应域定义了每一个区域相应属性下的度量。
properties可以是由逗号分割的字符串列表、饱含字符串的单元数组、单个字符串‘all' 或者‘basic'。
如果properties等于字符串‘all',则所有下述字串列表中的度量数据都将被计算,如果properties 没有指定或者等于‘basic',则属性:‘Area',‘Centroid', 和‘BoundingBox' 将被计算。
本文对已经得到了可行车牌区域的连通域,进行连通域分析均用到上述函数,从而计算出包含所标记的区域的最小宽和高。
并根据先验知识,即对标准车牌而言这个宽高比大致为44:14,不妨取34:14~54:14为字符区域的宽高比范围。
比较谁的宽高比更接近实际车牌宽高比,将更接近的提取并显示出来。
2.车牌定位算法MATLAB实现2.1图像预处理2.1.1图像灰度化I=imread('che01.jpg');figure(1),imshow(I);I_gray=rgb2gray(I);%对原图进行灰度化figure(2),imshow(I_gray);2.1.2灰度拉伸增强I_ls=fdlasen(I_gray);%用自编函数fdlasen对图像拉伸增强2.1.3边缘检测%边缘检测,canny检测出的图像噪声较少[I_ed,t]=edge(I_ls,'canny',[],'both');2.2开闭操作图像滤波%开闭图像操作图像滤波I5=imclose(I_ed,strel('rectangle',[5,19]));I6=imopen(I5,strel('rectangle',[5,20]));I_op=imopen(I6,strel('rectangle',[35,1]));2.3车牌定位并提取%车牌提取[I_bw,num]=bwlabel(I_op,8);S = regionprops(I_bw,'basic');Area=[S.Area];BoundingBox=[S.BoundingBox];for i=0:num-1rectangle('Position',BoundingBox(:,4*i+1:4*i+4));p=BoundingBox(:,4*i+3)/BoundingBox(:,4*i+4);if p>34/14&p<54/14t=I_gray(BoundingBox(:,4*i+2):BoundingBox(:,4*i+2)+BoundingBox(:,4*i+4),BoundingBox (:,4*i+1):BoundingBox(:,4*i+1)+BoundingBox(:,4*i+3));figure,imshow(t)endend附录主程序:clc;clear;close all;%定位之前需要对原图像进行预处理(包括:灰度化、图像增强、边缘检测)I=imread('che01.jpg');figure(1),imshow(I);I_gray=rgb2gray(I);%对原图进行灰度化figure(2),imshow(I_gray);I_ls=fdlasen(I_gray);%用自编函数fdlasen对图像拉伸增强figure(3),imshow(I_ls);%边缘检测,canny检测出的图像噪声较少%[J,t]=edge(I,'roberts',[],'both');%[K,t]=edge(I,'sobel',[],'both');%[L,t]=edge(I,'prewitt',[],'both');[I_ed,t]=edge(I_ls,'canny',[],'both');figure(4),imshow(I_ed);%开闭图像操作图像滤波I5=imclose(I_ed,strel('rectangle',[5,19]));I6=imopen(I5,strel('rectangle',[5,20]));I_op=imopen(I6,strel('rectangle',[35,1]));figure(7),imshow(I_op);%车牌提取[I_bw,num]=bwlabel(I_op,8);S = regionprops(I_bw,'basic');Area=[S.Area];BoundingBox=[S.BoundingBox];for i=0:num-1rectangle('Position',BoundingBox(:,4*i+1:4*i+4));p=BoundingBox(:,4*i+3)/BoundingBox(:,4*i+4);if p>34/14&p<54/14t=I_gray(BoundingBox(:,4*i+2):BoundingBox(:,4*i+2)+BoundingBox(:,4*i+4),BoundingBox (:,4*i+1):BoundingBox(:,4*i+1)+BoundingBox(:,4*i+3));figure,imshow(t)endend灰度增强函数:function K=fdlasen(A);[m,n]=size(A);Fd=imhist(A,256);a=0;S=0;while S<n*m/10a=a+1;S=S+Fd(a);endb=119;S=sum(Fd);while S>n*m*9/10b=b-1;S=S-Fd(b);endc=a/0.9;d=3*b/2;for i=1:mfor j=1:nif A(i,j)<aA(i,j)=A(i,j)*d/a;elseif A(i,j)>=a&A(i,j)<=bA(i,j)=(d-c)*(A(i,j)-a)/(b-a)+c;elseA(i,j)=(255-d)*(A(i,j)-b)/(255-b)+d;endendendK=A;。