Python OpenCV招商銀行信用卡卡號識別的方法
學(xué)在前面
從本篇博客起,我們將實際完成幾個小案例,第一個就是銀行卡號識別,預(yù)計本案例將寫 5 篇左右的博客才可以完成,一起加油吧。
本文的目標是最終獲取一套招商銀行卡,0~9 數(shù)字的圖,對于下圖的數(shù)字,我們需要提取出來,便于后續(xù)模板匹配使用。不過下圖中找到的數(shù)字不完整,需要找到盡量多的卡片,然后補齊這些數(shù)字。
提取卡片相關(guān)數(shù)字
先對上文中卡片中的數(shù)字進行相關(guān)提取操作,加載圖片的灰度圖,獲取目標區(qū)域。在畫板中模擬一下坐標區(qū)域,為了便于進行后續(xù)的操作。
具體代碼如下:
import cv2 as cv import numpy as np # 讀取灰度圖 src = cv.imread("./ka1.jpg", 0) # 尋找卡號目標區(qū)域 roi = src[142:168, 42:360] # cv.imshow("roi",roi)
獲取到的圖片如下,發(fā)現(xiàn)右側(cè)邊緣缺少一部分內(nèi)容,對目標區(qū)域坐標進行微調(diào)。
修改之后的代碼如下,你如果使用的圖片與橡皮擦不一致,注意進行修改。
# 尋找卡號目標區(qū)域 roi = src[142:168, 46:364] cv.imshow("roi",roi)
消除噪音,可以增加模糊卷積操作,分別測試均值模糊,中值模糊,高斯模糊效果。
# 模糊卷積操作 blur_roi = cv.blur(roi,(5,5)) cv.imshow("blur_roi",blur_roi) med_roi = cv.medianBlur(roi,5) cv.imshow("med_roi",med_roi) gau_roi = cv.GaussianBlur(roi,(7,7),0) cv.imshow("gau_roi",gau_roi)
測試不同的卷積核效果,選擇一個合適的即可,我這里發(fā)現(xiàn)卷積核為 (7,7) 的時候,高斯模糊效果不錯,可以去噪。
接下來進行二值化操作。
# 對目標區(qū)域進行二值化操作 ret, thresh = cv.threshold( gau_roi, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU) cv.imshow("thresh", thresh)
二值化處理完畢之后,發(fā)現(xiàn)還存在一些白色區(qū)域的點,需要去除掉,這里使用了形態(tài)學(xué)里面的腐蝕操作。
# 腐蝕 kernel = np.ones((3, 4), np.uint8) dst = cv.erode(thresh, kernel=kernel)
腐蝕之后在進行膨脹,讓原有的數(shù)字區(qū)域變的明顯,最后的圖片是進行之后的效果,關(guān)于卷積核你可以自行調(diào)整。
# 腐蝕 kernel = np.ones((3, 4), np.uint8) erode_dst = cv.erode(thresh, kernel=kernel) cv.imshow("erode_dst", erode_dst) # 膨脹 kernel = np.ones((4, 4), np.uint8) dilate_dst = cv.dilate(erode_dst, kernel=kernel)
下面進行外輪廓檢測,檢測之后發(fā)現(xiàn)恰好有 16 個輪廓,也就對應(yīng)了 16 個數(shù)字區(qū)域。
# 檢測外輪廓 # 只檢測外輪廓 contours, hierarchy = cv.findContours(dilate_dst, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE) print(len(contours))
對輪廓面積進行一下輸出,為了防止出現(xiàn)非目標區(qū)域,可以進行一下基本的判斷,當(dāng)羅闊面積大于 80 的時候才進行展示。
target_list = [] # 輪廓判斷 for cnt in contours: # 輪廓面積 area = cv.contourArea(cnt) print(area) if area > 79: target_list.append(cnt) print(len(target_list))
有這些參數(shù)之后,就可以對灰度圖進行裁切了,基于外接矩形獲取目標區(qū)域,我直接做了循環(huán)展示。
for index, cnt in enumerate(target_list): # 外接矩形 x, y, w, h = cv.boundingRect(cnt) # 在二值化的圖像上進行目標區(qū)域獲取 c_roi = roi[y:y+h, x:x+w] # 調(diào)整圖像大小 # big_roi = cv.resize(c_roi, dsize=(0, 0), fx=2, fy=2) # big_roi = cv.resize(c_roi, dsize=(0, 0)) cv.imshow("big_roi"+str(index), c_roi) # cv.imwrite(f"./numbers/ka_{index}.png", big_roi)
接下來放大圖片對其進行保存即可,得到如下圖片列表,至此,已經(jīng)獲取到 1、4、6、8
幾個數(shù)字,下面在切換到另一張卡片,去獲取其他數(shù)字即可,注意圖片大小保持一致。
big_roi = cv.resize(c_roi, dsize=(42, 66)) # cv.imshow("c_roi"+str(index), c_roi) cv.imwrite(f"./numbers/ka1_{index}.png", big_roi)
新的圖像注意調(diào)整目標區(qū)域,獲取素材,已經(jīng)獲取到 1、2、4、5、6、7、8
幾個數(shù)字
反復(fù)迭代這個辦法,知道 0~9 個數(shù)字獲取完整,找到所有數(shù)字之后,對該文件夾中的所有文件進行二值化操作。
import cv2 as cv import os def walk_file(file): for root, dirs, files in os.walk(file): for f in files: file = os.path.join(root, f) # 讀取灰度圖 basename = os.path.basename(file) filename = basename.split(".")[0] src = cv.imread(file, 0) ret, thresh = cv.threshold(src, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU) # cv.imshow("thresh", thresh) cv.imwrite(f"./numbers/001_{filename}_bit.png", thresh) cv.waitKey() cv.destroyAllWindows() if __name__ == "__main__": walk_file("./numbers")
二值化之后,挑選出比較清晰的數(shù)字即可,如果發(fā)現(xiàn)存在不清楚的,可以在尋找資源進行提取,銀行里面 8 真的是太多了。
橡皮擦最后調(diào)整之后,得到的結(jié)果如下所示,信用卡卡號識別的第一步算是準備好了。
到此這篇關(guān)于Python OpenCV招商銀行信用卡卡號識別的方法的文章就介紹到這了,更多相關(guān)OpenCV信用卡卡號識別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python3利用scapy局域網(wǎng)實現(xiàn)自動多線程arp掃描功能
這篇文章主要介紹了Python3利用scapy局域網(wǎng)實現(xiàn)自動多線程arp掃描功能,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01Python通過四大 AutoEDA 工具包快速產(chǎn)出完美數(shù)據(jù)報告
在三年前,我們做數(shù)據(jù)競賽或者數(shù)據(jù)建模類的項目時,前期我們會耗費較多的時間去分析數(shù)據(jù),但現(xiàn)在非常多擅長數(shù)據(jù)分析的大師們已經(jīng)將我們平時??吹臄?shù)據(jù)方式進行了集成,開發(fā)了很多AutoEDA的工具包。可以幫助我們節(jié)省大量時間2021-11-11python實現(xiàn)創(chuàng)建新列表和新字典,并使元素及鍵值對全部變成小寫
今天小編就為大家分享一篇python實現(xiàn)創(chuàng)建新列表和新字典,并使元素及鍵值對全部變成小寫,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-01-01Pandas剔除混合數(shù)據(jù)中非數(shù)字的數(shù)據(jù)操作
這篇文章主要介紹了Pandas剔除混合數(shù)據(jù)中非數(shù)字的數(shù)據(jù)操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03DataFrame.to_excel多次寫入不同Sheet的實例
今天小編就為大家分享一篇DataFrame.to_excel多次寫入不同Sheet的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12Pandas?Matplotlib保存圖形時坐標軸標簽太長導(dǎo)致顯示不全問題的解決
在使用matplotlib作圖的時候,有的時候會遇到畫圖時顯示不全和圖片保存時不完整的問題,這篇文章主要給大家介紹了關(guān)于Pandas?Matplotlib保存圖形時坐標軸標簽太長導(dǎo)致顯示不全問題的解決方法,需要的朋友可以參考下2022-06-06Django實現(xiàn)學(xué)員管理系統(tǒng)
這篇文章主要為大家詳細介紹了Django實現(xiàn)學(xué)員管理系統(tǒng),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-02-02