徐毓凱 楊國平
(上海工程技術(shù)大學機械與汽車工程學院 上海 201620)
隨著社會和互聯(lián)網(wǎng)技術(shù)的飛速發(fā)展,網(wǎng)上銀行已逐漸成為人們?nèi)粘I畈豢苫蛉钡囊徊糠?。移動支付也成為目前社會主流的消費方式[1],比如微信支付、支付寶等。隨之我們會將銀行卡和各種移動支付軟件進行綁定。在實際綁定過程中,目前的常用方式大多還是用戶自己手動輸入銀行卡號碼,然而手動輸入十幾位銀行卡號很慢且容易出錯,并且對部分視力不佳的中老年人很不友好,影響用戶體驗。因此,銀行卡卡號的自動識別功能將會給人們帶來很大的便利。
雖然目前的字符識別技術(shù)發(fā)展已較為成熟,比如文本識別[2~4]、車牌識別等[5~6],但銀行卡識別技術(shù)還沒有廣泛應用于各大移動支付平臺中。針對這一問題和現(xiàn)狀,本文提出了一種基于Sobel算子的銀行卡識別算法。首先用基于Sobel邊緣檢測的方法提取銀行卡輪廓,然后獲取銀行卡卡號的數(shù)字區(qū)域,最后對數(shù)字區(qū)域的銀行卡號進行識別。
Sobel算子是圖像處理中的算子之一[7~10],在影像處理和計算機視覺領(lǐng)域中常被用來做邊緣檢測。Sobel算子最早由美國科學家Irwin Sobel和Gary Feldman于1968年在史丹佛大學的人工智能實驗室(SAIL)提出。為了紀念他們所做的貢獻,用他們的名字命名了該算子。概念上,Sobel算子就是一個小且是整數(shù)的濾波器對整張圖片在水平及垂直方向上做卷積,因此它所需的運算資源相對較少。另一方面,對于圖像中頻率變化較高的地方,它所得的梯度的近似值也比較粗糙。
目前在銀行卡的輪廓提取中較為常用的方法為基于Canny算子的邊緣檢測[11~13],Canny算子的運用場景較多,它其中有很多參數(shù),通過對這些參數(shù)的變化會對算法的性能產(chǎn)生影響。本文的銀行卡輪廓定位利用Sobel算法替代Canny算法。獲取數(shù)字區(qū)域過程中采用增強對比度再利用特定閾值獲取數(shù)字區(qū)域替代了之前Canny算法的邊緣檢測。雖然Sobel算法只能檢測水平和垂直方向的邊緣,對于紋理較為復雜的圖像,其邊緣檢測效果不是很理想,但是對于銀行卡數(shù)字識別來說,邊緣紋理并不是很復雜,用Sobel算子進行邊緣檢測反而計算簡單,速度快。圖1為對原始灰度圖像分別基于Canny算子和Sobel算子所做的邊緣檢測圖。
圖1 Canny和Sobel邊緣檢測比較
Sobel算子做平面卷積的原理按所示方程(1)計算:
分別可得到水平和豎直兩個方向的亮度差分近似值。其公式如下:
其中A是指原圖像,Gx及Gy是指對水平和豎直兩個方向的計算。然后通過式(4)可以對圖像的梯度值進行計算。
一般來說,我們生活中手機識別到的銀行卡都不是直接的灰度圖像(如圖2),圖像處理過程中我們會分別對彩色圖像的三個顏色通道進行處理,計算量會很大且影響識別過程的速度,因此需要對彩色圖像進行灰度處理。如圖3為對彩色銀行卡灰度處理后的圖像。
圖2 彩色銀行卡圖像
圖3 灰度處理圖像
然后我們需要對灰度圖像進行頂帽操作。頂帽運算也被稱為“禮帽”運算,它為原圖像與圖像作“開運算”的結(jié)果圖之差。其中開運算就是對圖像進行先腐蝕后膨脹的過程,一般可以用來對圖像邊緣進行平滑處理,消除一些小的毛刺和干擾。如圖4則為對圖3進行頂帽操作后的圖像。
圖4 頂帽操作后的圖像
頂帽操作之后,我們就會用Sobel算子進行邊緣檢測,由于銀行卡邊緣背景信息比較簡單且具有一定的規(guī)律性,因此本文只對x軸方向進行了Sobel算子邊緣計算得到了待識別銀行卡的輪廓(見圖5),通過后文實驗可以看出只做x軸方向的Sobel計算邊緣檢測效果也比較理想,并且計算簡單,效率高。
圖5 sobel邊緣檢測
通過上文的實驗可以得到銀行卡的輪廓信息,接下來我們需要獲取銀行卡數(shù)字區(qū)域。首先對銀行卡輪廓圖像進行閉操作(先膨脹,再腐蝕)將卡號數(shù)字連在一起(見圖6),然后對圖6進行二值化操作將目標區(qū)域和背景區(qū)別開來(見圖7),接著計算輪廓信息找到圖7中的所有輪廓得到圖8。
圖6 閉操作
圖7 二值化
圖8 目標區(qū)域輪廓
如圖8得到的目標區(qū)域的輪廓我們可以看出已經(jīng)找到的輪廓不僅包含數(shù)字區(qū)域,還包含一些例如銀行名稱,logo等一些干擾區(qū)域輪廓,因此我們需要從中排除這些干擾區(qū)域輪廓,得到只包含卡號數(shù)字的區(qū)域輪廓。經(jīng)過篩選輪廓,我們得到了四組數(shù)字輪廓區(qū)域,如圖9是得到的四組數(shù)字區(qū)域的其中一組。
圖9 數(shù)字區(qū)域
一般而言,銀行卡卡號識別的方法有很多,常用的主要有:模板匹配識別法[14]、神經(jīng)網(wǎng)絡識別法[15]、特征統(tǒng)計匹配識別法等[16]。本文的研究對象一般只有十幾位的阿拉伯數(shù)字,且每個數(shù)字0~9之間選擇,分布具有很強的規(guī)律,且本文考慮的情況需要快速的識別出銀行卡號信息,所以采用模板匹配字符識別法。
第一步要建立一個模版。首先導入一個包含0~9數(shù)字模板的圖像(圖10),將圖像分別進行灰度處理和二值化(圖11),然后找到圖像的所有輪廓,遍歷每一個輪廓,每一個數(shù)字輪廓對應每一個模板(圖12)。
圖10 包含模板數(shù)字圖像
圖11 灰度化及二值化
圖12 數(shù)字模板
第二步將待檢測銀行卡數(shù)字區(qū)域的每一個數(shù)字輪廓與第一步的10個數(shù)字模板分別比較,計算每一個待檢測數(shù)字與每一個模板的匹配得分,得分最高的模板即為待識別數(shù)字的正確模板。最終識別的結(jié)果如圖13所示。
圖13 識別結(jié)果
隨著互聯(lián)網(wǎng)和移動支付技術(shù)的飛速發(fā)展,本文的研究對象也有著廣泛的應用前景。目前對銀行卡號識別的相關(guān)文獻和參考資料非常少,一些開發(fā)出銀行卡號識別技術(shù)的公司其識別技術(shù)及方法均未公開,銀行卡號的識別技術(shù)研究依然具有一定的實用性。
本文在現(xiàn)有的常用的銀行卡號識別技術(shù)上做了一些改善,將常用的Canny邊緣檢測方法改為了只做x軸方向的Sobel邊緣檢測,檢測結(jié)果差別不大,但是計算簡單,提高了識別過程中圖像預處理的效率。另外,針對銀行卡號具有固定字體的規(guī)律,使用模板匹配法對數(shù)字進行識別,也一定程度上節(jié)省了時間。與此同時,本文在一些方面仍有不足,需要進一步的改進。例如銀行卡圖像數(shù)據(jù)庫涉及到個人隱私問題,本文并沒有對大量真實的銀行卡進行驗證。另外,在識別過程中沒有考慮銀行卡使用過程中的磨損問題,實驗對象采取的只是比較理想的圖像。雖然本文具有一定的不足,但是仍為銀行卡號識別提供了一定的參考意義。