结合垂直投影法与固定边界分割车牌字符分割算法(附
源码和详细解析)
上⼀篇博⽂简单有效的车牌定位算法(附源码和详细解析),详细介绍了数学形态学处理车牌粗定位与蓝⾊像素统计、⾏列扫描的车牌精确定位算法。没有看的朋友可以先看上⼀篇博⽂。
这次,在牌照字符的分割上,我结合了⽬前使⽤最多的投影法和车牌固定边界的多阈值分割算法。它的⼤致实现过程如下:第⼀步先对上⼀节粗定位完牌照的只有⿊⽩两⾊的图像bg2实施伪彩⾊标记。第⼆步获取标记区域各连通块的尺⼨参数,⽤作下⼀步遍历的索引。第三步投影得直⽅图,取⼀个分割阈值,划分出背景和字符的范围,也就是在直⽅图histrow(histcol)中区分⾕底点和上升点。第四步分析峰⾕,得到例如最⼤峰中⼼距等参数。最后⼀步,根据上⼀步求得的参数分割字符。
具体分割流程图如下图:
图5-1 字符分割流程图
⼀、车牌区域彩⾊标记与特征提取
  对粗定位车牌后的⼆值图像作连通区域4邻域的伪彩⾊标记的⽬的是为了⽅便计算出车牌区域的⾯积、宽
⾼度以及车牌框架的⼤⼩、区域开始和结束的⾏列位置等区域特征参数,是为后续的车牌投影分析操作作预准备。在这⼀步骤中,⾸先以4领域⼤⼩为模块对⼆值图像作区域标记,给每块连通区域块标记上序数,获取图像中连通区域的块数和图像矩阵L,初步计算出各连通区域的框架⼤⼩,然后再根据车牌的先验知识设置亮度⾼度的合理阈值筛选出真正车牌区域的连通域,记录下该连通域的序数,最后对车牌区域块作区域特征提取,获取车牌的框架⼤⼩、宽⾼度、宽⾼⽐例以及开始位置点的⾏、列数等参数。
  在MATLAB中对车牌号码为粤A6ZC93和粤AC609Z两车辆的车牌粗定位⼆值图像作伪彩⾊标记效果如下图:
(a)粤A6ZC93                            (b)粤AC609Z
图5-2 区域标记与特征参数提取
⼆、车牌预处理
(1) 基于Radon变换的倾斜校正
  从车体侧⾯拍摄的车辆图像中提取出来的牌照会出现⾓度的倾斜,为了后续操作的⽅便,需要进⾏⾓度的校正。本系统选择较为简单的Radon倾斜校正。
Radon变换是⼀种根据图像在某⼀⽅向的投影进⾏变换的⽅法。Rodan变换的倾斜校正的⼤致过程如下:
第⼀步,算⼦提取出已经⼆值化的牌照的边缘。
第⼆步,变换计算出牌照的和⽅向的倾斜⾓。
第三步,逆旋转相应⾓度修正倾斜。
它的具体原理如下:
  在⾼等数学中,要对函数作横轴上的投影,实则是求在横轴这个⽅向的线积分。对平⾯空间函数作Radon变换,实则是求该函数在⽅向上的线积分,有如下关系:
(5.1)
其中坐标变换公式为:
,(5.2)
由此,可得Radan变换有如下性质:
(5.3)
由公式5.3,知道是与x 有关的函数,同时也是θ的周期函数,基波周期为由映射关系,若在x 处取得MAX 时,⾓度是,则也取得MAX ,倾斜⾓为。以此为依据,可以实现对车牌图像的倾斜校正。在实际情形中,车牌图像的最⼤倾斜⾓⼀般都不会超过直⾓(),所以,⼀般θ。通过边缘检测确定θ之后,就可以将牌照作的旋转校正。通过MATLAB 实验,为更好的突出校正的效果,使⽤的倾斜⾓度更⼤的另⼀幅车牌图像作对⽐,实际校正效果如下:
图5-3 Radon 变换倾斜校正
Radon 变换倾斜校正的MATLA 代码如下:
图5-4 Radon 变换倾斜校正代码
(2)车牌⼆值化
上⼀节对牌照倾斜校正处理后,需要对牌照实施⼆值化处理。这⾥同样使⽤上⼀章牌照定位算法中的阈值选取法。即,灰度范围三分点阈值选取法。先统计出牌照图像灰度级范围,得到最⼤灰度值g_max 和最⼩灰度值g_min 然后使⽤公式确定出最佳⼆值化阈值。⼆值化效果如下图:
图5-5 车牌⼆值化处理
(3)消除间隔符
从5.1节知道,我国现⾏标准牌照为九⼆式。牌照上第2与第3个字符间有⼀个类似于实⼼句号的间隔标点,它与字符间的间距为10mm ⽽不是通常的12mm 正好能与字符间距区分开来,间隔符的存在容易在字符分割环节被误判为⼀个字符,导致被错误分割。虽然,后续操作中可以使⽤车牌字符的先验知识在分割之后筛选剔除掉,但这样做的成本较⾼,所以最好的办法就是在进⾏字符分割之前就把间隔符消除掉,本⽂系统基于数学形态学的相关知识,在车牌⼆值化后就选择消除间隔符,在MATLAB 中,以半径为8的核模,先腐蚀后膨胀,消除掉⼩对象。
具体处理效果如下:
图5-6 消除字符间隔符
伪彩⾊标记和区域特征提取、车牌预处理源代码(含解析)如下:
%Step6 对⼆值图像进⾏区域提取,并计算区域特征参数。进⾏区域特征参数⽐较,提取车牌区域[L,num] = bwlabel(bg2,4);%标注⼆进制图像中已连接的部分 bwlabel ()return a unmber of connected object  Feastats = imfeature(L,'basic');%计算图像区域的特征尺⼨ L 是bg2的图像矩阵Area=[Feastats.Area];%区域⾯积
BoundingBox=[Feastats.BoundingBox];%[x y width height]车牌的框架⼤⼩RGB = label2rgb(L, 'spring', 'k', 'shuffle'); %标志图像向RGB 图像转换
。。
figure(13),imshow(RGB);title('图像彩⾊标记');%输出框架的彩⾊图像
lx=0;
for l=1:num
width=BoundingBox((l-1)*4 3);%框架宽度的计算
hight=BoundingBox((l-1)*4 4);%框架⾼度的计算
if (width>50 & width<130 & hight>10 & hight<50)%框架的宽度和⾼度的范围,筛选连通域        lx=lx 1;
Getok(lx)=l;
end
end
for k= 1:lx
l=Getok(k);  %出符合尺⼨标准的连通块,获取它的开始位置和结束位置
startcol=BoundingBox((l-1)*4 1)-2;%开始列
startrow=BoundingBox((l-1)*4 2)-2;%开始⾏
width=BoundingBox((l-1)*4 3) 8;%车牌宽度
hight=BoundingBox((l-1)*4 4) 2;%车牌⾼度
rato=width/hight;%计算车牌长宽⽐例
if rato>2 & rato<4
break;
end
end
sbw1=bw2(startrow:startrow hight,startcol:startcol width-1); %获取车牌⼆值⼦图
%%倾斜校正
%sbw4=rando_bianhuan(sbw1);
%sbw1=imrotate(sbw1,sbw4,'bilinear','crop');
SIM=I1(startrow:startrow hight,startcol:startcol width-1);%获取车牌灰度⼦图
%%倾斜校正
%SIM4=rando_bianhuan(SIM);
车牌标志%SIM=imrotate(SIM,SIM4,'bilinear','crop');
figure(14),
subplot(3,1,1),imshow(Plate);title('RGB车牌⼦图');%输出车牌图像
subplot(3,1,2),imshow(SIM);title('车牌灰度⼦图');%输出灰度图像
subplot(3,1,3),imshow(sbw1);title('车牌⼆值⼦图');%输出车牌的⼆值图
imwrite(SIM,'lisence.jpg');
%step7 车牌预处理
b=imread('lisence.jpg');
%b=rgb2gray(a);
imwrite(b,'1.车牌灰度图像.jpg');
figure(15);subplot(3,1,1),imshow(b),title('1.车牌灰度图像')
g_max=double(max(max(b)));  %求最⼤灰度值并赋予双精度
g_min=double(min(min(b)));  %求最⼩灰度值并赋予双精度
T=round(g_max-(g_max-g_min)/3); % T 为⼆值化的阈值 round()取整
whos b;
d=(double(b)>=T);  % d:⼆值图像
imwrite(d,'2.车牌⼆值图像.jpg');
figure(15);subplot(3,1,2),imshow(d),title('2.车牌⼆值图像')
whos d;
%bg4=imopen(d,strel('rectangle',[1,1]));%取矩形框的开运算
bg4=bwareaopen(d,8);%消除细⼩对象,即第⼆和第三之间的标点
figure(15);subplot(3,1,3),imshow(bg4);title('3.消除⼩对象⼆值车牌图像');%输出框架的彩⾊图像
imwrite(bg4,'3.消除⼩对象⼆值车牌图像.jpg');
由于篇幅有限,核⼼模块:⽔平投影分析、去上下边框、垂直投影分析、固定边界多阈值分割放在下篇博⽂,请继续关注!