在今天的博文中,我將演示如何使用模板匹配作為OCR的一種形式來幫助我們創建一個自動識別信用卡並從圖像中提取相關信用卡數位的解決方案。
今天的博文分為三部分。
在第一部分中,我們將討論OCR-A字體,這是一種專門用於輔助光學字符識別算法的字體。
然后,我們將設計一個計算機視覺和圖像處理算法,可以:
本地化信用卡上四位數字的四組。
提取這四個組中的每一個,然后單獨分割十六個數字中的每一個。
通過使用模板匹配和OCR-A字體識別十六張信用卡數字中的每一個。
最后,我們將看一些將我們的信用卡OCR算法應用於實際圖像的示例。
首先給大家看下什么是OCR-A字體:
盡管現代OCR系統不需要專門的字體(如OCR-A),但仍被廣泛應用於身份證,報表和信用卡。
下面給出具體的教程:
1. OCR通過模板匹配與OpenCV結合
在本節中,我們將使用Python + OpenCV實現我們的模板匹配算法,以自動識別信用卡數字。
為了實現這一點,我們需要應用一些圖像處理操作,包括閾值,計算梯度幅度表示,形態運算和輪廓提取。
由於應用了許多圖像處理操作來幫助我們檢測和提取信用卡數字,因此當輸入圖像通過我們的圖像處理流程時,我已經包含了大量的輸入圖像中間截圖。
首先,打開新建一個文件,命名為:ocr_template_match.py,插入下列代碼:
要安裝/升級imutils,只需使用pip:
$ pip install --upgrade imutils
現在我們已經安裝並導入了包,我們可以解析我們的命令行參數:
兩個必需的命令行參數是:
- 圖像:圖像的路徑為OCR'd。
- 參考:參考OCR-A圖像的路徑。 該圖像包含OCR-A字體中的數字0-9,從而允許我們稍后在管道中執行模板匹配。
接下來我們來定義信用卡類型:
我們通過加載參考OCR-A圖像開始我們的圖像處理流水線:
圖4顯示了這些步驟的結果。
現在我們在OCR-A字體圖像上找到輪廓:
現在,我們應該循環瀏覽輪廓,提取ROI並將其與相應的數字相關聯:
在這一點上,我們完成了從參考圖像中提取數字,並將它們與相應的數字名稱相關聯。
我們的下一個目標是在輸入圖像中隔離16位數的信用卡號。 我們需要找到並隔離數字,才能啟動模板匹配來識別每個數字。 這些圖像處理步驟是非常有趣和有見地的。
我們繼續初始化幾個構造核函數的結構:
現在讓我們准備我們要去OCR的圖像:
我們來看看我們的輸入圖像:
隨后我們調整大小和灰度級操作:
現在我們的形象是灰色的,大小一致,我們來進行一個形態的操作:
頂帽操作可以在下面的結果圖中看到黑暗背景下的亮區(即信用卡號)。
給定我們的tophat圖像,我們來計算沿x方向的漸變:
結果如下圖所示:
讓我們繼續改進信用卡數位查找算法:
這些步驟的結果如下所示:
接下來,我們找到輪廓並初始化數字分組位置列表。
現在讓我們循環瀏覽輪廓,同時根據每個輪廓的寬高比進行過濾,從而使我們從信用卡的其他不相關的區域修剪數字組的位置:
以下圖片顯示了我們發現的分組 - 為了演示的目的,我讓OpenCV在每個組周圍繪制一個邊框:
接下來,我們將從左到右對分組進行排序,並初始化信用卡數位列表:
現在我們知道每個四位數字的位置,讓我們循環四個排序的分組,並確定其中的數字。
這個循環很長,被分解成三個代碼塊 - 這是第一個塊:
以下顯示的是一組已被提取的組:
讓我們用一個嵌套循環繼續循環來做模板匹配和相似性分數提取:
最后,我們圍繞每個組繪制一個矩形,並以紅色文字查看圖像上的信用卡號碼:
要了解腳本操作是如何的,我們將結果輸出到終端,並在屏幕上顯示我們的圖像。
花一點時間來祝賀你 - 你做到了最后。 要重寫(在高級別),這個腳本:
1)在字典中存儲信用卡類型。
2)獲取參考圖像並提取數字。
3)在字典中存儲數字模板。
4)本地化四個信用卡號碼組,每個號碼組分為四位數字(共十六位數字)。
5)提取要匹配的數字。
6)對每個數字執行模板匹配,將每個單獨的ROI與每個數字模板0-9進行比較,同時存儲每次嘗試匹配的分數。
7)找到每個候選人數字的最高分數,並構建一個名為output的列表,其中包含信用卡號碼。
8)將信用卡號和信用卡類型輸出到我們的終端,並將輸出圖像顯示在我們的屏幕上。
現在是時候看到腳本運行,並檢查我們的結果。
2. 信用卡OCR系統展示結果
現在我們已經實現了我們的信用卡OCR系統,讓我們來看一下。(源代碼在下文的原文鏈接中,直接到“Downloads”模塊下填入郵箱后獲取)
我們顯然不能使用真實的信用卡號碼,所以我收集了一些使用Google的信用卡示例圖。 這些信用卡顯然是假的,僅供演示用途。
但是,您可以在此博客中應用相同的技術來識別實際的真實信用卡上的數字。
要查看我們的信用卡OCR系統的操作,打開一個終端並執行以下命令:
$ python ocr_template_match.py --reference ocr_a_reference.png \
我們的第一個結果圖像,100%正確:
請注意,只需通過檢查信用卡號碼中的第一位數字即可將信用卡正確標記為萬事達卡。
現在,你已經完成了OCR識別信用卡了,是不是很激動。
最后我們來總結一下:
在本教程中,我們學習了如何使用OpenCV和Python使用模板匹配來執行光學字符識別(OCR)。
具體來說,我們應用了我們的模板匹配OCR方法來識別信用卡的類型以及16個信用卡數字。
為了實現這一點,我們將圖像處理流程分為四個步驟:
1)通過各種圖像處理技術檢測信用卡上的四組數字,包括形態運算,閾值和輪廓提取。
2)從四個分組中提取每個單個數字,導致需要分類的16位數字。
3)通過將模板匹配與OCR-A字體進行比較,以獲得我們的數字分類,將模板匹配應用於每個數字。
4)檢查信用卡號碼的第一位,以確定發行公司。
在評估我們的信用卡OCR系統后,我們發現它是100%准確的,只要發卡信用卡公司使用OCR-A字體的數字。
要擴展此應用程序,您將需要在野外收集信用卡的真實圖像,並可能通過標准特征提取或訓練或卷積神經網絡來訓練機器學習模型,以進一步提高該系統的准確性。
附上原文鏈接:https://www.pyimagesearch.com/2017/07/17/credit-card-ocr-with-opencv-and-python/
版權聲明:
作者:王老頭
出處:http://www.cnblogs.com/wmr95/p/7643155.html
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,並在文章頁面明顯位置給出原文鏈接,否則,作者將保留追究法律責任的權利。