1.车牌预处理
车牌预处理过程的好坏直接影响到车牌图像进行后期处理过程,比如车牌字符分割等。车牌预处理也是尽可能的消除噪声,减少后期处理带来的不必要的麻烦。
输入的车牌是24Bit的BMP真彩色图像,车牌照有黄底黑字,蓝底白字等颜色,为了将这些车牌图像一并处理,就要先将车牌进行灰度化处理,然后进行二值化(黑白)处理。
图4-1 原始图像
将采集的车牌图像进行预处理,为了方便起见,这里采用的是BMP格式的图片,我将采集的车牌图像进行了裁剪处理,裁剪后的图片如下:
由于中国大部分的车牌是第一个是汉字,第二个到第七个是字母或数字,这就可以将车牌图像识别过程分成两部分处理,第一部分是识别汉字的过程,第二部分是识别字母和数字的过程,由于汉字笔画较多,同字母或数字的处理过程有所不同。所以我这里就先处理字母或数字的过程。
除汉字外,在第一个字母和第二个数字的中间有个一点,所以在字符分割的时候要考虑去掉中间的点。车牌图像总体来说比较清晰,大型民用车,牌照为黄底黑字,小型民用车,牌照为蓝底白字 ,由于字符与背景颜色对比比较明显,所以将车牌分割开来比较容易。由于有些车牌的上面和下面也有螺丝之类的东西将车牌固定,所以在将车牌分割的时候,通过水平扫描跳跃点的方法,可以去除掉,以便最后将车牌进行分割,去除这些干扰。
在RGB模型中,如果R=G=B时,则彩色表示一种灰度颜色,其中R=G=B的值叫灰度值,因此,灰度图像每个像素只需一个字节存放灰度值(又称强度值、亮度值),灰度范围为0-255。一般有四种方法对彩色图像进行灰度化。
1. 分量法。就是将每个分量上的颜色值即RGB3种颜色提取出来。即:将彩色图像中的三分量的亮度作为三个灰度图像的灰度值,可根据应用需要选取一种灰度图像。f1(i,j)=R(i,j) f2(i,j)=G(i,j) f3(i,j)=B(i,j)其中fk(i,j)(k=1,2,3)为转换后的灰度图像在(i,j)处的灰度值。
2.最大值法。选取彩色图像中的三分量中(RGB)的颜色的最大值作为灰度图的灰度值。即:f(i,j)=max(R(i,j),G(i,j),B(i,j))。
3.平均值法。 将彩色图像中的三分量亮度求平均得到一个灰度图f(i,j)=(R(i,j)+G(i,j)+B(i,j))/3。
4.加权平均法。根据重要性及其它指标,将三个分量以不同的权值进行加权平均。由于人眼对绿色的敏感最高,对蓝色敏感最低,因此,按下式对RGB三分量进行加权平均能得到较合理的灰度图像。f(i,j)=0.30R(i,j)+0.59G(i,j)+0.11B(i,j))。
以上四种处理过程,在车牌预处理的过程中,我选择加权平均值法。效果如下:
图4-2 原始图像 图4-3灰度图像
如上图,是将图中的原始图像进行加权平均值处理后的灰度图像。
关键代码如下:
for(i = 0;i < Height; i++)
{
for(j= 0;j < Width*3; j+=3)
{
ired = (unsigned char*)lpDibBits + LineBytes* i + j + 2;
igreen= (unsigned char*)lpDibBits + LineBytes * i + j + 1;
iblue = (unsigned char*)lpDibBits + LineBytes* i + j ;
lpdest[i*Width+ j/3]= (unsigned char)((*ired)*0.299 + (*igreen)*0.588 + (*iblue)*0.114);//加权平均值计算处理
}
}
二值化处理。二值化处理即将BMP图像进行黑白处理,使背景与字符区分开。由于灰度化后的图像是0-255之间的颜色值。而进行二值化处理的过程就是将此图像的颜色分成黑色值0和白色值255两种颜色。为了将背景与车牌字符分开,要设定一个阈值。设定阈值是关键。如果选取的二值化的阈值不当则就有可能不能将车牌图像中的背景与文字进行明显分开,所以这时二值化的阈值选取就显得非常重要。根据试验,我设定的阈值为
125。二值化后的效果如下:
图4-7 二值化后图像
如上图是测试蓝底白字和黄底黑字的车牌图像的二值化后的效果。通过将图像进行二值化后,可以明显将背景与车牌字符进行分开。
二值化处理的关键代码如下:
for(i = 0; i < Height; i++)// 每行
{
for(j = 0; j < Width; j++)// 每列
{
// 指向DIB第i行,第j个象素的指针
lpSrc = (unsigned char*)lpDibBits+LineBytes *(lHeight - 1 - i) + j;
// 判断是否小于阈值
if ((*lpSrc) < bThre)
{
*lpSrc = 0; // 直接赋值为0,即黑色
}
else
{
*lpSrc = 255; // 直接赋值为255,即白色
}
}
}
2.字符分割
由于车牌图像做了细化处理后,可以进行水平扫描和垂直扫描将字符分开,水平扫描确定图片的上下限,垂直扫描可以确定图片中字符的左右坐标。根据车牌的特征,先将车牌图像进行水平扫描跳跃点,即水平相邻的两个像素,如果不相同则认为有一个跳跃点,记录次数加1,由于车牌上面有时候会有两个白点,所以通过判断跳跃点的个数,可以将上面的两个白点去掉[9]。如图,扫描处理的跳跃点统计如下:
图4-10 原始图像,上面有两个白点
图4-11水平扫描跳跃点的个数统计
统计结果:4 4 4 0 0 14 14 16 20 24 24 24 24 22 20 24 26 28 28 30 2626 24 20 20 22 22 22 26 20 20 22 24 20 20 20 20 2 0 4 4 6 4像素。扫描结果数量个数为的车牌高度的个数。
从上往下查找,根据实验结果,设置当水平跳跃点超过10个的时候,作为车牌字符截取的上限。当从下往上查找,当跳跃点超过8个的时候可以作为车牌字符截取的下限。通过上面的过程,基本可以确定车牌的上部和下部。同样,分割车牌字符左右边界时,通过垂直扫描过程,由于数字和字母具有连通性,所以分割数字和字母比较容易。通过垂直扫描过程,统计黑色像素点的个数,由于两个字符之间没有黑像素,所以可