基于车牌形状和颜色的车牌定位

本文介绍了车牌识别系统的关键步骤,重点讨论了基于形状和颜色的车牌定位技术,包括图像去噪、二值化、边缘检测、颜色筛选等。通过计算长宽比和HSV颜色空间分析,精确识别车牌区域。后续步骤涉及车牌矫正、字符分割和识别,应用了Hough变换、线性回归等方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

车牌识别算法综述

前言:近年来,人工智能的研究不断深入,智慧城市,智慧交通也引起了大家的关注,车牌识别作为智慧交通的重要一环,被广泛应用在:停车场管理,违章处理,高速收费等领域。
同时也随着新能源汽车的不断增多,原来识别普通汽车7字符车牌的车牌识别系统需要增加识别新能源汽车8字符车牌的功能。车牌识别主要分为四个步骤:车牌定位,车牌矫正,字符分割和字符识别。


车牌定位:在一张含有车牌的图片中找到车牌区域。主要由三个方向的方法:
一、基于特征的算法,如基于颜色特征和边缘特征的算法,基于字符边缘的算法,就是找到内部有很多竖直边缘的矩阵块(在车牌不倾斜的情况下才有用)
二、基于数学形态学的算法,主要要用到闭运算,开运算,再根据车牌比例进行筛选。
三、基于机器学习方法的算法,涉及分类,回归,训练等问题。如基于SVM的车牌定位算法、基于遗传算法的定位算法,基于神经网络的车牌定位算法。


车牌矫正:基本原理都是找到与车牌方位相互契合的一条直线,求出该直线的角度,即为需要调整的角度。
一、Hough变换
在这里插入图片描述
利用Hough变换提取直线是一种变换域提取直线的方法,它把直线的坐标,变换到过点的直线的系数域,利用了共线和直线相交的关系。
将x-o-y坐标上的各字符对应的像素点变到s-o-θ平面上(利用公式s=xcosθ+ysinθ),把s-o-θ平面分成网格状,每个小网格对应一个计数矩阵,当有一条曲线经过该网格就加一,最后数值最大的网格对应原始图像中最长的直线。(因为计数矩阵元素的值等于共线的点数)求出最大数值网格对应的列坐标θ,倾斜角为90度-θ。根据这个角度进行旋转。
二、Radon变换
我们知道一条直线在法线方向的投影最大。所以我们首先通过边缘检测找出原图的直线,再对这些直线在0-179度范围内做投影(此时就是Radon变换),峰值最大的方向θ就是直线的法线方向,所以直线的倾斜角度就是90度-θ。
三、线性回归方法
根据点的分布找到一条使所有点到这条直线的欧式距离的和最小,一般用最小二乘法来拟合直线,然后确定好这条直线的角度,根据这条直线的角度来调整图片角度。
四、两点法
在使用最小二乘法时,我们已经检测到图像与背景交线的一系列坐标点,这些点近似分布在一条直线上,取多对点求直线的斜率,再取平均值,从而确定倾角。


字符分割:主要有以下三种:
一、投影法:在水平、竖直方法统计字符像素个数,没有像素的地方就是间隔处。
二、连通域分割:每次扫描二值化图像的N个像素点,统计出字符像素点的个数来确定字符部分的连通域。数字,字母一般是单连通域,汉字字符一般是多连通域,所以先确定数字,字母字符,然后剩下的字符就是汉族字符。
三、基于静态边界的方法:需要在车牌定位非常精准的前提下,缩放图片至固定尺寸,结合车牌的长宽比以及字符间距等特点,判断出每个字符的位置。


字符识别:主要有三种方向:
一、基于模板匹配算法:分为基于特征提取的模板匹配方法和基于灰度值匹配法,前者涉及大量数学形态学计算,计算复杂。后者有标准库,必须要与模板库同大小,同字体才能达到好的效果。
二、基于特征统计的字符识别:这个特征包括:外部轮廓,内部结构和笔画变换等等,如提取13维的像素特征。缺点:汉字需要提取的特征较多,计算量大。受车牌分割准确性及噪声的影响。
三、基于机器学习的方法:如基于SVM的字符识别,基于神经网络的字符识别。


基于形状和颜色的车牌定位

这一步要做的就是对输入的一张含有车牌的彩色图片,找到我们要的车牌区域


第一步:去噪,二值化

将得到彩色图片进行高斯去噪,变成灰度图,然后再变成二值图像。

	#高斯去噪
	if blur > 0:
		img = cv2.GaussianBlur(img, (blur, blur), 0)#图片分辨率调整 
	oldimg = img #oldimg是经过高斯模糊的原图,后面还会用到。
	img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
	#找到图像边缘
	ret, img_thresh = cv2.threshold(img_opening, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) #转化为二值图像
		#cv2.imshow("binary_img", img_thresh)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第二步:边缘检测,开运算和闭运算

对二值图像进行canny边缘检测,然后用形态学的开运算和闭运算合并边缘围起来的区域,筛选出宽高比在2-5.5之间的矩形。(虽然标准的车牌宽是440mm,高是140mm,比例是3.1,但是我们考虑到照相角度的问题,我们将范围扩大到2-5.5避免漏掉车牌区域,当然这会造成其他不是车牌的矩形区域入选,但我们可以在后面用颜色特征,排除掉这些非车牌区域。)
在这里插入图片描述

# canny边缘检测
img_edge = cv2.Canny(img_thresh, 100, 200)
#cv2.imshow("canny_img", img_edge)
#cv2.waitKey(0)
#使用开运算和闭运算让图像边缘成为一个整体
kernel = np.ones((self.cfg["morphologyr"], self.cfg["morphologyc"]), np.uint8)
img_edge1 = cv2.morphologyEx(img_edge, cv2.MORPH_CLOSE, kernel)
img_edge2 = cv2.morphologyEx(img_edge1, cv2.MORPH_OPEN, kernel)

在这里插入图片描述在这里插入图片描述
用矩形框,框出各区域,将矩形框的长宽比在2-5.5之间的标记出来。

	#查找图像边缘整体形成的矩形区域,可能有很多,车牌就在其中一个矩形区域中
	try:
	contours, hierarchy = cv2.findContours(img_edge2, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) #contours包括图片所有的轮廓,每个轮廓又包含四个顶点坐标
	
	except ValueError:#python3是返回三个参数
	image, contours, hierarchy = cv2.findContours(img_edge2, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
	
	
	contours = [cnt for cnt in contours if cv2.contourArea(cnt) > Min_Area] #筛选出点集区域大于最小面积的边缘,保存到contours里面
	print('边框所围区域大于最小面积的边框个数'
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值