岳晓峰,龚青池
(长春工业大学 机电工程学院,吉林 长春 130012)
由于血袋使用的特殊性,所以血袋上的编号必须清晰、准确、唯一。为了识别视频中血袋上面排列的均匀有序的血袋热转印编号,本文以视频流识别算法实现为主要目标,利用Simulink平台的模块功能,对视频流图像字符识别系统进行研发。
首先读入视频,视频图像像素为480×720,然后利用Color Space Conversion模块对视频进行灰度转换,转换后的图像如图1所示(由于篇幅有限,将图缩放30%)。在模块中选择 R′G′B′to intensity,灰度(intensity)计算公式如下:
其中:R′、G′和B′分别为图像的R、G、B值。
为了降低视频图像的矩阵大小,以减少后期的数据运算量,提高整体运行速度,利用Rerise模块改变视频图像维度。改变维度后的图像如图2所示。在模块中将Rerise factor in%设置为[20 20],即把图片维度缩放20%,此时视频图像像素为96×144。
图1 灰度转换后的图像
图2 改变维度后的图像
观察视频图像会发现图像中的字符排列整齐有序,大小相同(除个别较扭曲),所以利用Simulink中的位置分割模块对视频图像中各个字符进行分割,得到20×14的像素区域,从而在视频图像中分割出依照参数得出的字符,运用这种方法可以得到从0到9以及字母P的分割图像,如图3所示。
图3 字符分割
首先利用MATLAB中DIP工具箱函数im2bw对图像进行二值化处理,I=im2bw(I,0.2);原始图像的像素点值范围为0~255,而二值图像的像素点值只能为0和1。其运算法则如下(其中0.2为变换的阈值):
其中:I和Y分别为运算前、后像素点的值。
以数字3为例,从图4中可以看出,对于黑色的区域像素为0,而对于白色的区域像素为1。
使用Simulink封装模块将MATLAB程序封装在模块中,以备在流程图中调用。程序采用图像四分法以及孔洞补充算法对字符进行识别。图像四分法即把图像均分成四部分,对于具有内容的图像,通过获取其行列的边界值可以得到其坐标系,然后在坐标系中计算各个象限中非零像素的百分比及整个字符占整个图像的百分比。
图4 数字3的图像空间域显示
首先在图像中将字符区域框选出来,算法如下:
以数字3为例,来演示字符框选效果,见图5。算法如下:
[a0b0]是处理后的图像,然后获取图像的维度,找到X轴的行坐标以及Y轴的纵坐标和中心原点row_zero和col_zero,接下来开始划分各个象限。此处以0为例,图6为四分法划分结果。代码如下:
[a1b1]即为第一象限非零像素。以此类推,[a2 b2]为第二象限非零像素,[a3b3]为第三象限非零元素,[a4b4]为第四象限非零像素。然后依次计算四个象限非零元素占整个图像的百分比out(1,1)、out(1,2)、out(1,3)、out(1,4),以及整个字符占整个图像的百分比out(1,5):
图5 数字3演示效果
图6 数字0的四分法划分
在计算时,对视频流里每个字符随机选取5个样本,将结果汇总得到一个5列、55行的数据库(1到0,以及字母P,故55行)。表1为四分法运算结果,因篇幅问题,只列举了1和2的数据结果(共10行)。
表1 数字1和2的5个随机样本四分法数据
匹配算法采用最小二乘法,它通过最小化误差的平方和寻找数据的最佳函数匹配。根据算法原理可以得到匹配算法的代数形式为:
其中:Yk为本算法中的虚拟距离;Xk为根据四分法得到的待识别字符的计算数据;αk为数据库里的数据。设i是从1到5的自然数即数据库中的列数,j为行数,把公式编成语句如下:
然后对每一行的数据进行求和,并且找到和值最小的数据,这个和值最小的数据即为算法最终要寻找的匹配数据。
在系统实现时发现仅靠四分法算法的识别率并不是很好,原因是视频流中有一些字符比较模糊、扭曲,所以还需要一些补充算法来对一些识别结果进行校正。
3.4.1 孔洞识别
我们观察这11个字符,发现1、2、3、5、7没有孔洞,0、4、6、9、P具有一个孔洞,8具有两个孔洞。因而孔洞这个特征在识别上具有一定意义。
根据对图像黑色和白色像素点的描述可以知道,孔洞位置处的像素点值为0,所以为了将孔洞标记出来,需要将图像取反,从而将原来的黑色变为白色,原来的白色变为黑色。图7为数字8取反后的图像。
随后需要运用bwlabel函数对二值图像非零区域进行元素标记。然后计算孔洞数目holenum。图8为数字8的bwlabel函数转换。从图8中可以看出此时原来被框选的像素值为1的点均被重标记为自然数,且每个区域的值都不同,数字“8”被标记的最大值为3。根据前面的介绍可以知道,对于只有一个孔洞的数字则标记的最大值为2,没有孔洞的数字则标记的只有原来的背景,故最大值为1。
此外孔洞的坐标也可以作为识别字符的一个参量。重复以上步骤,对图像取反并且对图像标记:
对于6与9的标记位flag69,根据孔洞平均行坐标与行原点的关系确定是6还是9,代码如下:
3.4.2 像素点识别
在实现四分法识别以及孔洞识别算法之后发现数字0、6、9仍然存在个别错误识别,所以需要专门对这三个数字进行一次补充识别。识别算法选择像素点求和算法。
根据前文步骤,首先仍然先找到图像中非零像素点,找到最大、最小位置点,获取边缘图像,然后找到行列中心点,确定横、纵坐标轴及原点(这里rowzeros为X轴,与前文不同,望读者注意),代码如下:
找到原点附近的9个像素点,提出0、6、9识别的标志位flag069,然后对这9个像素点求和并且判定求和与3的关系:“if sum((sum(I_zeros))')<=3”,则输出结果flag069为0。分别找出X轴以上及以下的非零元 素 点 “num_up=length(find(row_temp>rowzeros));num_down=length(find(row_temp<rowzeros))。如果num_up大于num_down,即X轴上面的元素点多于X轴下面的元素点,则flag069为9,否则为6。
图7 数字8的取反
图8 数字8的bwlabel函数转换
采用本文的算法对一段20s的视频进行字符识别,进行了上述几个步骤的处理。312个字符中,仅有一个数字9因过于扭曲,识别错误,识别率接近100%,故本方法能够实时有效地识别视频流中的字符,满足实际系统的要求。图9为图1中字符的最终识别结果(图中11即代表P,10代表O)。
图9 图1中字符最终识别结果
[1]Feizenszwalb P F,Huttenlocher D P.Efficient belief propagation for early vision[J].International Journal of Computer Vision,2006,70(5):41-54.
[2]袁振涛,郭俊,师福明.利用BP神经网络识别图像基点[J].机械工程与自动化,2012(3):200-201.
[3]迟健男,王先梅,胡四泉,等.视觉测量技术[M].北京:机械工业出版社,2011.
[4]凌彤辉,黄山,王新增,等.车牌字符分割算法的研究[J].中国测试技术,2005(1):41-43.
[5]薛定宇,陈阳泉.基于 MATLAB/Simulink的系统仿真技术与应用[M].北京:清华大学出版社,2002.
[6]刘成安,孙涛.车牌自动定位与识别方法研究[J].微计算机信息(测控自动化),2007(25):263-265.