基于Android平台图像分类系统的设计与实现

2021-11-26 09:44
天津职业院校联合学报 2021年8期
关键词:分类器灰度样本

薛 宾

(天津市南开区职工大学,天津 300100)

一、引言

随着移动终端设备的普及,移动终端设备上的各种应用已经给人们的生活带来了巨大的便捷。基于移动终端设备上的图像识别和分类技术已是目前研究的热点。移动终端设备因为体积比较小,便于携带,人们可以随时使用,对于拍摄的照片可以根据图像分类技术自动存储到特定的文件中,省去了人工分类的时间;使用移动设备拍照时,通过图像分类技术可以自动识别所拍的景物,实现自动调节光圈焦距等功能;图像分类技术还可以应用在医院诊断治疗、Internet信息检索和数据过滤等方面。Android作为主要用于移动设备终端的操作系统,经过不断的发展,目前市场占有率已近80%。因此,研究基于Android平台的图像分类技术具有重要的现实意义。

二、图像识别与分类算法

(一)图像的预处理

为了提取、匹配、识别图像特征,使其处理效果更加真实,需要对图像进行预处理操作。经过图像预处理后,消除了图像中的没有用的信息,从而简化了数据,使得图像的信息更加易于检测。

1.彩色图像的灰度化

彩色图像在进行图像处理前要提取出色彩特征,也就是灰度化。彩色图像存储信息通常采用24位RGB模式。彩色图像就是红(R)、绿(G)、蓝(B)三原色色彩深浅的组合,存储时需要占用三个字节,每个颜色分别存储;灰度图像就是没有色彩,红绿蓝三个颜色的取值相同,存储时占用一个字节。经比较本系统采用加权平均法计算灰度图像的灰度值,该方法更为合理,它是将红(R)、绿(G)、蓝(B)做不同权值的加权处理后得到的。计算灰度值的公式如下:

F(I,j) = 0.299R(I,j)+ 0.587G(I,j),+0.114B(I,j))/3

2.灰度直方图

灰度的分布情况是图像的一个重要特征。灰度直方图能够反映出某种灰度在图像中的出现的频率,它实际上是灰度级的函数,它的操作可以增强图像,它的计算很简单,就是统计出每种灰度级的个数,可以通过循环语句检测图像中的所有元素来完成。本系统的实现中,使用gArray数组来存储图像中的每一个像素的灰度值,gArray数组长度为Width*Heigh,灰度图像已经进行过预处理,每个像素点的RGB分量值相同,所以遍历gArray数组中的元素统计出灰度级的个数,可以设置步长为3,也就是每隔3个元素进行统计。直方图的数据信息存放在数组长度为256的一维数组countPixel中。关键代码如下:

Array.Clear(countPixel,0,256);

For(int I = 0;I < bitmap.Width * bitmap.Height; i+=3)

{

Byte temp = grayArray[i];

countPixel[temp]++;

}

3. 灰度拉伸

灰度拉伸是一种图像点运算,也是一种灰度变换。为了改善输出图像,通过该算法将某段灰度区间进行拉伸。本系统,对彩色图像灰度化后采用下面的算式进行全等级直方图拉伸。

f(x,y)为输入图像;改善后的输出图像为g(x,y);输入图像的最小灰度级A = min[f(x,y)],线性映射到0;最大灰度级B = max[f(x,y)],线性映射到255。

(二)图像纹理分析

本系统选择基于纹理的图像分类技术,它能够通过像素点的灰度值找出物体表面的内在规律和结构描述。图像纹理特征是一种全局特征,需要统计计算多个像素区域。图像中的元素或基元会存在一些排列规则,这些排列规则形成的重复模型叫做图像纹理特征。分析图像的纹理特征,就是要提取和分析图像灰度空间的规律。

灰度共生矩阵是较为有效的图像纹理分析方法,它很好的反应了灰度级空间的相关性。灰度共生矩阵实际上是一个矩阵函数。它反映出图像中某距离的像素之间具有某个灰度的情况。

灰度共生矩阵实际上是两个像素灰度的联合直方图。设共生矩阵元素记为p(i,j|d,θ),其中i和j是一对像元的两个灰度概率,θ是方向,d是距离。θ的取值为0°表示水平方向,取值为90°表示垂直方向。Zc、Zr分别是水平和垂直空间域。l、n、k、m在其所选的计算窗口中变动。

当方向θ=0°,距离为d时,其计算公式为:

P(i,j|d,0)=#{[(k,l),(m,n)]∈(Zr*Zc)|k-m=0,|l-n|=d},f(k,l)=i,f(m,n)=j}

当方向θ=90°,距离为d时,其计算公式为:

P(i,j|d,90)=#{[(k,l),(m,n)]∈(Zr*Zc)|k-m=d,l-n=0},f(k,l)=i,f(m,n)=j}

P(i,j)可反映出图像的许多纹理特征。P(i,j)的数值可以显示出图像纹理的粗细;P(i,j)的灰度相关性可以表示矩阵行或列之间的相似度;P(i,j)的熵和能量可以反映出图像分布的均匀度。

三、 图像识别算法

本系统的图像识别算法采用的是SVM(中文支持向量机)算法。SVM通常可以用来处理分类问题,所以本系统使用SVM来进行图像分类工作。

SVM是最优秀的分类算法之一,属于有监督学习算法的一种。因为SVM只由支持向量决定,所以它适合小样本的机器学习。使用SVM解决数据分类问题,可以使用核函数。为了构建良好性能的分类器,经过比较多个常用的核函数,本系统选用径向基函数(RBF),它参数较少对模型的复杂度影响更小,能够实现非线性映射,参数较少对模型的复杂度影响更小,稳定性更好。本系统采用的核函数是径向基函数(RBF)。

四、OpenCV框架

OpenCV是一个计算机视觉库。由于开源性和跨平台性,加速了它的发展。它提供了JAVA等多种语言的接口,包含图像处理方面的很多算法,并且允许使用和修改它的源代码。它支持移动平台的Android操作系统,它的多数模块使用C++语言编写,少数模块使用C语言编写。它的特点是轻量级且高效率,因此本系统的设计采用OpenCV视觉库。

分析图像的相似数据信息的排序算法,经过度中心性算法、半局部中心性算法、介数中心性算法三种比较,本系统选择半局部中心性算法,该算法排序效果远好于其他两个算法,时间复杂度随数据线性增长。

该算法中, 定义N(W)为W节点的两层邻居度,定义

则i节点的局部中心性为:

五、 开发环境

图像分类系统的开发环境是Windows7,开发语言是JAVA,核心代码部分使用了C++,应用程序的开发的工具选择的是Eclipse,系统的开发环境配置的是64位Eclipse和64位JDK。在Eclipse中需要安装ADT插件,用于搭建Android开发环境;然后要安装Android SDK插件,它提供的工具可以进行Android应用程序调试。

本系统的图像处理开发使用Android+OpenCV方式。在Android系统上,利用OpenCV进行开发的方式有两种:一种方式是使用OpenCV提供的C++ API,需要使用NDK插件和JNI接口,NDK可以开发C/C++的动态库,并自动打包成APK,然后借助JNI街口使用JAVA语言调用C/C++代码,实现不同编程代码间的交互。另一种方式是使用动态的OpenCV库,OpenCV直接编译库,API直接完成操作。本系统采用的是第一种方式,使用NDK插件和JNI接口。本系统采用JAVA语言开发程序,但核心的图像分类模块使用C++语言进行编写,第二种开发方式不支持使用C++代码,第一种开发方式中可以使用JNI接口调用C++编码。

六、系统模块设计与实现

本系统主要分为分类学习和分类测试两大模块。分类学习模块的主要功能是从测试样本中提取HOG特征向量,并将学习结果保存到XML文件中。分类预测模块的主要功能是拍照、加载图像和分类预测。

(一) 分类学习模块

分类学习模块使用非线性分类器,对多个分类数不小于二的测试样本进行学习。其中图像分类器使用基于SVM算法的多分类器,该分类器提取测试样本的HOG特征,并按照预设的类别编号进行学习,最后把学习的结果存储为XML格式。

分类学习模块中,第一步要采集测试样本。样本60%来源于网上爬取、选出的合适图像,其他40%样本来源于相机拍摄的实物图像。为了提高分类预测的分辨率,待分类图像的选取要尽量减少相似样本的重复率,同时要反映出待分类图像各个角度、各种亮度等情况下的样式。第二步,构建SVM支持向量机多分类器。经过多个常用核函数的比较,本系统选择径向基函数(RBF),它的稳定性更好,然后需要设置RBF的参数。

目前,选取参数的方法要依据经验判定一个大致的范围,根据分类预测的结果在设定范围内进行微调,直到调整为最佳的分类预测分辨率。第三步,提取全部测试样本的分类编号和HOG特征向量。测试样本在学习之前,要预先为它们进行编号。提取测试样本的HOG向量特征,首先要灰度化图像,其次将图像划分成小的连续区域,然后计算出每个连续区域中的每个像素的梯度,最后统计出每个连续区域的梯度直方图。第四步,测试样本的学习。通过分类编号或HOG特征向量将测试样本输入,然后调用SVM分类器的学习方法完成测试样本的学习,最后输出学习结果到XML文件中。

实现图像分类器功能使用C++进行编码。首先,需要设定全局变量,包括测试样本TXT文件的路径、学习结果XML文件的路径、图片的宽高等。其次,要读取指定文件下的SVM测试样本文件中的信息,得到测试样本图片的存储路径和预设分类;在测试样本文件中第一行是图片的绝对路径,紧跟着的下一行则是该图片对应的分类编号,编号设置为不同的整数即可,但至少应有两种分类,当然也支持多分类,如果分类少于两种会报错。再次,通过循环结构按照样本图片路径读取样本图片,并提取出每张样本图片的HOG特征描述向量并保存到矩阵中。最后,HOG特征提取完成后调用Opencv中的SVM分类器设置其相关参数,并对样本进行学习,学习结果使用save方法保存到XML文件中。

(二)分类预测模块

分类预测模块在Android系统中运行,需要提取图像的HOG特征来进行分类预测,并与XML文件中的特征信息进行比对。在实现HOG特征的提取与对比时,C++编码的效率会远高于JAVA编码。因此,本模块通过使用JNI技术,核心部分将在JAVA中调用C++代码来实现。

分类预测模块分为相册、拍照和图像分类三部分。相册是从设备存储空间或外置SD卡上获取待分类的图像。相机是调用设备的相机功能拍照,将拍摄得到的照片作为带分类的图像。图像分类是本模块的核心,是通过 JNI接口调用C++函数进行分类预测,以分类标号的形式返回预测结果,在JAVA中通过对编号进行判断解析成相应的文字。

图像分类预测模块执行时需要在页面中添加菜单的监听事件,加载OpenCV运行库,运行包含图像分类预测函数的C++代码的imageProc库,根据用户的选择打开手机的图像管理程序或相机功能进行相应的功能处理,检测已存在的图像将通过JNI传递文件地址给C++函数,该函数完成图像分类预测后将返回图像的分类编号,JAVA主程序接收到JNI接口返回的图像分类编号,根据编号解析成文字内容,显示在主界面中。

相机功能的调用有intent对象方法和SurfaceView对象方式两种。本系统使用intent对象方法直接调用系统相机。两种方式的代码编写量差不多,但SurfaceView对象方式直接调用硬件资源,不同的机型都需要进行适配,而本系统主要是对图像进行分类,对相机功能要求稳定、易用即可,因此本系统使用intent对象方法直接调用系统相机。

七、总结

图像分类技术有助于人们快速的识别移动终端设备上的海量图像数据。本系统是基于向量机理论,采用SVM算法以及OpenCV框架实现了移动平台Android系统下的图像分类功能。从实验数据上看,图像测试样本分辨率能达到95%以上,图像分类的效果较理想。移动终端设备上的图像分类功能应用比较广泛,是目前研究的热点,它也是计算机视觉处理中的基本任务之一。本系统对图像分类技术的研究有重要意义。

猜你喜欢
分类器灰度样本
采用改进导重法的拓扑结构灰度单元过滤技术
学贯中西(6):阐述ML分类器的工作流程
用样本估计总体复习点拨
基于朴素Bayes组合的简易集成分类器①
Bp-MRI灰度直方图在鉴别移行带前列腺癌与良性前列腺增生中的应用价值
Arduino小车巡线程序的灰度阈值优化方案
基于特征选择的SVM选择性集成学习方法
规划·样本
基于差异性测度的遥感自适应分类器选择
随机微分方程的样本Lyapunov二次型估计