在今天的博文中,我將演示如何使用模板匹配做爲OCR的一種形式來幫助咱們建立一個自動識別信用卡並從圖像中提取相關信用卡數位的解決方案。html
今天的博文分爲三部分。python
在第一部分中,咱們將討論OCR-A字體,這是一種專門用於輔助光學字符識別算法的字體。git
而後,咱們將設計一個計算機視覺和圖像處理算法,能夠:算法
本地化信用卡上四位數字的四組。
提取這四個組中的每個,而後單獨分割十六個數字中的每個。
經過使用模板匹配和OCR-A字體識別十六張信用卡數字中的每個。網絡
最後,咱們將看一些將咱們的信用卡OCR算法應用於實際圖像的示例。app
首先給你們看下什麼是OCR-A字體:機器學習
儘管現代OCR系統不須要專門的字體(如OCR-A),但仍被普遍應用於身份證,報表和信用卡。ide
下面給出具體的教程:函數
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
本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,並在文章頁面明顯位置給出原文連接,不然,做者將保留追究法律責任的權利。