談談計算機圖像識別技術之身份證號碼識別

作者:劉常軍(2014-1-21)
 
  前兩天看到一篇文章,說支付寶錢包的iOS版和Android版已經升至8.0,只要通過攝像頭對準銀行卡進行掃描,支付寶錢包就可以自動識別銀行卡號碼(http://www.chinaz.com/mobile/2014/0113/335323.shtml)。剛好前一陣子我在研究第二代身份證號碼的圖像識別技術,並且已經使用C#完美實現。因此,我猜測支付寶錢包的銀行卡號碼識別技術在具體實現細節或者模板匹配方面可能會更復雜一些,但在識別原理和識別步驟方面應該是大同小異,所以我在這裏談談我已實現的身份證號碼識別技術,跟朋友們共同切磋。下一步時間充裕的話,我可能會做進一步的擴展,以實現對更多對象的圖像識別。
 
 
 
  計算機圖像識別技術,是指利用計算機的高速計算能力對圖像進行自動處理、分析和理解,以識別出圖像中的關鍵信息並加以利用的技術。計算機圖像識別技術,有很多具體的門類和應用,例如身份證號碼識別、銀行卡號碼識別、名片識別、車牌識別、網站驗證碼識別等等,這些都是計算圖像識別技術在某一領域的具體應用。雖然應用場景不同,但識別的原理和技術是相通的。掌握了圖像識別的技術原理,並針對某一具體應用場景進行專門的優化,就可以開發出相應的識別軟件。
 
  下面我以身份證號碼識別技術爲例來說明計算機圖像識別技術的原理和步驟。
 
  (一)圖像採集
  首先我們要取得待識別的圖像。這項工作可以通過數碼相機、DV機、工業攝像機、電腦數字攝像頭、手機攝像頭等設備採集視頻,並從視頻流中取得我們要分析的圖像信息。
 
  (二)版面分析
  取得圖像信息後,要對圖像整體版面進行分析。這一步工作如果使用通用算法進行分析,則效率很低。通常情況下都需要針對不同的識別對象進行專門的分析及設定,才能取得良好的分析效果。例如我們要對身份證進行分析,就需要根據身份證的大小、寬高比例進行預先設定,這樣程序才能夠明顯區分出來當前圖像裏所拍的究竟是不是身份證。比如攝像頭所拍攝的對象不是身份證,而是一張普通A4紙張,那麼程序就可以很輕易的通過寬高比例將其排除。
  此外,計算機識別出圖像中的身份證後,僅僅是版面識別的第一步。接下來,系統還要根據已知的身份證中的姓名、性別、地址、照片、身份證號等各項指標所在的位置(通常以左上角頂點的座標爲標識)和範圍(通常以其寬、高爲標識),將其作爲一個個的矩形標註在系統配置文件中。這樣,如果用戶想要識別身份證號,那麼系統就可以根據預定義的版面數據直接去圖像中,將包含身份證號的那個矩形區域的圖像“摳出來”,看上去就是一個包含有18個字符的長條形圖像,對它再進行下一步的分析處理。
 
  (三)圖像灰度化
  從視頻採集設備裏取得的圖像通常都是彩色圖像,爲了使所分析的圖像數據簡化,並且不丟失關鍵信息,需要對圖像進行灰度化處理。
  通常,計算機圖像是由一個一個的像素點構成(矢量圖除外),每個像素點用RGB模型來標記其顏色。在RGB模型中,如果R=G=B時,則該顏色就表示是一種灰度顏色,其中R=G=B的值叫灰度值,因此,灰度圖像每個像素只需一個字節存放灰度值(又稱強度值、亮度值),灰度範圍爲0-255。
  一般有以下四種方法對彩色圖像進行灰度化: 
  1、分量法。將彩色圖像中的三分量的亮度作爲三個灰度圖像的灰度值,可根據應用需要選取一種灰度圖像。
  計算公式爲:f1(i,j)=R(i,j) f2(i,j)=G(i,j)f3(i,j)=B(i,j)  其中fk(i,j)(k=1,2,3)爲轉換後的灰度圖像在(i,j)處的灰度值。
  2、最大值法。將彩色圖像中的三分量亮度的最大值作爲灰度圖的灰度值。 
  計算公式爲:f(i,j)=max(R(i,j),G(i,j),B(i,j))
  3、平均值法。將彩色圖像中的三分量亮度求平均得到一個灰度值。 
  計算公式爲:f(i,j)=(R(i,j)+G(i,j)+B(i,j)) /3
  4、加權平均法:根據重要性及其它指標,將三個分量以不同的權值進行加權平均。由於人眼對綠色的敏感最高,對藍色敏感最低,因此,按下式對RGB三分量進行加權平均能得到較合理的灰度圖像:f(i,j)=0.30R(i,j)+0.59G(i,j)+0.11B(i,j))。
  在進行身份證號碼識別時,通常採取第4種方法加權平均法對彩色圖像進行灰度化。
 
  (四)圖像二值化
  灰度化是壓縮圖像數據的第一步,接下來要對灰度圖像進行二值化處理。具體做法就是,首先對256個亮度等級的灰度圖像進行計算,取得一個適當的閾值;其次對灰度化圖像進行處理,所有灰度大於或等於閾值的像素被判定爲屬於特定物體,其灰度值用255表示,否則這些像素點被排除在物體區域以外,灰度值爲0,代表背景或者例外的物體區域。
  完成這一步驟之後,灰度化圖像被進一步壓縮爲二值化圖像,每一像素點非黑即白,沒有其他任何顏色。只要閾值選取合適,二值化圖像仍然可以反映圖像整體和局部特徵,有利於圖像的進一步處理,使圖像變得簡單,而且數據量減小,能凸顯出感興趣的目標的輪廓。
 
  (五)圖塊切割
  經過了前面的灰度化及二值化後,彩色圖像被壓縮爲黑白二色圖像。這時就要進行一個關鍵操作,就是圖塊切割。在這裏以身份證號碼識別爲例,圖塊切割的含義就是將一個包含有18位數字(最後一位有可能是字母X)的長條形圖像,切割爲18個小圖塊,每個小圖塊內只包含一個數字(或字母X)。
  我們從身份證上可以看到,構成身份證號碼的18個字符之間有空隙不粘連,並且高度相等、寬度近似。根據這個特徵,就可以對長條形圖像橫向掃描,計算每一列上黑色像素點的個數(即構建通常所說的直方圖)。在從左向右橫向掃描過程中,黑色像素不爲0,並且連續的列,都可以看作是一個字符的一部分。一旦遇到某列的黑色像素點個數爲0,則代表前面那個字符已經結束,跨過這些黑色像素點爲0的列,從下一個黑色像素點個數不爲0的列開始就可以視爲下一個字符的開始。以此類推,就可以找出所有字符的左邊界和右邊界。然後再進行縱向掃描,在每個字符的左右邊界中,計算黑色像素點的最小座標和最大座標,這樣每個字符的上下邊界也就計算出來了。
  至此,所有字符的上下左右四個邊界全部得到,那麼這四條邊界線圍起來的圖像區域,就是我們要切割的小圖塊。
 
  (六)字符識別
  將每個小圖塊依次送入這一環節進行字符識別,就可以得到最終結果。
  這一環節的字符識別運算包含兩個步驟。
  一是歸一化。歸一化的目的是將所有小圖塊轉換爲相同大小的圖像。前面說了,身份證號碼中的字符寬度只是近似相同,並不一定完全相同。可以比較明顯的看出來,數字“1”比數字“0”或“8”要窄的多,所以爲了能夠使用模板進行統一匹配,需要將每個字符圖塊轉換爲相同大小。以身份證號碼識別爲例,我們可以將每個小圖塊固定設爲寬8像素、高16像素。
  二是模板匹配。既然是用模板匹配技術來實現圖像和字符的匹配,那麼首先得有模板。每個字符就是一個模板。根據身份證號碼的取值規則,我們可以預先將數字0-9及字母X總共11個字符的模板設好,每個字符模板是一個數組,包含8*16=128個元素。每個元素代表一個像素點,每個元素的取值爲0和1兩項,0代表白色像素點、1代表黑色像素點。這樣,在進行模板匹配的時候,首先把每個小圖塊的8*16個像素點,按照其顏色(黑與白)轉換爲一個包含128個元素的數組,然後用這個數組依次與預設的11個模板數組進行按位對比,找出含有相同元素值最多的那一個模板數組,這就是當前圖塊的最終識別結果。
  全部18個小圖塊都識別出來以後,整個身份證號碼也就識別出來了。 
發佈了13 篇原創文章 · 獲贊 2 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章