码迷,mamicode.com
首页 > 其他好文 > 详细

车牌识别--铆钉的去除

时间:2014-05-13 15:02:47      阅读:266      评论:0      收藏:0      [点我收藏+]

标签:style   blog   class   code   c   ext   

车牌识别中,每一步的效果直接影响整体的识别率,对车牌识别产生干扰的,不仅是车牌的污渍,还有铆钉。

一 、举例说明,铆钉干扰使得车牌识别错误

1、车辆图片

bubuko.com,布布扣

2、通过颜色HSV确认车牌大致位置

bubuko.com,布布扣

3、截取车牌图像

bubuko.com,布布扣


4、二值化后,水平投影,从图片中可以很清楚看到铆钉

bubuko.com,布布扣   bubuko.com,布布扣


5、字符分割后的车牌

bubuko.com,布布扣


6、提取分割后的车牌字符

bubuko.com,布布扣


7、错误的识别结果

bubuko.com,布布扣


二、改善方法

这里针对车牌识别的干扰去除方法加以改善。

1、原先博文中车牌识别中去除铆钉的方法,只是用投影的方法。粗略计算铆钉在车牌的上方,白点信息较少,通过水平投影计算每一行的白点数

但是当铆钉嵌入字符中间时,仍然无法去除干扰。

2、这里采用直接出去铆钉的方法,

1)、首先尽量分离字符与铆钉的链接

2)、计算每行的跳变次数,一边铆钉所在行,都是两次,不大于3次,超过7次的,就是字符区域所在行。

这里使用的方法是在跳变次数小于5的行里面,全局搜索白点,然后计算它的宽度和高度,如果宽度大于15个像素,高度大于25个像素(这里车牌归一化后字符大小为20X40),那么他就不是铆钉,否则就当做铆钉删掉。

全局遍历代码:

	for(i = 0; i < img->height/3; i++)
	{
		if(PointChg[i] && PointChg[i] < 5)//每行跳变次数
		{
			for(j = 0; j < img->width; j++)
			{
				if(dst[i * img->width + j] >= 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[i * img->width + j] == 0 && flag1 == 1)
				{
					flag1 = 0;
				}
			}
			break;
		}
	}
删除铆钉的函数

img:用了记录车牌的宽度高度信息等

dst:是二值化后的车牌信息,即要遍历查找铆钉的空间

*flag:用来标志是不是铆钉

*x1, *x2 用来计算铆钉宽度  *x2-*x1;

*y1, *y2 同上

xlength,ylength,设置铆钉宽度高度阈值。

static int direction[4][2]={{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[y * img->width + x];


	if((*x2 - *x1 > xlength) || (*y2 - *y1) > ylength)
	{
		*flag = 1;
		return 0;
	}
	
	dst[y * img->width + x] = 0;

	for(i = 0; i < 4; i++)
	{
		x0 = x + direction[i][0];
		y0 = y + direction[i][1];

		if(x0 > 0 && x0 < img->width && y0 > 0 && y0 < img->height && dst[y0 * img->width + x0] && (*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[y * img->width + x] = tmp;
	}
	return 0;
}

3)、去除铆钉的车牌

bubuko.com,布布扣


4)、正确分割

bubuko.com,布布扣


5)、正确提取字符

bubuko.com,布布扣


6)、正确识别结果

bubuko.com,布布扣



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


车牌识别--铆钉的去除,布布扣,bubuko.com

车牌识别--铆钉的去除

标签:style   blog   class   code   c   ext   

原文地址:http://blog.csdn.net/liujia2100/article/details/25658239

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!