Python OpenCV招商银行信用卡卡号识别的方法
作者:梦想橡皮擦 发布时间:2022-01-16 06:31:30
学在前面
从本篇博客起,我们将实际完成几个小案例,第一个就是银行卡号识别,预计本案例将写 5 篇左右的博客才可以完成,一起加油吧。
本文的目标是最终获取一套招商银行卡,0~9 数字的图,对于下图的数字,我们需要提取出来,便于后续模板匹配使用。不过下图中找到的数字不完整,需要找到尽量多的卡片,然后补齐这些数字。
提取卡片相关数字
先对上文中卡片中的数字进行相关提取操作,加载图片的灰度图,获取目标区域。在画板中模拟一下坐标区域,为了便于进行后续的操作。
具体代码如下:
import cv2 as cv
import 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 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")
二值化之后,挑选出比较清晰的数字即可,如果发现存在不清楚的,可以在寻找资源进行提取,银行里面 8 真的是太多了。
橡皮擦最后调整之后,得到的结果如下所示,信用卡卡号识别的第一步算是准备好了。
来源:https://dream.blog.csdn.net/article/details/114366561
猜你喜欢
- 今日一同时问我,new Date(Date(str))这段代码什么意思?我一看就晕了,一个new Date 一个Date这是什么意思?这函数
- 在ASP的实际操作中,总会发生这样的情况,如在银行,从我的帐户往费文华的帐户划款,我的帐户显示已经划出,但因银行的系统出现故障,导致费文华帐
- 变量(Variable)可以看成一个小箱子,专门用来“盛装”程序中的数据。每个变量都拥有独一无二的名字,通过变量的名字就能找到变量中的数据。
- Python项目文件中安装 setup.py安装 setup.py 的过程与安装其他的 Python 包的过程类似。首先,你需要下载或者使用
- 在任何语言中,都会规定某些对象(属性、方法、函数、类等)只能够在某个范围内访问,出了这个范围就不能访问了。这是“公”、“私”之分。此外,还会
- django模板使用media文件夹,想要在前端通过{{ MEDIA_URL }}无法显示图片,没有取到Media_url的值解决办法:TE
- 如果你想进一步了解如何用JavaScript来为网页添加交互性的话,你也许已经听过JavaScript的事件代理(event delegat
- 项目开发中,代码管理肯定离不开git操作,Pycharm中没有复杂的命令操作,只需要进行一些简单的菜单操作就可以方便的实现版本管理,下面分别
- match()方法用于从字符串中查找指定的值本方法类似于indexOf()和lastindexOf(),不同的是它返回的是指定的值,而不是指
- 反射反射即想到4个内置函数分别为:getattr、hasattr、setattr、delattr 获取成员、检查成员、设置成员、
- 如下所示:import cv2import mathimport numpy as npdef move(img): height, wid
- 多级联动下拉选择框,动态获取下一级,每一级数据为XML,可支持无限级(浏览器端需要Microsoft.XMLDOM支持)项目需要,一个材料类
- 怎么样才能设计出漂亮的网页?怎么样才能做好网页设计工作,现在许多人还停留在网页制作的水平上,认为只要用好了网页制作软件,就能搞好网页设计了,
- 从大的发展来看,网站就是一块试验田,一块在错误中成长、在错误中变强变大的试验田。这决定了互联网产品的成长路线,一定是一个反复修正和迭代的曲线
- 本文实例讲述了python 实现的发送邮件模板。分享给大家供大家参考,具体如下:##发送普通txt文件(与发送html邮件不同的是邮件内容设
- WEB程序员的技能要求: Web程序员不光要对 后端程序(如 php,jsp,asp.net)语言知识,对程序设计架构知识,数据库
- SAX将dd.xml解析成html。当然啦,如果得到了xml对应的xsl文件可以直接用libxml2将其转换成html。#!/usr/bin
- 在我供职的公司不仅仅拥有Oracle数据库,同时还拥有SQL Server数据库,所以我经常遇见人们向我提两种问题。 第一种通常都是以&qu
- 前言ThinkPHP,是为了简化企业级应用开发和敏捷WEB应用开发而诞生的开源轻量级PHP框架。随着框架代码量的增加,一些潜在的威胁也逐渐暴
- 1. 定义本质是函数,用来装饰其他函数,为其他函数添加附加功能2. 原则a. 不能修改被装饰函数的源代码b. 不能修改被装饰的函数的调用方式