李志杰,袁鵬泰,李博涵
(1.南京航空航天大學 計算機科學與技術學院,江蘇 南京 211106;2.江蘇易圖地理信息科技股份有限公司,江蘇 揚州 225009)
我國的居民身份證記載了每位公民的個人基本信息,包括姓名、性別、民族、出生年月日、住址和唯一的身份證編號。不僅是基于社會治安的需要和個人權益的保障,而且在人才招聘等場合也需要輸入公民身份證信息。
隨著攜帶高清攝像頭的安卓手機越來越普及,研究采用基于帶攝像頭的安卓手機拍攝圖像的身份證識別系統(tǒng),可讓使用成本更低、運用更加靈活。
數(shù)字圖像處理和模式識別技術在安卓手機上應用廣泛,其中就包括身份證的自動識別。這使得身份證的信息獲取從人工識別轉化為自動識別。目前身份證信息大多需要人工錄入和手工填寫,效率十分低下,錄入和填寫信息時可能發(fā)生錯誤,而且長時間的識別也會使人眼疲勞。所以,該方法已經不適應當今智能手機等領域飛速發(fā)展的現(xiàn)狀。研究安卓手機如何自動讀取身份證信息是十分必要的,不僅可以有效克服人工識別的局限性,而且具有識別效率高、識別準確度高的優(yōu)點。
在身份證識別系統(tǒng)[1]中,采集到的含有身份證的圖像很可能會同時存在以下一種或幾種問題:除了身份證之外的背景與身份證的邊緣不明顯;身份證不是一個寬和高比例固定的矩形;身份證上有反光等光照影響;采集圖像上有噪聲。從復雜背景中分割出無畸變的身份證字符圖像[2-4]是關鍵環(huán)節(jié),決定了身份證識別系統(tǒng)的識別速度與正確率。對此,文中提出了一套完整的身份證圖像分割和字符分割方法。
通過安卓手機掃描采集到的圖像是像素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]。
為了降低硬件資源的消耗,該設計采用線性插值法進行圖像縮放。線性插值法就是根據(jù)待插值位置周圍最近的幾個像素來計算插值,對于平面圖像來說,共有四點。其中插值計算公式為:
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均為非負整數(shù),分別表示像素的橫縱坐標位置;u、v∈[0,1]分別表示插值位置與(i,j)的相對位置;f(i,j)表示圖像(i,j)位置的像素值。
中值濾波(median filter)是一種基于排序統(tǒng)計理論的能有效抑制噪聲的非線性信號處理技術。它是一種常用的非線性平滑濾波和鄰域運算,類似于卷積,但不是加權求和計算,基本原理是把鄰域中的像素按灰度等級進行排序,然后選擇該組的中間值作為輸出像素值,讓周圍的像素值不變,從而消除孤立的噪聲點。鄰域通常為3*3,5*5區(qū)域,可以是不同的形狀,如線狀、圓形、十字形、圓環(huán)形等。
中值濾波對脈沖噪聲有良好的濾除作用,特別是在濾除噪聲的同時,能夠保護信號的邊緣,使之不被模糊。中值濾波的算法比較簡單,也易于用硬件實現(xiàn)。這些優(yōu)良特性是線性濾波方法不具有的。中值濾波在圖像處理中常用于保護邊緣信息,是經典的平滑噪聲的方法。
在眾多經典邊緣檢測[9]方法中選擇Canny邊緣檢測算子,是因為相比傳統(tǒng)的微分算子,如Robets、Prewwit、Sobel、Laplace、Log等,基于最優(yōu)化算法的Canny邊緣檢測算子具有較好的信噪比和檢測精度,對傳統(tǒng)單閾值法提出了改進,根據(jù)圖像的梯度直方圖分別選取高低兩閾值。但傳統(tǒng)Canny算子由于使用基于全圖的固定閾值選取方法,容易丟失對比度較低的弱邊緣。因此有相關學者提出了一種自適應閾值Canny邊緣檢測方法。
該方法[10]先利用圖像的梯度方差作為判據(jù)對圖像進行分塊,圖像上點(i,j)處的梯度幅值為:
(3)
其中:
(4)
設所選的高斯函數(shù)G為:
(5)
其中,σ為高斯濾波器參數(shù);f(x,y)為原圖像函數(shù)。
繼而對各子分塊采用最大類間方差法[11]分別求得最佳閾值。假設一幅圖像灰度值分為0~(l-1)級,灰度值i的像素數(shù)為n,則總像素數(shù)N及各像素值概率Pi為:
(6)
然后用一整數(shù)t將圖像中的像素按灰度級劃分成兩類:C0={0,1,…,t}和C1={t+1,t+2,…,l-1}。
則C0產生的概率ω0及均值μ0為:
(7)
(8)
C1產生的概率ω1及均值μ1為:
(9)
(10)
其中,μ為整體圖像灰度的統(tǒng)計均值。
(11)
由上可得類間方差η及最佳閾值t*。
(12)
(13)
其中:
(14)
最后采用插值算法得到最后的自適應閾值分割矩陣。效果見圖1。
圖1 Canny邊緣檢測圖
對Canny邊緣檢測后的圖像使用概率Hough變換[12-13]。在Hough變換中,圖形邊緣M每個像素點(xi,yi)被映射到一個代表正弦曲線投票模式的Nθ×Nρ的累加器矩陣,它描繪了一個標準的(θ,ρ)參數(shù)平面,代表所有可能通過該像素點的直線,如式15:
ρ=xcosθ+ysinθ
(15)
其中,ρ為離原點的距離;θ為直線的方向。
對應于同一條直線上的所有像素點的正弦曲線在參數(shù)空間中交于理想的一個點,這在累加器A(ρ,θ)矩陣中會達到一個峰值。
概率Hough變換采用空間映射和直線檢測交替進行的方式,其基本思想是在整個圖像空間中隨機取點映射,每次映射后檢測累加器A(ρ,θ)對應點的數(shù)值,當檢測到超過特定閾值的直線時,將位于該直線上的所有候選邊緣點刪除,從而有效地縮小了搜索和計算空間[14]。
對Hough變換得到的直線集合,因為身份證最外圍的四條邊會出現(xiàn)同一條直線產生斷裂的情況,為了接下來找出這四條線的準確性,需要分別對位置在圖像上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(tǒng)=kx+b求得直線的斜率k:
k=(y2-y1)/(x2-x1)
(16)
然后由反正切函數(shù)公式和直線斜率的絕對值求直線的傾斜角度θ:
θ=arctan(|k|)
(17)
最后直線長度dist由式17可得:
(18)
在連接后的直線集合中,需要找到身份證外圍的四條直線。由找到的四條直線求出在預處理后圖像中身份證的四個頂點坐標,由縮放比例可得在采集圖像中身份證四個頂點的坐標,過程如下:
(1)分別在預處理后圖像的上1/5和下1/5內,找到與水平的夾角在0度至20度區(qū)間的最長線;
(2)分別在預處理后圖像的左1/5和右1/5內,找到與豎直線相交角度在0度到20度區(qū)間的最長線;
(3)對求得的四條直線求交點。假設兩條直線方程分別為y=k1x+b1和y=k2x+b2,則交點坐標為:((b2-b1)/(k1-k2),(k1b2-k2b1)/(k1-k2))。
以矩形區(qū)域的四個角點為例,經過透視變換后A'→A,B'→B,C'→C,D'→D,矩形的形狀發(fā)生改變。透視投影實質上就是P'平面上的每一點在視角的作用下投影到P平面的過程。若將P平面定義為物體的正視圖平面,那么透視變換就是透視投影平面上的每一個像素點變換到正視圖上對應的像素點的過程。為了實現(xiàn)透視畸變的校正,只需要找到P平面上的點和物體正視圖上對應點的變換公式。
二維圖像透視變化公式可以表示為:
(19)
(20)
其中,(x,y)為投影圖像的坐標;(u,v)為正視圖上的坐標;a,b,c,d,e,f,g,h為畸變參數(shù)。
由透視變換[15-16]和采集圖像中身份證四個頂點的坐標,在采集圖像中分割出寬和高比例在1.49~1.69區(qū)間的無背景身份證圖像,并且解決圖像因采集而產生的圖像畸變問題。
根據(jù)姓名、性別、身份證號三個信息區(qū)域在身份證上位置固定,利用比例坐標,在以上步驟分割出的無背景身份證圖像上,分割出含有以上三個信息的矩形區(qū)域圖像,分割后的結果見圖2~4。
圖2 姓名信息區(qū)域
圖3 性別信息區(qū)域
以姓名信息區(qū)域的字符分割為例,其他部分的字符分割[17-18]同理可得。
對分割出來的采集圖像上的姓名區(qū)域,先灰度化,再大津閾值二值化。
對二值化后的姓名區(qū)域圖像進行投影法字符分割,將各個字符分割開,具體過程如下:
(1)先從上到下統(tǒng)計每行像素值為0的像素點個數(shù),即統(tǒng)計每行黑色像素點個數(shù),找到個數(shù)為0的行的行號(這一行在圖像中的第幾行),即找到一行全是白色像素點的行號,如果此時出現(xiàn)連續(xù)個數(shù)為0的行,則找出連續(xù)行號的中間值,由此得到分割行的行號,即得到下一步圖像水平分割的分割點;
(2)在姓名區(qū)域彩色圖像上進行行分割;
(3)對行分割后的二值圖,從左到右統(tǒng)計每列像素值為0的像素點個數(shù),找到個數(shù)為0的列,如果此時出現(xiàn)連續(xù)個數(shù)為0的列的列號(這一列為圖像中的第幾列),則找出連續(xù)列號的中間值,由此得到分割列的列號;
(4)在行分割后的姓名區(qū)域彩色圖像上進行列分割,這樣就可以得到姓名區(qū)域分割出來的彩色字符圖像。分割后的字符圖像見圖5。
值得注意的是,對于類似“劉”、“小”、“川”這樣有內部間隔即容易被分割開的漢字,可以利用字內間距比字間間距小和漢字字體大小固定設定閾值進行分割。
圖5 姓名區(qū)域分割出的字符圖像
實驗是在帶有1 600萬像素攝像的Android手機上進行。使用JNI機制,采用C語言進行算法的程序化,將寫好的C源文件用ndk編譯成so庫以供Java調用。
實驗使用掃描身份證的方法進行識別,并且在C源文件中統(tǒng)計身份證字符分割部分所耗費的時間,顯示在AndroidStudio中。
一共進行了50組實驗。因為漢字分割是字符分割的重難點,所以用手機掃描了50組不一樣的身份證,50組姓名中包含了各類漢字,比如漢字是上下結構、左右結構等種類。統(tǒng)計數(shù)據(jù)得:完成一次身份證字符分割,平均耗費時間為0.4 s,可以看出基于透視變換的手機身份證字符分割速度很快;實驗中字符分割基本正確,正確率達到99%。
針對安卓手機上復雜背景中的身份證字符分割,設計了一種基于透視變換的算法,并設計了一種目標區(qū)域內連接同一條直線的方法。實驗結果表明,該方法具有較為良好的分割能力。另一方面,該方法對全白背景中的身份證字符分割效果較差,還需要進一步的探索。