这篇教程Python OpenCV招商银行信用卡卡号识别的方法写得很实用,希望能帮到您。 学在前面从本篇博客起,我们将实际完成几个小案例,第一个就是银行卡号识别,预计本案例将写 5 篇左右的博客才可以完成,一起加油吧。 本文的目标是最终获取一套招商银行卡,0~9 数字的图,对于下图的数字,我们需要提取出来,便于后续模板匹配使用。不过下图中找到的数字不完整,需要找到尽量多的卡片,然后补齐这些数字。 
提取卡片相关数字先对上文中卡片中的数字进行相关提取操作,加载图片的灰度图,获取目标区域。在画板中模拟一下坐标区域,为了便于进行后续的操作。 
具体代码如下: import cv2 as cvimport numpy as np# 读取灰度图src = cv.imread("./ka1.jpg", 0)# 寻找卡号目标区域roi = src[142:168, 42:360]# cv.imshow("roi",roi) 获取到的图片如下,发现右侧边缘缺少一部分内容,对目标区域坐标进行微调。 
修改之后的代码如下,你如果使用的图片与橡皮擦不一致,注意进行修改。 # 寻找卡号目标区域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) 测试不同的卷积核效果,选择一个合适的即可,我这里发现卷积核为 (7,7) 的时候,高斯模糊效果不错,可以去噪。 
接下来进行二值化操作。 # 对目标区域进行二值化操作ret, thresh = cv.threshold( gau_roi, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)cv.imshow("thresh", thresh) 
二值化处理完毕之后,发现还存在一些白色区域的点,需要去除掉,这里使用了形态学里面的腐蚀操作。 # 腐蚀kernel = np.ones((3, 4), np.uint8)dst = cv.erode(thresh, kernel=kernel) 
腐蚀之后在进行膨胀,让原有的数字区域变的明显,最后的图片是进行之后的效果,关于卷积核你可以自行调整。 # 腐蚀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) 
下面进行外轮廓检测,检测之后发现恰好有 16 个轮廓,也就对应了 16 个数字区域。 # 检测外轮廓# 只检测外轮廓contours, hierarchy = cv.findContours(dilate_dst, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)print(len(contours)) 
对轮廓面积进行一下输出,为了防止出现非目标区域,可以进行一下基本的判断,当罗阔面积大于 80 的时候才进行展示。 target_list = []# 轮廓判断for cnt in contours: # 轮廓面积 area = cv.contourArea(cnt) print(area) if area > 79: target_list.append(cnt)print(len(target_list)) 
有这些参数之后,就可以对灰度图进行裁切了,基于外接矩形获取目标区域,我直接做了循环展示。 for index, cnt in enumerate(target_list): # 外接矩形 x, y, w, h = cv.boundingRect(cnt) # 在二值化的图像上进行目标区域获取 c_roi = roi[y:y+h, x:x+w] # 调整图像大小 # 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) 
接下来放大图片对其进行保存即可,得到如下图片列表,至此,已经获取到 1、4、6、8 几个数字,下面在切换到另一张卡片,去获取其他数字即可,注意图片大小保持一致。 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) 
新的图像注意调整目标区域,获取素材,已经获取到 1、2、4、5、6、7、8 几个数字 
反复迭代这个办法,知道 0~9 个数字获取完整,找到所有数字之后,对该文件夹中的所有文件进行二值化操作。 import cv2 as cvimport osdef 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") 二值化之后,挑选出比较清晰的数字即可,如果发现存在不清楚的,可以在寻找资源进行提取,银行里面 8 真的是太多了。 
橡皮擦最后调整之后,得到的结果如下所示,信用卡卡号识别的第一步算是准备好了。

到此这篇关于Python OpenCV招商银行信用卡卡号识别的方法的文章就介绍到这了,更多相关OpenCV信用卡卡号识别内容请搜索51zixue.net以前的文章或继续浏览下面的相关文章希望大家以后多多支持51zixue.net! python 实现docx与doc文件的互相转换 python opencv 找出图像中的最大轮廓并填充(生成mask) |