博舍

毕业设计 图像识别毕业论文题目

毕业设计

文章目录0简介1思路简介1.1车牌定位1.2畸变校正2代码实现2.1车牌定位2.1.1通过颜色特征选定可疑区域2.1.2寻找车牌外围轮廓2.1.3车牌区域定位2.2畸变校正2.2.1畸变后车牌顶点定位2.2.2校正7最后0简介

今天学长向大家介绍一个机器视觉项目

基于机器视觉的图像矫正(以车牌识别为例)

1思路简介

目前车牌识别系统在各小区门口随处可见,识别效果貌似都还可以。查阅资料后,发现整个过程又可以细化为车牌定位、畸变校正、车牌分割和内容识别四部分。本篇随笔主要介绍车牌定位及畸变校正两部分,在python环境下通过opencv实现。

1.1车牌定位

目前主流的车牌定位方法从大的方面来说可以分为两类:一种是基于车牌的背景颜色特征;另一种基于车牌的轮廓形状特征。基于颜色特征的又可分为两类:一种在RGB空间识别,另一种在HSV空间识别。经测试后发现,单独使用任何一种方法,效果均不太理想。目前比较普遍的做法是几种定位方法同时使用,或用一种识别,另一种验证。本文主要通过颜色特征对车牌进行定位,以HSV空间的H分量为主,以RGB空间的R分量和B分量为辅,后续再用车牌的长宽比例排除干扰。

1.2畸变校正

在车牌的图像采集过程中,相机镜头通常都不是垂直于车牌的,所以待识别图像中车牌或多或少都会有一定程度的畸变,这给后续的车牌内容识别带来了一定的困难。因此需要对车牌进行畸变校正,消除畸变带来的不利影响。

2代码实现2.1车牌定位2.1.1通过颜色特征选定可疑区域

取了不同光照环境下车牌的图像,截取其背景颜色,利用opencv进行通道分离和颜色空间转换,经试验后,总结出车牌背景色的以下特征:

(1)在HSV空间下,H分量的值通常都在115附近徘徊,S分量和V分量因光照不同而差异较大(opencv中H分量的取值范围是0到179,而不是图像学中的0到360;S分量和V分量的取值范围是到255);

(2)在RGB空间下,R分量通常较小,一般在30以下,B分量通常较大,一般在80以上,G分量波动较大;

(3)在HSV空间下对图像进行补光和加饱和度处理,即将图像的S分量和V分量均置为255,再进行色彩空间转换,由HSV空间转换为RGB空间,发现R分量全部变为0,B分量全部变为255(此操作会引入较大的干扰,后续没有使用)。

根据以上特征可初步筛选出可疑的车牌区域。随后对灰度图进行操作,将可疑位置的像素值置为255,其他位置的像素值置为0,即根据特征对图像进行了二值化。二值化图像中,可疑区域用白色表示,其他区域均为黑色。随后可通过膨胀腐蚀等操作对图像进一步处理。

foriinrange(img_h):forjinrange(img_w):#普通蓝色车牌,同时排除透明反光物质的干扰if((img_HSV[:,:,0][i,j]-115)**270)and(img_R[i,j]1.8)and(det_x>det_x_max)and(det_y>det_y_max):det_y_max=det_ydet_x_max=det_xnum=i#获取最可疑区域轮廓点集points=np.array(contours[num][:,0])

最终得到的points的shape为(n,2),即存放了n个点的坐标,这n个点均分布在车牌的边缘上

2.1.3车牌区域定位

获取车牌轮廓上的点集后,可用cv2.minAreaRect()获取点集的最小外接矩形。返回值rect内包含该矩形的中心点坐标、高度宽度及倾斜角度等信息,使用cv2.boxPoints()可获取该矩形的四个顶点坐标。

#获取最小外接矩阵,中心点坐标,宽高,旋转角度rect=cv2.minAreaRect(points)#获取矩形四个顶点,浮点型box=cv2.boxPoints(rect)#取整box=np.int0(box)

但我们并不清楚这四个坐标点各对应着矩形的哪一个顶点,因此无法充分地利用这些坐标信息。

可以从坐标值的大小特征入手,将四个坐标与矩形的四个顶点匹配起来:在opencv的坐标体系下,纵坐标最小的是top_point,纵坐标最大的是bottom_point,横坐标最小的是left_point,横坐标最大的是right_point。

#获取四个顶点坐标left_point_x=np.min(box[:,0])right_point_x=np.max(box[:,0])top_point_y=np.min(box[:,1])bottom_point_y=np.max(box[:,1])left_point_y=box[:,1][np.where(box[:,0]==left_point_x)][0]right_point_y=box[:,1][np.where(box[:,0]==right_point_x)][0]top_point_x=box[:,0][np.where(box[:,1]==top_point_y)][0]bottom_point_x=box[:,0][np.where(box[:,1]==bottom_point_y)][0]#上下左右四个点坐标vertices=np.array([[top_point_x,top_point_y],[bottom_point_x,bottom_point_y],[left_point_x,left_point_y],[right_point_x,right_point_y]])

2.2畸变校正2.2.1畸变后车牌顶点定位

要想实现车牌的畸变矫正,必须找到畸变前后对应点的位置关系。

可以看出,本是矩形的车牌畸变后变成了平行四边形,因此车牌轮廓和得出来的矩形轮廓并不契合。但有了矩形的四个顶点坐标后,可以通过简单的几何相似关系求出平行四边形车牌的四个顶点坐标。

在本例中,平行四边形四个顶点与矩形四个顶点之间有如下关系:矩形顶点Top_Point、Bottom_Point与平行四边形顶点new_top_point、new_bottom_point重合,矩形顶点Top_Point的横坐标与平行四边形顶点new_right_point的横坐标相同,矩形顶点Bottom_Point的横坐标与平行四边形顶点new_left_point的横坐标相同。

但事实上,由于拍摄的角度不同,可能出现两种不同的畸变情况。可以根据矩形倾斜角度的不同来判断具体是哪种畸变情况。

判断出具体的畸变情况后,选用对应的几何相似关系,即可轻易地求出平行四边形四个顶点坐标,即得到了畸变后车牌四个顶点的坐标。

要想实现车牌的校正,还需得到畸变前车牌四个顶点的坐标。因为我国车牌的标准尺寸为440X140,因此可规定畸变前车牌的四个顶点坐标分别为:(0,0),(440,0),(0,140),(440,140)。顺序上需与畸变后的四个顶点坐标相对应。

#畸变情况1ifrect[2]>-45:new_right_point_x=vertices[0,0]new_right_point_y=int(vertices[1,1]-(vertices[0,0]-vertices[1,0])/(vertices[3,0]-vertices[1,0])*(vertices[1,1]-vertices[3,1]))new_left_point_x=vertices[1,0]new_left_point_y=int(vertices[0,1]+(vertices[0,0]-vertices[1,0])/(vertices[0,0]-vertices[2,0])*(vertices[2,1]-vertices[0,1]))#校正后的四个顶点坐标point_set_1=np.float32([[440,0],[0,0],[0,140],[440,140]])#畸变情况2elifrect[2]det_x_max)and(det_y>det_y_max):det_y_max=det_ydet_x_max=det_xnum=i#获取最可疑区域轮廓点集points=np.array(contours[num][:,0])returnpoints#img_lic_canny=cv2.Canny(img_lic_bin,100,200)deffindVertices(points):#获取最小外接矩阵,中心点坐标,宽高,旋转角度rect=cv2.minAreaRect(points)#获取矩形四个顶点,浮点型box=cv2.boxPoints(rect)#取整box=np.int0(box)#获取四个顶点坐标left_point_x=np.min(box[:,0])right_point_x=np.max(box[:,0])top_point_y=np.min(box[:,1])bottom_point_y=np.max(box[:,1])left_point_y=box[:,1][np.where(box[:,0]==left_point_x)][0]right_point_y=box[:,1][np.where(box[:,0]==right_point_x)][0]top_point_x=box[:,0][np.where(box[:,1]==top_point_y)][0]bottom_point_x=box[:,0][np.where(box[:,1]==bottom_point_y)][0]#上下左右四个点坐标vertices=np.array([[top_point_x,top_point_y],[bottom_point_x,bottom_point_y],[left_point_x,left_point_y],[right_point_x,right_point_y]])returnvertices,rectdeftiltCorrection(vertices,rect):#畸变情况1ifrect[2]>-45:new_right_point_x=vertices[0,0]new_right_point_y=int(vertices[1,1]-(vertices[0,0]-vertices[1,0])/(vertices[3,0]-vertices[1,0])*(vertices[1,1]-vertices[3,1]))new_left_point_x=vertices[1,0]new_left_point_y=int(vertices[0,1]+(vertices[0,0]-vertices[1,0])/(vertices[0,0]-vertices[2,0])*(vertices[2,1]-vertices[0,1]))#校正后的四个顶点坐标point_set_1=np.float32([[440,0],[0,0],[0,140],[440,140]])#畸变情况2elifrect[2]

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。

上一篇

下一篇