模板比较的车牌识别算法的研究与实现(7)

2019-04-02 14:04

山东轻工业学院2012届本科生毕业设计(论文)

图4-7 标记出车牌区域的图像

图4-8 分割出来的车牌图像

4、结果分析

车牌定位采用纹理跳变法实现的,在算法中采用了2*6的粗定位,能够准确地将车牌区域定位并分割出来。

4.3 字符分割模块

完成牌照区域的定位后,再将牌照区域分割成单个字符,然后进行识别。字符分割一般采用垂直投影法,由于字符在垂直方向上的投影必然在字符间或字符内的间隙处取得局部最小值的附近,并且这个位置应满足牌照的字符书写格式、字符、尺寸限制和一些其他条件,利用垂直投影法对复杂环境下的汽车图像中的字符分割有较好的效果。

4.3.1 车牌人工矫正 1、原理

由于车牌图像不是水平的,对分割和识别会产生影响,需要人工对其矫正,本文采用Hough变换进行图像矫正。

Hough变换思想为:在原始图像坐标系下的一个点对应了参数坐标系中的一条直线,同样参数坐标系的一条直线对应了原始坐标系下的一个点,然后,原始坐标系下呈现直线的所有点,它们的斜率和截距是相同的,所以它们在参数坐标

24

山东轻工业学院2012届本科生毕业设计(论文)

系下对应于同一个点。这样在将原始坐标系下的各个点投影到参数坐标系下之后,看参数坐标系下有没有聚集点,这样的聚集点就对应了原始坐标系下的直线。

对于Oxy 平面上给定的一条直线y = ux + v, (其中u和v 分别为直线的斜率和直线的截距), 对应于一个数对(u, v), 反之, 给定一个数对(u, v) 则对应于一条直线y =ux + v, 即: 如Oxy 平面上有一条直线y = ux + v, 那就和Ouv 平面上的一个点(u, v) 一一对应, 同理,Ouv 平面上的一条直线v= - xu+ y 和Oxy 平面上有一个点(x, y) 也是一一对应的。如果Oxy 平面上有一条直线y = ux + v, 那上面的每个点都对应于Ouv 平面上的一条直线, 这些直线相交于一点, 利用这个重要性质可以检测共线点。由于直线的斜率可能会接近无穷大, 为了使变换域有意义, 需要采用直线方程的法线式表示: p = xcos H+ ysin H, 其中, p 为直线到坐标系原点的距离, H为直线法线与X 轴的夹角。于是极坐标上的一点对应了Oxy 平面坐标上的一条直线, 而Oxy平面坐标上的一点对应于极坐标上的一条曲线, 而且易知Oxy 平面坐标上的共线点所对应的极坐标上的所有曲线相交于一点, 且由于Oxy 平面坐标上的一条直线上的各点都对应于极坐标上的一点, 如果对过这一点的曲线进行计数,结果会是比较大的数据。通过这一原理, 可以很方便地提取出图像上的直线。在提取车牌倾斜度时, 先对所有列进行扫描, 提取出所有第一次从0→1的可能边界点, 再进行hough变换, 得到的直线的倾斜度即为所求。

本文程序获取输入的角度量,根据原始图像,循环逐点获取变换后的点,输出变换后的图片。

2、代码实现

for (int i = 0; i < nHeight; i++) {

for (int j = 0; j < nWidth; j++) {

tempHeight = i - halfHeight; tempWidth = j - halfWidth;

tempX = tempWidth * myCos - tempHeight * mySin; tempY = tempHeight * myCos + tempWidth * mySin; if (tempWidth > 0) {

xr = (int)tempX; } else {

25

山东轻工业学院2012届本科生毕业设计(论文)

xr = (int)(tempX - 1); }

if (tempHeight > 0) {

yr = (int)tempY; } else {

yr = (int)(tempY - 1); }

p1 = tempX - xr; q1 = tempY - yr;

tempWidth = xr + halfWidth; tempHeight = yr + halfHeight;

if (tempWidth < 0 || (tempWidth + 1) >= nWidth || tempHeight < 0 || (tempHeight + 1) >= nHeight)

{

p[0] = p[1] = p[2] = 0; } else {

byte bian1 = 0, bian2 = 0, bian3 = 0; pp = pp1;

pp += (tempWidth * 3 + stride * tempHeight); bian1 = (byte)((1.0 - q1) * (1.0 - p1) * pp[0]); bian2 = (byte)((1.0 - q1) * (1.0 - p1) * pp[1]); bian3 = (byte)((1.0 - q1) * (1.0 - p1) * pp[2]); pp = pp1;

pp += ((tempWidth + 1) * 3 + stride * tempHeight); bian1 = (byte)((1.0 - q1) * p1 * pp[0] + bian1); bian2 = (byte)((1.0 - q1) * p1 * pp[1] + bian2); bian3 = (byte)((1.0 - q1) * p1 * pp[2] + bian3); pp = pp1;

pp += ((tempWidth + 1) * 3 + stride * (tempHeight + 1)); bian1 = (byte)(q1 * p1 * pp[0] + bian1);

26

山东轻工业学院2012届本科生毕业设计(论文)

bian2 = (byte)(q1 * p1 * pp[1] + bian2); bian3 = (byte)(q1 * p1 * pp[2] + bian3); pp = pp1;

pp += ((tempWidth) * 3 + stride * (tempHeight + 1)); p[0] = bian1 = (byte)(q1 * ((1.0 - p1) * pp[0]) + bian1); p[1] = bian2 = (byte)(q1 * ((1.0 - p1) * pp[1]) + bian2); p[2] = bian3 = (byte)(q1 * ((1.0 - p1) * pp[2]) + bian3); }

3、效果图

} p += 3; }

p += nOffset;

图4-9 人工矫正

图4-10 矫正前的图像

图4-11 矫正后的图像

27

山东轻工业学院2012届本科生毕业设计(论文)

4、结果分析

本文采用人工输入角度进行矫正,基本实现矫正功能,对后面的分割识别奠定了基础。

4.3.2 车牌的灰度化和二值化 1、原理

图像二值化就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果。

将256个亮度等级的灰度图像通过适当的阈值选取而获得仍然可以反映图像整体和局部特征的二值化图像。在数字图像处理中,二值图像占有非常重要的地位,首先,图像的二值化有利于图像的进一步处理,使图像变得简单,而且数据量减小,能凸显出感兴趣的目标的轮廓。其次,要进行二值图像的处理与分析,首先要把灰度图像二值化,得到二值化图像。

所有灰度大于或等于阀值的像素被判定为属于特定物体,其灰度值为255表示,否则这些像素点被排除在物体区域以外,灰度值为0,表示背景或者例外的物体区域。

此处车牌图片的二值化采用的是自适应阈值二值化,它根据公式得出阈值, 根据车牌字符和车牌背景的区分,区分成黑底白字和白底黑字2种,将字符凸现出来。

2、代码实现

//求阈值 int va;

if (count1 < count2)

{ //白底黑字

va = Mr - count1 / count2 * Math.Abs(g1 - Mr); }

else //黑底白字

va = Mr + count2 / count1 * Math.Abs(g2 - Mr);

BitmapData bmData = c_Bitmap.LockBits(new Rectangle(0, 0, c_Bitmap.Width,c_Bitmap.Height),ImageLockMode.ReadWrite,PixelFormat.Format24bppRgb);

unsafe {

int stride = bmData.Stride;

28


模板比较的车牌识别算法的研究与实现(7).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:高级工知识要求试题4

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: