李志杰,袁鹏泰,李博涵
(1.南京航空航天大学 计算机科学与技术学院,江苏 南京 211106;2.江苏易图地理信息科技股份有限公司,江苏 扬州 225009)
我国的居民身份证记载了每位公民的个人基本信息,包括姓名、性别、民族、出生年月日、住址和唯一的身份证编号。不仅是基于社会治安的需要和个人权益的保障,而且在人才招聘等场合也需要输入公民身份证信息。
随着携带高清摄像头的安卓手机越来越普及,研究采用基于带摄像头的安卓手机拍摄图像的身份证识别系统,可让使用成本更低、运用更加灵活。
数字图像处理和模式识别技术在安卓手机上应用广泛,其中就包括身份证的自动识别。这使得身份证的信息获取从人工识别转化为自动识别。目前身份证信息大多需要人工录入和手工填写,效率十分低下,录入和填写信息时可能发生错误,而且长时间的识别也会使人眼疲劳。所以,该方法已经不适应当今智能手机等领域飞速发展的现状。研究安卓手机如何自动读取身份证信息是十分必要的,不仅可以有效克服人工识别的局限性,而且具有识别效率高、识别准确度高的优点。
在身份证识别系统[1]中,采集到的含有身份证的图像很可能会同时存在以下一种或几种问题:除了身份证之外的背景与身份证的边缘不明显;身份证不是一个宽和高比例固定的矩形;身份证上有反光等光照影响;采集图像上有噪声。从复杂背景中分割出无畸变的身份证字符图像[2-4]是关键环节,决定了身份证识别系统的识别速度与正确率。对此,文中提出了一套完整的身份证图像分割和字符分割方法。
通过安卓手机扫描采集到的图像是像素1 024*768的三通道图像,每个像素的R值、G值、B值相等。其中,R值、G值、B值分别为三通道图像中像素的红、绿、蓝分量值。扫描要求:身份证四条外围线的位置分别在图像上1/5内、下1/5内、左1/5内、右1/5内。
首先,对采集图像按式1计算各像素的灰度值GrayValue,目标是将采集图像灰度化:
GrayValue=(306*R+601*G+117*B)≫10
(1)
其次,为了加快处理速度,采用线性插值将灰度图像缩放成像素341*256的图像,即缩放比例为3∶1。然后为了减小噪声的干扰,对缩放后的灰度图像进行中值滤波[5-6]。最后对图像进行自适应阈值Canny边缘检测[7-8]。
为了降低硬件资源的消耗,该设计采用线性插值法进行图像缩放。线性插值法就是根据待插值位置周围最近的几个像素来计算插值,对于平面图像来说,共有四点。其中插值计算公式为:
f(i+u,i+v)=(1-u)(1-v)f(i,j)+
(1-u)vf(i,j+1)+
u(1-v)f(i+1,j)+
uvf(i+1,j+1)
(2)
其中,i、j均为非负整数,分别表示像素的横纵坐标位置;u、v∈[0,1]分别表示插值位置与(i,j)的相对位置;f(i,j)表示图像(i,j)位置的像素值。
中值滤波(median filter)是一种基于排序统计理论的能有效抑制噪声的非线性信号处理技术。它是一种常用的非线性平滑滤波和邻域运算,类似于卷积,但不是加权求和计算,基本原理是把邻域中的像素按灰度等级进行排序,然后选择该组的中间值作为输出像素值,让周围的像素值不变,从而消除孤立的噪声点。邻域通常为3*3,5*5区域,可以是不同的形状,如线状、圆形、十字形、圆环形等。
中值滤波对脉冲噪声有良好的滤除作用,特别是在滤除噪声的同时,能够保护信号的边缘,使之不被模糊。中值滤波的算法比较简单,也易于用硬件实现。这些优良特性是线性滤波方法不具有的。中值滤波在图像处理中常用于保护边缘信息,是经典的平滑噪声的方法。
在众多经典边缘检测[9]方法中选择Canny边缘检测算子,是因为相比传统的微分算子,如Robets、Prewwit、Sobel、Laplace、Log等,基于最优化算法的Canny边缘检测算子具有较好的信噪比和检测精度,对传统单阈值法提出了改进,根据图像的梯度直方图分别选取高低两阈值。但传统Canny算子由于使用基于全图的固定阈值选取方法,容易丢失对比度较低的弱边缘。因此有相关学者提出了一种自适应阈值Canny边缘检测方法。
该方法[10]先利用图像的梯度方差作为判据对图像进行分块,图像上点(i,j)处的梯度幅值为:
(3)
其中:
(4)
设所选的高斯函数G为:
(5)
其中,σ为高斯滤波器参数;f(x,y)为原图像函数。
继而对各子分块采用最大类间方差法[11]分别求得最佳阈值。假设一幅图像灰度值分为0~(l-1)级,灰度值i的像素数为n,则总像素数N及各像素值概率Pi为:
(6)
然后用一整数t将图像中的像素按灰度级划分成两类:C0={0,1,…,t}和C1={t+1,t+2,…,l-1}。
则C0产生的概率ω0及均值μ0为:
(7)
(8)
C1产生的概率ω1及均值μ1为:
(9)
(10)
其中,μ为整体图像灰度的统计均值。
(11)
由上可得类间方差η及最佳阈值t*。
(12)
(13)
其中:
(14)
最后采用插值算法得到最后的自适应阈值分割矩阵。效果见图1。
图1 Canny边缘检测图
对Canny边缘检测后的图像使用概率Hough变换[12-13]。在Hough变换中,图形边缘M每个像素点(xi,yi)被映射到一个代表正弦曲线投票模式的Nθ×Nρ的累加器矩阵,它描绘了一个标准的(θ,ρ)参数平面,代表所有可能通过该像素点的直线,如式15:
ρ=xcosθ+ysinθ
(15)
其中,ρ为离原点的距离;θ为直线的方向。
对应于同一条直线上的所有像素点的正弦曲线在参数空间中交于理想的一个点,这在累加器A(ρ,θ)矩阵中会达到一个峰值。
概率Hough变换采用空间映射和直线检测交替进行的方式,其基本思想是在整个图像空间中随机取点映射,每次映射后检测累加器A(ρ,θ)对应点的数值,当检测到超过特定阈值的直线时,将位于该直线上的所有候选边缘点删除,从而有效地缩小了搜索和计算空间[14]。
对Hough变换得到的直线集合,因为身份证最外围的四条边会出现同一条直线产生断裂的情况,为了接下来找出这四条线的准确性,需要分别对位置在图像上1/5内、下1/5内、左1/5内、右1/5内的直线进行同一条直线的连接处理,具体为:
(1)当一条直线L1在图像右1/5处时,若一条直线L2满足:L2倾斜角度与L1夹角在5度以内;两条直线列间距在3个像素点以内;两条直线行间距在30个像素点以内;两条直线的长度均大于7个像素点,则将两条直线连在一起。
(2)当一条直线L3在图像左1/5处时,若一条直线L4满足:L4倾斜角度与L3夹角在5度以内;两条直线列间距在3个像素点以内;两条直线行间距在30个像素点以内;两条直线的长度均大于7个像素点,则将两条直线连在一起。
(3)当一条直线L5在图像上1/5处时,若一条直线L6满足:L5倾斜角度与L6夹角在5度以内;两条直线行间距在3个像素点以内;两条直线列间距在30个像素点以内;两条直线的长度均大于7个像素点,则将两条直线连在一起。
(4)当一条直线L7在图像下1/5处时,若一条直线L8满足:L7倾斜角度与L8夹角在5度以内;两条直线行间距在3个像素点以内;两条直线列间距在30个像素点以内;两条直线的长度均大于7个像素点,则将两条直线连在一起。
其中,直线两个端点的坐标已知,分别为(x1,y1)和(x2,y2),由直线公式y=kx+b求得直线的斜率k:
k=(y2-y1)/(x2-x1)
(16)
然后由反正切函数公式和直线斜率的绝对值求直线的倾斜角度θ:
θ=arctan(|k|)
(17)
最后直线长度dist由式17可得:
(18)
在连接后的直线集合中,需要找到身份证外围的四条直线。由找到的四条直线求出在预处理后图像中身份证的四个顶点坐标,由缩放比例可得在采集图像中身份证四个顶点的坐标,过程如下:
(1)分别在预处理后图像的上1/5和下1/5内,找到与水平的夹角在0度至20度区间的最长线;
(2)分别在预处理后图像的左1/5和右1/5内,找到与竖直线相交角度在0度到20度区间的最长线;
(3)对求得的四条直线求交点。假设两条直线方程分别为y=k1x+b1和y=k2x+b2,则交点坐标为:((b2-b1)/(k1-k2),(k1b2-k2b1)/(k1-k2))。
以矩形区域的四个角点为例,经过透视变换后A'→A,B'→B,C'→C,D'→D,矩形的形状发生改变。透视投影实质上就是P'平面上的每一点在视角的作用下投影到P平面的过程。若将P平面定义为物体的正视图平面,那么透视变换就是透视投影平面上的每一个像素点变换到正视图上对应的像素点的过程。为了实现透视畸变的校正,只需要找到P平面上的点和物体正视图上对应点的变换公式。
二维图像透视变化公式可以表示为:
(19)
(20)
其中,(x,y)为投影图像的坐标;(u,v)为正视图上的坐标;a,b,c,d,e,f,g,h为畸变参数。
由透视变换[15-16]和采集图像中身份证四个顶点的坐标,在采集图像中分割出宽和高比例在1.49~1.69区间的无背景身份证图像,并且解决图像因采集而产生的图像畸变问题。
根据姓名、性别、身份证号三个信息区域在身份证上位置固定,利用比例坐标,在以上步骤分割出的无背景身份证图像上,分割出含有以上三个信息的矩形区域图像,分割后的结果见图2~4。
图2 姓名信息区域
图3 性别信息区域
以姓名信息区域的字符分割为例,其他部分的字符分割[17-18]同理可得。
对分割出来的采集图像上的姓名区域,先灰度化,再大津阈值二值化。
对二值化后的姓名区域图像进行投影法字符分割,将各个字符分割开,具体过程如下:
(1)先从上到下统计每行像素值为0的像素点个数,即统计每行黑色像素点个数,找到个数为0的行的行号(这一行在图像中的第几行),即找到一行全是白色像素点的行号,如果此时出现连续个数为0的行,则找出连续行号的中间值,由此得到分割行的行号,即得到下一步图像水平分割的分割点;
(2)在姓名区域彩色图像上进行行分割;
(3)对行分割后的二值图,从左到右统计每列像素值为0的像素点个数,找到个数为0的列,如果此时出现连续个数为0的列的列号(这一列为图像中的第几列),则找出连续列号的中间值,由此得到分割列的列号;
(4)在行分割后的姓名区域彩色图像上进行列分割,这样就可以得到姓名区域分割出来的彩色字符图像。分割后的字符图像见图5。
值得注意的是,对于类似“刘”、“小”、“川”这样有内部间隔即容易被分割开的汉字,可以利用字内间距比字间间距小和汉字字体大小固定设定阈值进行分割。
图5 姓名区域分割出的字符图像
实验是在带有1 600万像素摄像的Android手机上进行。使用JNI机制,采用C语言进行算法的程序化,将写好的C源文件用ndk编译成so库以供Java调用。
实验使用扫描身份证的方法进行识别,并且在C源文件中统计身份证字符分割部分所耗费的时间,显示在AndroidStudio中。
一共进行了50组实验。因为汉字分割是字符分割的重难点,所以用手机扫描了50组不一样的身份证,50组姓名中包含了各类汉字,比如汉字是上下结构、左右结构等种类。统计数据得:完成一次身份证字符分割,平均耗费时间为0.4 s,可以看出基于透视变换的手机身份证字符分割速度很快;实验中字符分割基本正确,正确率达到99%。
针对安卓手机上复杂背景中的身份证字符分割,设计了一种基于透视变换的算法,并设计了一种目标区域内连接同一条直线的方法。实验结果表明,该方法具有较为良好的分割能力。另一方面,该方法对全白背景中的身份证字符分割效果较差,还需要进一步的探索。