梁福林 冯生强 马思思 石华 唐琼
摘要:本文利用图像识别技术的模式识别,设计了一种用于识别衣物品牌与型号的基于Android平台的物品识别软件。其在结构上总共分两大模块,即客户端板块和服务器板块,用户通过客户端拍取图片,将图片上传到服务器上,服务器自动截取图片,通过3轮识别,找到最相似的图片。
关键词:模式识别;图像识别;Android平台
中图分类号:G642 文献标志码:A 文章编号:1674-9324(2015)39-0238-02
一、引言
随着手机的发展,人们的生活也变得越来越便捷,但是在某些方面人们仍然会会遇到困难,比如说走在街上,看到街边行人身上漂亮的衣服,不知道其品牌,更不知道在哪儿能够买到。有些时候人们会选择一种方式,即先把别人穿的衣服拍下来,然后再去网上查找,或者去实体店查找。但是在偌大的市场上找到一件相似的衣服如同大海捞针。所以急需要物品识别的软件产生,帮助人们解决寻找喜欢的物品的难题。
二、系统的设计与实现
1.功能设计。本文所设计的基于Android平台的物品识别软件主要包括客户端和服务器两部分。客户端主要负责对衣服拍照并发送图片给服务器,服务器则负责接收数据后对图像进行识别,并将识别出的衣服的品牌和型号返还给客户端。
在Android客户端采用的C/S结构,如图1所示。客户端的作用是获取图片并发送给服务器。服务器的作用是获取客户端发送的图片,分别经过三轮的识别,得到图像的信息。用户与客户端的交互是通过Activity类完成的。服务端与数据库相连,实现图像的读取与识别。Android客户端与服务器端的数据交换是基于Socket实现的。
用户使用本文所设计的物品信息查询系统时,只需打开软件,点击识别,软件就可自动对图片进行截图,并将所截图片发给识别模块,分别进行三轮识别,具体的识别模块流程如图2所示。
2.系统的关键技术的实现。(1)自动截图的实现。据统计,有90%的人物图片的背景与目标图像的灰度值存在很大的不同,所以提取截图就是依托这种情况来得到目标图像的。具体实现如下:①把图像用灰度数组表示。创建一个行和列都和图像相同的整型的灰度数组,从左到右、从上到下依次扫描原图像的像素点,通过提取灰度值得函数,得到每一个像素点的灰度值,存进数组中。②得到平均灰度值。计算灰度平均值可以通过式(1)计算。
其中,size1为灰度数组的总的列数,size2为灰度数组总的行数,p[i][j]代表第i列,第j行的图像的灰度值,r为平均灰度值。③得到二值数组。求二值数组的目标是让背景取值为0,目标图像的取值为1。首先算出中间部分的平均灰度值,整幅图的平均灰度值大于中间部分的平均灰度值则令t1=0,t2=1;如果平均灰度值小于中间部分的平均灰度值则令t1=1,t2=0。建立行数,列数和灰度数组行数和列数相同的二值数组,从左到右,从上到下的扫描灰度数组,比较灰度值和整幅图的平均灰度值大小,如果灰度数组的灰度值大于平均灰度值,则把二值数组对应灰度数组的位置的值设置为t1,否则设置为t2。④求取截图的开始坐标和结束坐标。从左到右求取每一列的灰度数组的1占有每一列的长度的比例,如果比例大于10%则X1的值设置为列值;从右到左求取每一列的灰度数组的1占有每一列的长度的比例,如果比例大于10%则X2的值设置为列值;从上到下求取每一行的灰度数组的1占有每一列的长度的比例,如果比例大于60%则Y1的值设置为行值;扫描的终止位置离底部的距离不能超过(X2-X1)*3/2。如果描到这个位置,那么就设置Y1的值为这个行值。令底部的行值为Y,如果(Y-Y1)>(X2-X1)*3/2,则Y2=Y1+(X2-X1)*3/2,否则Y2=Y。⑤截图。上一步得到了开始坐标(X1,Y1)和结束坐标(X2,Y2),可以创建出一个图像数组A[X2-X1][Y2-Y1],把原图在开始坐标和结束坐标内的图像数组存进该数组中,就得到了截图。(2)第一轮识别:颜色识别。本节主要讲述怎么通过识别颜色,来实现第一轮数据的获取。①获取图片。拍下的照片先把它转化为Android的Bitmap类,再把图片发送至服务器。服务器获取图片后先自动截图,获取目标图片。再通过BufferedImage类的getRGB()方法获取图像的像素数组。②获取图片的颜色二维数组。先做预处理,把颜色的3个向量的每一个向量分作6个组,得到216种颜色,用肉眼去区分不同的颜色,并按红橙黄绿青蓝紫和同一颜色颜色的深浅排序。把每一种颜色都映射到这一维数组上,实现3维数组向一维数组转换。以得到整张图片的颜色数组。③提取平均颜色并识别。通过得到的图像的颜色数组去算出颜色平均值,再与数据库中的颜色平均值所比较,得到与图像颜色平均值最近的前10%的数据。(3)第二轮识别的实现。①计算图片的每一种颜色的比例。先扫描每一张图片的颜色数组,分别记录每一个颜色出现的次数。用每一个颜色出现的次数除以像素点总数,得到每一种颜色的比例。②查看图片相似度。
size为颜色的总数,a[t]代表图片a颜色下标为t的颜色占整幅图颜色的比例,b[t]代表图片b颜色下标为t的颜色占整幅图的颜色比例,r为相似度。③得到相似结果。根据公式(2)算出第一轮扫描得到的图像中的所有图像的相似度,并从小到大排序,取排名前10%的图像进行第三轮识别。(4)第三轮识别的实现。第三轮识别和第二轮很相似,第三轮识别是取被比较图的3个固定位置的图像块,即截取3个局部图像,算出其每一种颜色的比例,再与第二轮识别得到的图像的对应位置(相对位置和被比较图的3个局部图像相对位置相同)相比较,得到这3个位置分别的相似度依托以下公式计算出相似度。
三、测试结果与分析
对35张样本,129张样本的测试图片做测试,匹配正确120张,错误9张,正确率93.02%。
对35张样本,60张用手机拍的测试图片,匹配正确10张,错误50张,正确率16.67%。
第一种测试失败的原因经分析如下:
1.部分图像截图不正确,背景白色和衣服白色的图片容易截取错误。
2.肉眼划分颜色的细度不够,导致部分颜色会出现深和潜匹配效果相同。
第二种测试失败的原因分析如下:
1.不同摄像头厂商采光,处理颜色的技术不同,导致有些物品拍摄下来,颜色变化太大。
2.对照片拍摄时,照片反光太明显,引起颜色变化太大导致识别失败。
解决方案:
1.设计一种摄像头转换程序,即分析两个摄像头拍摄物品颜色的区别,把本地摄像头拍摄的照片通过图像处理,处理为种本摄像头的效果图片,再查询数据库(有待研究)
2.依靠背景的颜色特点,识别是否有灯光的影响,然后再对实际的物体做图像处理,去除灯光的影响,再查询数据库。
四、总结
在同一摄像头,同一环境下拍照同一个依托颜色和明显的花纹区分的物品的图像识别基本上正确。以后的图像研究可以从不标准图片往标准图片上靠拢,识别率会高很多。只是本软件还存在一些问题没有解决,如环境问题和摄像头效果问题等,希望读者可以与我们一起分析。
参考文献:
[1]张洪刚,陈光,郭军.图像处理与识别[M].北京邮电大学出版社,2006.
[2]数字图像处理:Java语言算法描述[M].北京:高等教育出版社,清华大学出版社,2004.
[3]孙夑华.数字图像处理:Java编程与实验[M].北京:机械工业出版社,2011.