孙庆英, 翟海峰
(淮阴师范学院 计算机科学与技术学院, 江苏 淮安 223300)
基于Android平台的智能证件照系统的设计与实现
孙庆英, 翟海峰
(淮阴师范学院 计算机科学与技术学院, 江苏 淮安 223300)
提出了一种基于Android平台进行证件照拍摄、处理的一体化智能解决方案. 软件使用MVP架构,避免了Activity组件的高耦合,通过对图片进行压缩处理,提高了处理速度,避免了Android OOM的异常.利用边缘检测算子Sobel算子,对证件照人体轮廓边缘进行有效的识别,给出将RGB图像转换为灰度图像时获得的灰度值频率分布直方图的调整建议,能够满足一般用户对拍摄制作证件照的需求.
图像处理; 安卓系统; 证件照; Sobel算子; 灰度直方图
当前电子政务高度普及,公务员、研究生等各类考试报名,简历制作等,都需要用到标准格式的电子证件照,拍摄要求中经常指定某种背景色.而以往进行证件照拍摄,需要前往照相馆,或借助专业的道具,费时耗力,成本较高,后期难以再进行修改.以往的图像处理的手段,如Photoshop等工具的使用都具有较高的学习成本,用户一时难以掌握.
针对当前这种制作、处理电子证件照困难的情况,本文提出了一种基于Android平台的证件照处理系统,该系统使用MVP架构[1],利用Android自带设备进行拍摄,通过自定义相机的取景界面对用户进行姿势和距离的引导,使用户可以拍出比例适宜的证件照.拍摄完成后,通过有效的压缩算法,对图片按比例进行压缩,再加载进内存中进行图片处理.软件将使用Sobel算子进行人体轮廓边缘检测,实现证件照前后景的分离,并以此进行背景色的替换.同时,还将通过将所拍摄图像转换为灰度图像并得到的灰度图像的灰度值频率直方图来判断是否存在明显的图像质量问题,并提供优化建议.软件提供了一种基于Android平台进行证件照拍摄、处理的一体化解决方案,能满足一般用户快捷、高效制作精美证件照的需求.
基于移动平台的图片编辑系统,采用MVP(Model View Presenter)的系统架构.MVP为传统软件所采用的MVC系统架构的演化版本,让Model与View层完全解耦.具体架构见图1所示.
图1 系统结构图
图2 MVC与MVP模式的区别示意图
在Android程序设计中,Activity组件的高耦合,往往给软件的编写和维护带来了较大的麻烦.因为其既要处理View层的显示,又要作为Controller,负责监听用户的操作.
传统的MVC架构下的Android开发: 1) View: 对应布局文件; 2) Model: 业务逻辑和实体模型; 3) Controller: 对应于Activity.
而将架构改为MVP之后,Presenter的出现,将Activity视为View层,Presenter负责完成View层与Model层的交互.MVP架构: 1) View: 对应于Activity,负责View的绘制以及与用户交互; 2) Model: 依然是业务逻辑和实体模型; 3) Presenter: 负责完成View与Model间的交互.MVC架构与MVP架构两者区别如图2所示.
现在主流Android手机设备的相机像素都在数百万,因此,其拍摄出来的照片大小有4~5 MB,若不对其进行压缩处理,直接加载进内存进行图像处理,将导致Android OOM异常.此外,Android图像的显示同样受到imageview控件的限制.因此,对拍摄出来的原始图像进行压缩处理是十分必要的.
为了保持图片原有的像素比例,使内容不被拉伸变形,处理的思路有: 1) 获取图片的像素宽高; 2) 计算需要的压缩比例; 3) 通过计算出来的压缩比例对图像进行压缩,再加载进内存进行处理.
2.1 BitmapFactory类
Android平台封装了1个android.graphics.BitmapFactory类,用来解析图片,创建Bitmap对象.这个类里提供了1个关键的方法为decodeResource(Resources res,int resId,BitmapFactory.option options),该函数有3个参数,前两个参数是用来确定所要处理的图像的.最关键的是第3个参数BitmapFactory.Option对象,可以通过对该Option对象的成员变量进行设置,来灵活的解析获取图片,并且可以用来进行图片压缩.Option类描述的是图片配置信息,这里介绍一下系统中使用的几个参数:
1) inJustDecodeBounds: 将该参数设置为true时,decode获取的图片只会加载像素宽高信息.设置为false时,decode将会完全加载图片.
2) inSampleSize: 该参数确定图片压缩比例,一般设置为2的幂数.
3) outHeight: 图片原高度.
4) outWeight: 图片原宽度.
2.2图像压缩实现算法
可以通过下面的算法来进行图片的压缩加载:
options.inJustDecodeBounds=true;
//仅将像素宽高信息存储在options中,不会返回bitmap对象
BitmapFactory.decodeResource(res,resId,options);
options.inSampleSize=inSampleSize;
//这里返回1个Bitmap对象
BitmapFactory.decodeResource(res,resId,options);
这里存在一个难点就是确定inSampleSize的值.本文算法是,先通过上文描述的方法获取到原图比例后,根据实际的证件照分辨率需求(一般不会大于手机分辨率),设置对应的宽高targetWidth和targetHeight.当图片的实际宽度width大于targetWidth或者实际高度Height大于targetHeight的时候,算法将进入一个循环,循环的条件是图片的实际宽度width的一半即(width/2)除以inSampleSize大于或等于目标宽度targetWidth,并且图片的实际高度的一半即(height/2)除以inSampleSize大于或等于目标高度targetHeight.每进行一次循环,inSampleSize的值加倍,直至循环停止.该算法流程总结如图3所示.
图3 求压缩比例的算法流程
为了对用户拍摄出来的照片或者已有的证件照,进行替换背景色处理,需要对照片进行边缘检测,将人体轮廓的边缘与背景区分开来,再将背景区域的像素RGB值替换为用户所需要的颜色的RGB值.
算法的实现过程:
1) 图片去噪.因为软件虽然会建议用户在白墙之前,或者在纯色背景之前进行拍照,但墙面有可能会有坑洼或者突起,此时图片将会存在一些噪声点.因此在进行边缘检测之前,需要对图片进行去噪处理.
2) 利用边缘检测算法,进行边缘检测,得到边缘图.由于证件照的特性,前景和背景是被明显分开的,因此,对边缘图像进行轮廓跟踪相较于其他背景复杂的图像来说,简单许多.因此一些简单的边缘检测算法,就可以实现较好的效果.
3) 遍历图像,将不属于人体边缘轮廓区域内的像素点的RGB值,替换为用户所需要的RGB值.
3.1 图片去噪
本文利用高斯滤波器来进行图片的去噪.高斯滤波器的滤波矩阵相当于1个离散的二维高斯函数,如式(1)所示:
(1)
其中σ是指“钟形”函数的宽度(标准差),r是指与中心点的距离(半径).中心处的像素具有最大的权值1.0,其余位置的权值则随着与中心距离的增大而平稳减小.在高斯滤波器的滤波矩阵足够大的时候,能够足够的逼近高斯函数.
为了避免截断误差,离散的高斯函数应该具有足够大的尺寸,一般取±2.5σ到±3.5σ.该软件采用的是1个“半径”为σ=10的离散高斯函数,因此其要求最小的滤波尺寸为51×51像素.
一般而言,如果1个二维滤波器的滤波函数H(i,j)可以表示为2个一维函数的外积,那么它就是可x/y分离的,因此式x可以表示为如下的乘积形式,如式(2).
(2)
因此,1个二维高斯滤波器可以分解为一对一维高斯滤波器.这样在进行卷积运算的时候,可以减少部分计算量.例如本文所用到的为51×51像素的滤波器,进行x/y分离之后,将比完整版的二维滤波器速度快50倍左右.
算法java语言实现如下:
float [] makeGaussKernelld (double sigma){
//创建滤波核
Int center=(int)(3.0 * sigma);
float [] kernel=new float [2 * center+1];//奇数大小
//填充滤波核
double sigma2=sigma * sigma;
for (int i=0;i < kernel.length;i++) {
double r=center-I;
kernel [i]=(float) Math.exp(-0.5 * (rr)/sigma2);
3.2 边缘检测算法
由于证件照具有前景和背景被明显分开的特性,因此,一些简单的边缘检测算法也会起到一个较好的效果.
目前较为常见的几种边缘检测算子有:Sobel算子[2],Roberts算子[3],Prewitt算子[4],Laplacian算子[5]以及Canny算子[6],本文仅对这些算子的实现原理进行简单的描述和对比,以选择一个适合在Android平台上使用的算子.
Roberts算子通过两个2×2滤波器沿图像的对角线方向来估算方向梯度,虽然其对图像中的对角线边缘有良好响应,但是其方向选择性较差.
Laplacian算子是一种二阶微分算子,它需要先在水平和垂直方向分别计算二阶导数,在边缘点两旁的像素的二阶导数异号.这种算子适合只考虑边缘点的位置而不考虑周围的灰度差的情景.不符合证件照处理的实际场景.
Canny算子是当前较为主流的一种边缘检测算子,它是将图片去噪,边缘识别及轮廓增强结合在一起的一种算子,但是其计算量较大,处理过程繁杂,在不引入包含该算子算法的动态so库的情况下,不适宜应用在Android平台上,其实现参照文献[7].
Sobel算子和Prewitt算子是一种小型边缘检测算子,它们的差异仅在滤波器不同,相对于Prewitt算子,Sobel算子为其滤波器的中间的行和列分配了更大的权值,因此仅对使用更加广泛的Sobel算子进行讨论.Sobel算子使用离散型的差分算子来运算图像亮度函数的梯度的近似值.其缺点在于当图像背景复杂,轮廓较多的时候,它并不能将图像的主题与背景进行严格的区分.然而,在证件照的处理情景中,前景和背景差距很大,且背景噪声较小,经过高斯模糊处理后,可以忽略,因此Sobel算子可以实现较好的效果.其优势在于,算法实现简单,运算量没有Canny和Laplacian算子那么大,所以速度较快,可较好地应用在Android平台上.本文使用文献[8]提出的一种改良的Sobel滤波器,可以减小方向上的误差.
一张标准证件照经过Sobel算子边缘检测后的实现如图4所示.通过该软件拍摄的照片经过Sobel算子边缘检测后的实现如图5所示.
(a) 标准证件照 (b) RGB图像边缘检测 (c) 8bit灰度图像边缘检测
(a) 相机拍摄照 (b) RGB图像边缘检测 (c) 8bit灰度图像边缘检测
从实验的结果来看,Sobel算子对彩色证件照图像和8Bit黑白证件照图像的识别效果均良好,能较好地区分开前景和背景,检测出了人体的主体轮廓.并且,边缘轮廓线完整,可较好地进行轮廓的跟踪,绘制轮廓图.
由于拍摄设备或者拍摄环境限制,用户所拍出来的照片往往存在一些缺陷,例如曝光不足、过度曝光、饱和度不够等.而用户并不能准确判断自己所拍摄的图像是否有上述问题. 因此,该软件将需要处理的RGB彩色图像转换为灰度图像,通过绘制灰度图像的灰度值的直方图来给出调整指导.
Java中RGB彩色图像的表示如图6,每个分量的范围是0~255,剩下的8位用来表示透明度α.
图6 java的RGB彩色图像表示
首先可以通过Bitmap类的getPixel(x,y)获得需要处理图片的整体像素值,赋值给int类对象color,然后通过android.graphics.Color类提供的静态方法Color.red(color)来获得该图片红色通道值,Color.green(color)获取该图片绿色通道值,Color.blue(color)获取蓝色通道值,Color.alpha(color)获取透明度α值.也可以通过如下移位和掩码操作来获得:
但是这里转换为灰度图像,不能简单地对每一个RGB像素的各个颜色通道的值取平均值.因为红色和绿色比蓝色要亮,直接取平均值会导致图像的红色和绿色区域显得比较暗,而蓝色区域变得比正常情况下要亮.所以,这里需要应用颜色分量的加权和来计算等效的亮度值.
本文使用ITU-BT.709推荐使用的数字彩色编码权值,红绿蓝的权值分别为:wr=0.2125,wg=0.7154,wb=0.072.因此转换后灰度值Y计算方法如式(3).
Y=Lum(R,G,B)=wrR+wgG+wbB
(3)
遍历整个RGB图像,将RGB像素点都转换为对应灰度值,与此同时,建立1个散列表,key值为灰度值,value值初始值为0,该灰度值每出现一次,便加上1,遍历完成后就可以获得1个反映了灰度值频率分布的直方图.算法的时间复杂度为O(n),空间复杂度为O(n),在图片较大时依然可以有较快的处理速度.
利用该直方图,便可以对用户进行图片调整上的建议,例如一端较大强度取值范围未使用,而另一端充满峰值的直方图就代表图像的曝光不合适.大量的强度值没有取值,则意味着对比度较低.
本文介绍了基于Android平台的MVP软件架构,总结阐述了一种在android平台上进行图片压缩的算法.简述了软件进行证件照背景替换的原理和算法,对比了各种边缘检测算子的优劣,并且通过实验证明Sobel算子可以用于证件照图像的边缘检测.提出了一种在Android平台上将RGB彩色图像转换为灰度图像并获取灰度值频率分布直方图的算法,以此来给用户以图像优化上的建议.该软件系统提供了拍摄、处理的一体化智能解决方案.有效地满足了用户对于快捷、高效制作精美证件照的需求.
[1] Zhang Y, Luo Y. An architecture and implement model for Model-View-Presenter pattern[C]//Computer Science and Information Technology (ICCSIT), 2010 3rd IEEE International Conference on. IEEE, 2010, 8: 532-536.
[2] 薛帅, 戴青, 冯东华, 等. 基于 Gabor 滤波器的 Sobel 算子图像边缘检测算法[J]. 信息技术, 2014, 38(1):17-20.
[3] 康牧, 许庆功, 王宝树. 一种 Roberts 自适应边缘检测方法[J]. 西安交通大学学报, 2008, 42(1): 1240-1244.
[4] 任小强, 王佩, 胡波, 等. Prewitt 图像边缘检测算法的优化设计与实现[J]. 中国集成电路, 2016(7): 34-38.
[5] 孙增国, 韩崇昭. 基于 Laplacian 算子的图像增强[J]. 计算机应用研究, 2007, 24(1): 222-223.
[6] 张川川, 王俊元, 杜文华, 等. 快速 Canny 算子提取刀具图像边缘的研究[J]. 测试技术学报, 2015, 29(2): 132-136.
[7] Efford N. Digital image processing: a practical introduction using java (with CD-ROM)[M]. Addison-Wesley Longman Publishing Co., Inc., 2000.
[8] Burger W, Burge M J.Digital image processing: an algorithmic introduction using Java[M]. Springer, 2016.
DesignandImplementationofIntelligentIDPhotoSystembasedonAndroidPlatform
SUN Qin-ying, ZHAI Hai-feng
(School of Computer Science and Technology, Huaiyin Normal University, Huaian Jiangsu 223300, China)
MVP structure is used for the software to avoid high coupling of Activity module. The pictures are compressed for faster processing speed, so that the abnormality of Android OOM can be avoided. The edge detection operator (Sobel) is used to effectively identify the body silhouette edges of ID photos. When transforming RGB images into gray level images, the histogram of gray level frequency distribution can be obtained for adjustment suggestions. Based on Android platform, an integrated solution for ID photos shooting and processing is provided, which effectively meet the demands of users in making fancy ID photos in a convenient and efficient way.
images processing; android; ID photos; sobel operator; gray histogram
TP317.4
A
1671-6876(2017)03-0226-06
[责任编辑蒋海龙]
2017-02-20
淮安市应用研究与科技攻关(工业)计划项目(HAG2014025)
孙庆英(1982-),女,江苏洪泽人,讲师,硕士,研究方向为信息安全与移动开发. E-mail: computersqy@qq.com