當前位置:
首頁 > 知識 > 如何使用(opencv/python)來實現OCR處理銀行票據?

如何使用(opencv/python)來實現OCR處理銀行票據?

今天我們來介紹一下如何使用(opencv/python)來實現OCR處理銀行票據。文末有代碼和相關文檔下載!

在第一部分中,我們將討論兩個主題:

1.首先,我們將了解MICR E-13B字體,美國,英國,加拿大等國家用於支票上都是使用的這種字體。

2.其次,我們將討論如何從MICR E-13B參考圖像中提取數字和符號。這將使我們能夠提取每個字元的ROI,然後將其用於OCR銀行支票。

MICR E-13B 字體:

如何使用(opencv/python)來實現OCR處理銀行票據?

MICR(磁墨字元識別)是處理文件的金融工業技術。

MICR的E-13B變體包含14個字元:

·數字:數字0-9。

·?過境:銀行分行分隔。

·?金額:交易金額分隔符。

·?在我們:客戶帳號分隔符。

·?dash:數字分隔符(例如路由和帳號之間)。

銀行支票字元識別看起來更難:

如何使用(opencv/python)來實現OCR處理銀行票據?

在銀行支票上使用的MICR E-13B字體中,數字有一個輪廓。但是,控制符號對於每個角色具有三個輪廓,使任務稍微更具挑戰性。我們不能使用簡單的輪廓和邊框方法。相反,我們需要設計自己的方法來可靠地提取數字和符號。

用OpenCV提取MICR數字和符號:

創建一個新的文件,命名為bank_check_ocr.py,並插入以下代碼:

# import the necessary packagesfrom skimage.segmentation import clear_border

首先我們先導入各種我們需要的包,以確保程序的正確運行

·OpenCV:從此頁面選擇適合您系統的安裝版本。

·scikit-image:這是通過pip安裝的,pip install-Uscikit-image

·numpy :通過 pip install numpy。

·imutils:這是可以通過 pip 安裝:pip install--upgrade imutils。

接著我們來構建一個從MICR字體中提取字元的函數:

def extract_digits_and_symbols(image, charCnts, minW=5, minH=15):

對於初學者,我們的功能需要4個參數:

·image:MICR E-13B字體圖像(代碼下載中提供)。

·charCnts:包含參考圖像中的字元輪廓的列表。

·minW:表示最小字元寬度的可選參數。默認值為5像素寬度。

·minH:最小字元高度。默認值為15像素。

接著我們初始化我們的charCnts列表的迭代器。列表對象本質上是「可迭代的」,意味著__iter__方法是由生成器完成的。

最後初始化空列表以保存我們的rois(感興趣的區域)和loc(ROI位置)。我們將在函數結尾的一個元組中返回這些列表。

我們開始循環,看一下迭代器的工作原理:

while True:

在我們的函數中,我們開始一個無限循環,我們的退出條件是當我們捕獲StopIterator異常時。為了捕獲這個異常,我們需要設置try-catch塊。對於循環的每次迭代,我們通過調用next(charIter)來獲取下一個字元輪廓。從這個函數調用,我們可以提取矩形的(x,y)坐標和寬度/高度。接著我們初始化一個roi,我們將在短時間內存儲字元圖像。

接下來,我們將檢查我們的邊框寬度和高度的大小,並採取相應的措施:

if cW >= minW and cH >= minH:

如果字元計數器的尺寸分別大於或等於最小寬度和高度,我們採取以下措施:

1.使用我們的邊界矩形調用的坐標和width / height從圖像中提取roi。將roi添加到rois。

3.向locs附加一個元組。該元組由矩形的兩個角的(x,y)坐標組成。稍後我們將返回這個位置列表。

否則,我們假設我們正在使用MICRE-13B字元符號,需要應用更高級的一組處理操作:

else:

if-else的else塊具有分析包含在MICR E-13B字體中的多個輪廓的特殊符號的邏輯。我們做的第一件事就是建立符號的部分。正如我們需要知道一個具有一個輪廓角色的邊框,我們需要知道包含三個輪廓的角色的邊框。為了實現這一點,通過sYB初始化四個邊界框參數sXA。

現在我們將循環遍歷表示一個字元/符號的部分列表。使用邊界矩形參數,我們比較和計算與先前值相關的最小值和最大值。這是我們首先通過sYB將sXA初始化為正/負無限值的原因。

現在我們已經找到了圍繞符號的框的坐標,我們從圖像中提取出roi,將roi附加到rois,並將框坐標元組附加到locs

我們函數的剩餘代碼塊處理我們的while循環退出條件和return語句。

Except StopIteration:

如果在charIter(我們的iterator對象)上調用next來拋出一個StopIteration異常,那麼說明我們已經到達了最後一個輪廓。

現在我們已經準備好解析命令行參數並繼續執行腳本:

ap = argparse.ArgumentParser()

在上面的代碼中,我們建立了兩個必需的命令行參數:

·- image:我們的查詢圖像。

·- reference:我們的參考MICR E-13B字體圖像。

接下來,我們將為每個符號/字元創建「名稱」,並將其存儲在列表中。

charNames = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "T", "U", "A", "D"]

上面的代碼很簡單,我們只是在參考圖像中從左到右建立了我們遇到的符號的名稱。

注意:由於OpenCV不支持unicode中的繪圖字元,因此需要定義「T」表示transit,「U」表示「on-us」,「A」表示amount,「D」表示dash。

接下來,我們將參考圖像載入到內存中,並執行一些預處理:

ref = cv2.imread(args["reference"])ref = cv2.cvtColor(ref, cv2.COLOR_BGR2GRAY)ref = imutils.resize(ref, width=400)ref = cv2.threshold(ref, 0, 255, cv2.THRESH_BINARY_INV |cv2.THRESH_OTSU)[1]

在上面的代碼中,我們完成了四個任務:

1.載入圖像到存儲器中作為參考。

2.圖片轉換為灰度級。

3.調整width=400。

4.使用Otsu方法的二進位逆閾值。

這些簡單操作的結果可以在下圖中看到:

如何使用(opencv/python)來實現OCR處理銀行票據?

其餘的代碼遍歷分為兩部分。首先,我將向您展示一個邏輯和簡單的輪廓方法以及生成的圖像。

然後,我們將繼續使用更高級的方法,利用我們在腳本頂部寫的函數extract_digits_and_symbols。

對於這兩個部分,我們將使用一些常見的數據,包括ref(參考圖像,我們剛剛預處理的)和refCnt(參考輪廓,我們即將提取)。

refCnts = cv2.findContours(ref.copy(), cv2.RETR_EXTERNAL,

要從參考圖像中提取輪廓,我們利用OpenCV的cv2 .findContours函數

接下來,我們要繪製圖像,所以我們將所有頻道複製到上稱為克隆的圖像。在顯示結果之前,簡單輪廓方法的最後一步是循環遍歷排序輪廓。在這個循環中,我們計算每個輪廓的邊界框,然後在其周圍繪製一個矩形。通過顯示圖像顯示結果並在此處暫停直到按下一個鍵參見圖4

如何使用(opencv/python)來實現OCR處理銀行票據?

你看到這種方法的問題嗎?問題是我們有22個邊框,而不是所需的14個邊界輪廓(每個角色一個)。顯然,這個問題可以通過更先進的方法來解決。

更先進的方法如下所示和描述

(refROIs, refLocs) = extract_digits_and_symbols(ref, refCnts,

我們初始化一個空字典,chars,它將保存每個符號的name和roi。我們通過用新的ref副本覆蓋clone圖像來執行此操作(以擺脫剛剛繪製的矩形)。

最後在for循環的主體中,首先我們為clone圖像中的每個角色繪製一個矩形。

其次,我們調整roi到36像素和從詞典的roi和name的鍵值對,更新我們的chars。最後一步(主要用於調試/開發目的)是在屏幕上顯示每個roi,直到按下一個鍵。所產生的「更好的方法」圖像顯示在屏幕,直到按下一個鍵,並且結束了我們的腳本。

數字和符號提取結果:

現在我們已經編碼了我們的MICR E-13B數字和符號提取器,讓我們試一試。

從那裡執行以下腳本:

$ python bank_check_ocr.py --image example_check.png

總結

我們可以看到OCR的銀行支票比OCR的信用卡更難識別,主要是由於銀行支票符號由多個部分組成。我們不能假設我們的引用字體圖像中的每個輪廓映射到一個單獨的角色。

相反,我們需要插入額外的邏輯來檢查每個輪廓的尺寸,並確定我們正在檢查數字或符號。在我們找到一個符號的情況下,我們需要抓住下兩個輪廓來構建我們的邊界框(因為銀行檢查控制字元由三個不同的部分組成)。

希望上述的介紹能夠幫助到你!

本文由北郵@愛可可-愛生活老師推薦,@阿里云云棲社區組織翻譯。

文章原標題《Bank check OCR with OpenCV and Python | PyImageSearch》

作者:Adrian Rosebrock譯者:袁虎

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 雲棲社區 的精彩文章:

金融安全資訊精選 2017年第一期:雲戰略下的安全思維轉型與新認知
私人定製——使用深度學習Keras和TensorFlow打造一款音樂推薦系統
分散式HTAP資料庫PetaData——OLTP與OLAP一站式解決方案
全面連接困何處,卷積網路見解深(深度學習入門系列之九)
獨家:阿里巴巴DevOps落地實踐玩法及思路解析

TAG:雲棲社區 |

您可能感興趣

銀行票據大案頻發,區塊鏈能做什麼?