实验 改进的KMeans算法实现车牌字符的分割
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验改进的K-Means算法实现车牌字符的分割
车牌识别的一般过程:车牌定位--- >字符分割--- > 字符识别。本实验实现了前两步。
车牌定位从大体上分为两种,基于灰度和基于底纹,本程序结合了以上两种方法实现了车牌精确定位,即先基于灰度图像得到一个大概的位置,然后再根据底纹实现精确定位。不失一般性,本人设计了只针对蓝底白字(车牌有四种:蓝底白字、黑底白字、白底黑字、黄底黑字)的车牌设计了算法,现实中,蓝底白字占了车牌的绝大多数。
字符分割是本实验的重点。车牌分割有很多方法, 如神经网络算法、水平投影、点阵结构等。因为车牌识别要求是实时,要求具有很快的响应速度。所以字符分割这一步对车牌字符的最终识别和整个程序运行效率有很重要的影响,本实验基于K-Means聚类算法思想实现了字符分割,因为车牌规定是7位的,所以K取7。另外本实验对K-Means算法进行了改进,充分考虑了初始点的设置及迭代结束条件。实验结果证明这种改进的K-Means算法实现车牌字符分割是快速、有效的。
整个算法用VC++6.0实现。
一、实验目的
(1)掌握图像数据挖掘的基本方法
(2)K-Means聚类算法完成车牌字符分割(重点)
二、实验内容
基本功能要求:
(1)实现车牌的精确定位
(2)对K-Means聚类算法进行改进,即如何进行初始点和迭代条件的确定,快速完成车
牌字符分割。
三、算法设计
本算法分为二部分,车牌定位和字符分割。车牌定位的各个函数、算法思想是图像处理和模式识别课程中重要讨论的内容,这里只作了简单介绍。本实验着重讨论如何基于K-MEANS算法思想实现车牌字符分割。
程序执行流程如下:
1、车牌定位
(1)读取车牌图片
用OnBmpopen()函数实现
(2)车牌定位的各函数说明
车牌的定位由一系列函数完成, 各函数说明如下:
OnRgbtogray();//彩色转成灰度
为了降低计算复杂度,一般将彩色转换为灰度,公式:gray = 0.3*red + 0.59*green + 0.11*blue(数字图像处理岗萨雷斯)
Onjunhenghua();//均衡化
为了增强图像对比,采用了均衡化操作(图像工程(上) 章毓晋)
OnBianY uanJianChe();//边缘检测
此函数利用了Sobel算子检测车牌和字符的边缘(数字图像处理岗萨雷斯)。因为粗略定位需要是根据这些边缘来定位的。
OnEzbz();//二值化
用数组记录图片的可能区域
OnHxqy();//粗略定位,给出候选区域
根据记录的信息完成车牌的粗略定位,之所以说是“粗略”是因为车牌周围的点是车牌识别的噪音,所以根据车牌的边缘来实现精确定位是很难的。
OnQyqd();//基于纹理定位
根据上一步的结果,得到了车牌的大概位置,再根据车牌的底色为蓝色(对于其它三种情况分类判断即可,本实验只针对蓝色底纹)这一特点,可以实现车牌的精确定位。判别条件如下: hl=2*b-r-g>80 r表示像素的红色分量,g表示绿色分量,b表示蓝色分量(这里的80是根据不断实验得出的阀值)
2、K-Means 聚类算法实现车牌字符分割
改进的K-Means算法实现步骤:
Step1 每个字符代表一个类。因为车牌有7个字符(如图所示)组成,故设置7个聚类中心,
为了能在较少的次数下收敛,对K-Means进行了改进,即类的初始点不是随机选取,而是根据车牌的特点取值,如:
对于车牌字符横坐标:
oldposition[0][0]=left+width/12;//第一个字符位置离车牌左边约1/12*车牌宽度
oldposition[i][0]=oldposition[i-1][0]+2*width/15;//后一个字符离前一个字符约1/15宽度 对于车牌字符纵坐标
oldposition[i][1]=bottom+height/2;//每一个车牌的纵坐标大约是车牌高度的一半
这样设置的理由:由于车牌的像素坐标都是整数,所以坐标用整型变量,这大大提高了算法执行效率。以上设置保证了初始点在各类内,如图所示:红点代表初始点的大概位置,这样设置初始点后,只要经过几次迭代就会收敛。即中心会移到各字符的中心位置。
Step2 扫描所有字符像素,按照距离最近原则,对车牌像素进行归类:
d=(x-oldposition[i][0])2+(y-oldposition[i][1])2
公式中x,y 是当前扫描的像素坐标,oldposition[i][0],oldposition[i][1]是聚类中心的x,y 坐标,离i 类中心坐标最近,就把该像素归到i 类,本程序用不同的颜色表示不同的类,如国所示的最后分类结果:
Step3 完成一次归类后,重新计算各类中心坐标: newposition[i][0]=∑xi/n; newposition[i][1]=∑yi/n; 计算:
di= |newposition[i][0]- oldposition[i][0]|+ |newposition[i][1]- oldposition[i][1]| D=∑di (i=0,……6)
判断D<= e?若不小于,将新的类中心坐标作为类中心, 返回Step2;否则结束。程序中取e=3,也即它们之间的距离差的平均值小于0.5(3/7取整)时,迭代结束。
”e ”取3的理由:由于每个像素的坐标都是整型的,它们的坐标相差最小值是1个像素点,所以只要保证新类的中心和上次类中心距离差平均小于0.5,就说明找到各类中心,即分割成功。
字符分割算法流程: