Readface 发表于 2016-4-6 11:51:51

车牌识别--铆钉的去除

车牌识别中,每一步的效果直接影响整体的识别率,对车牌识别产生干扰的,不仅是车牌的污渍,还有铆钉。
一 、举例说明,铆钉干扰使得车牌识别错误
1、车辆图片
http://www.thinkface.cn/data/attachment/forum/201501/31/234006m4glzzb6rr3rriel.jpeg
2、通过颜色HSV确认车牌大致位置
http://www.thinkface.cn/data/attachment/forum/201501/31/234006i92kq3cwt3oewwtq.jpeg

3、截取车牌图像
http://www.thinkface.cn/data/attachment/forum/201501/31/234006yx0kweebw0bigskx.jpeg


4、二值化后,水平投影,从图片中可以很清楚看到铆钉
http://www.thinkface.cn/data/attachment/forum/201501/31/234006f4z2lsmq43uzmlyq.bmp     http://www.thinkface.cn/data/attachment/forum/201501/31/234006ovni6qtnrmr5zkr6.bmp



5、字符分割后的车牌
http://www.thinkface.cn/data/attachment/forum/201501/31/234007ltv0e5x29gjgg8ot.bmp



6、提取分割后的车牌字符
http://www.thinkface.cn/data/attachment/forum/201501/31/234007ci88iif2f9zbbbuf.jpeg



7、错误的识别结果
http://www.thinkface.cn/data/attachment/forum/201501/31/234007hfl7j10zzj71krky.jpeg



二、改善方法
这里针对车牌识别的干扰去除方法加以改善。
1、原先博文中车牌识别中去除铆钉的方法,只是用投影的方法。粗略计算铆钉在车牌的上方,白点信息较少,通过水平投影计算每一行的白点数
但是当铆钉嵌入字符中间时,仍然无法去除干扰。
2、这里采用直接出去铆钉的方法,
1)、首先尽量分离字符与铆钉的链接
2)、计算每行的跳变次数,一边铆钉所在行,都是两次,不大于3次,超过7次的,就是字符区域所在行。
这里使用的方法是在跳变次数小于5的行里面,全局搜索白点,然后计算它的宽度和高度,如果宽度大于15个像素,高度大于25个像素(这里车牌归一化后字符大小为20X40),那么他就不是铆钉,否则就当做铆钉删掉。
全局遍历代码:
[*]      for(i = 0; i < img->height/3; i++)
[*]      {
[*]                if(PointChg && PointChg < 5)//每行跳变次数
[*]                {
[*]                        for(j = 0; j < img->width; j++)
[*]                        {
[*]                              if(dst >= 200 && flag1 == 0)//发现白点即遍历
[*]                              {
[*]                                        x1 = x2 = j;
[*]                                        y1 = y2 = i;
[*]                                        delRivet(img, dst, &flag, j, i, &x1, &y1, &x2, &y2, 15, 25);
[*]                                        //display8(*img, dst, 0, 0);
[*]                                        flag1 = 1;
[*]                              }
[*]                              if(dst == 0 && flag1 == 1)
[*]                              {
[*]                                        flag1 = 0;
[*]                              }
[*]                        }
[*]                        break;
[*]                }
[*]      }

复制代码
删除铆钉的函数
img:用了记录车牌的宽度高度信息等
dst:是二值化后的车牌信息,即要遍历查找铆钉的空间
*flag:用来标志是不是铆钉
*x1, *x2 用来计算铆钉宽度*x2-*x1;
*y1, *y2 同上
xlength,ylength,设置铆钉宽度高度阈值。
[*]static int direction={{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
[*]int delRivet(Bmp1 *img, byte *dst, int *flag, int x, int y, int *x1, int *y1, int *x2, int *y2, int xlength, int ylength)
[*]{
[*]      int i;
[*]      int tmp;
[*]      int x0, y0;
[*]
[*]      tmp = dst;
[*]
[*]
[*]      if((*x2 - *x1 > xlength) || (*y2 - *y1) > ylength)
[*]      {
[*]                *flag = 1;
[*]                return 0;
[*]      }
[*]
[*]      dst = 0;
[*]
[*]      for(i = 0; i < 4; i++)
[*]      {
[*]                x0 = x + direction;
[*]                y0 = y + direction;
[*]
[*]                if(x0 > 0 && x0 < img->width && y0 > 0 && y0 < img->height && dst && (*flag == 0))
[*]                {
[*]                        if(*x1 > x0)
[*]                              *x1 = x0;
[*]                        else if(*x2 < x0)
[*]                              *x2 = x0;
[*]
[*]                        if(*y1 > y0)
[*]                              *y1 = y0;
[*]                        else if(*y2 < y0)
[*]                              *y2 = y0;
[*]                        delRivet(img, dst, flag, x0, y0, x1, y1, x2, y2, xlength, ylength);
[*]                        //display8(*img, dst, 0, 0);
[*]                }
[*]
[*]      }
[*]
[*]      if(*flag)
[*]      {
[*]                        dst = tmp;
[*]      }
[*]      return 0;
[*]}

复制代码
3)、去除铆钉的车牌
http://www.thinkface.cn/data/attachment/forum/201501/31/234007e6lc9c9l9d36ayly.bmp


4)、正确分割
http://www.thinkface.cn/data/attachment/forum/201501/31/234007t5tata404k9zaqam.bmp


5)、正确提取字符
http://www.thinkface.cn/data/attachment/forum/201501/31/234007mlrgkw8xrjo5595u.jpeg


6)、正确识别结果
http://www.thinkface.cn/data/attachment/forum/201501/31/234007v3xxroql3oca3r0m.jpeg





源码稍后,提供,车牌识别的代码,我将继续优化,提高识别率,尽早能够应用在arm平台上。

virtualwiz 发表于 2016-4-6 17:37:22

好高端~图像识别{:5_168:}
LZ来个连载吧

hnyzcj 发表于 2016-4-6 13:18:49

通过什么识别的?

iooops 发表于 2016-4-6 13:43:30

哇好像很棒的样子!

Readface 发表于 2016-4-6 18:06:50

hnyzcj 发表于 2016-4-6 13:18
通过什么识别的?

自己的识别引擎,等到可以公开后第一个告诉你~:)

Readface 发表于 2016-4-6 18:07:40

virtualwiz 发表于 2016-4-6 17:37
好高端~图像识别
LZ来个连载吧

嗯哪~可能下个阶段就是情感识别了。:D

hnyzcj 发表于 2016-4-6 19:18:11

Readface 发表于 2016-4-6 18:06
自己的识别引擎,等到可以公开后第一个告诉你~

好嘞等你消息

dsweiliang 发表于 2016-4-7 08:25:38

广州的同学
页: [1]
查看完整版本: 车牌识别--铆钉的去除