信用卡数字识别

信用卡数字识别

基于Opencv的数字识别,使用轮廓检测对模板图像进行特征提取,计算模板图像的外轮廓和外接矩形,与识别图像进行模板匹配计算,取匹配度最高的模板图像为识别数字。其中运用二值化、礼帽、Sobel算子、梯度、闭运算等形态学操作对信用卡图像进行预处理,对提取到的特征进行阈值筛选,得到卡号区域。对卡号区域的数字依次计算轮廓,与模板进行匹配获取识别结果。

步骤:

一、读入模板图像

二、数字模板图像处理

1、模板图像预处理

1.1、转换为灰度图

1.2、转换为二值化图像

2、轮廓处理

2.1、计算轮廓

2.2、画出轮廓

2.3、对轮廓从左到右排序并储存

3、轮廓遍历

3.1、获取轮廓参数

3.2、计算轮廓外接矩形

3.3、resize成合适大小

3.4、存储外接矩形

三、读入识别的信用卡图像

四、信用卡图像处理

1、初始化卷积核

2、信用卡图像预处理

2.1、转换为灰度图

2.2、转换为二值化图像

2.3、resize成合适大小

3、特征提取

3.1、礼帽操作,突出更明亮的区域

3.2、使用Sobel算子求X方向梯度

3.3、闭操作(先膨胀,再腐蚀)将数字连在一起

3.4、二值化操作

3.5、闭操作(先膨胀,再腐蚀)将数字连在一起

4、轮廓处理

4.1、计算轮廓

4.2、画出轮廓

5、轮廓筛选

5.1、计算轮廓外接矩形

5.2、根据长宽比例,设置阈值,保留信用卡的卡号区域轮廓

5.3、对保留的轮廓储存,并按从左到右排序

6、卡号区域数字识别

6.1、获取卡号区域中单个数字轮廓

6.1.1、根据坐标,提取卡号区域轮廓
6.1.2、预处理,二值化操作
6.1.3、计算块中的单个数字轮廓,按从左到右排序并保存

6.2、单个数字模板匹配

6.2.1、遍历单个数字轮廓
6.2.1.1、获取轮廓参数
6.2.1.2、计算外接矩形
6.2.1.3、resize成模板大小
6.2.2、计算模板匹配得分
6.2.2.1、单个数字图像与模板图像匹配计算
6.2.2.2、获取匹配分数
6.2.2.3、保存匹配分数
6.2.3、获取匹配度最高的模板序号,存为该数值对应的值

6.3、用红色矩形画出卡号区域轮廓

6.4、在轮廓上面标注对应匹配的数字

6.5、得到识别结果

注意
1、用opencv读入图像,通道顺序为BGR,对图像进行处理转换为灰度图,只有一个通道,再对灰度图进行二值化操作,转换成二值图,也就是黑白图,只有两种像素值0和255
2、灰度图:用灰度表示的图像,R=G=B或者R、G、B按照比例系数合成单一通道的图像。
3、二值图:也叫黑白图,只有两种像素值0和255构成。

感谢:
灰度图与二值化 https://blog.csdn.net/flowerspring/article/details/115323748
计算机视觉入门到精通 https://www.bilibili.com/video/BV1EG4y1B7Wz?p=32&vd_source=c146fd3a1e762044e3d7bb5025779927

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
from imutils import contours import numpy as np import argparse import cv2 as cv import myutils def cv_show(name,img): cv.imshow(name,img) cv.waitKey(0) cv.destroyAllWindows() # 先处理template tempalte_img = cv.imread("E:/opencv/picture/ocr_a_reference.png") tempalte_gray = cv.cvtColor(tempalte_img, cv.COLOR_BGR2GRAY) tempalte_thres = cv.threshold(tempalte_gray, 0, 255, cv.THRESH_OTSU | cv.THRESH_BINARY_INV)[1] temp_a, tempalte_contours, temp_b = cv.findContours(tempalte_thres.copy (), cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE) cv.drawContours(tempalte_img, tempalte_contours, -1, (0, 255, 0), 2) tempalte_contours = contours.sort_contours(tempalte_contours, method="left-to-right")[0] digits = {} # 构建一个字典 for (i, c) in enumerate(tempalte_contours): (x, y, w, h) = cv.boundingRect(c) tempalte_roi = tempalte_thres[y:y + h, x:x + w] #之前一直检测不出正确答案,原因是这里的roi应该是tempalte_thres一部分 #而不是template_gray的一部分! tempalte_roi = cv.resize(tempalte_roi, (57, 88)) digits[i] = tempalte_roi cv_show('template_single',tempalte_roi) #cv_show('template_single',tempalte_roi) #对银行卡进行处理,之所以要做成数字长条,是想通过长条的尺寸比例大小来将自己想要的数字给抠出来。 rectkernel = cv.getStructuringElement(cv.MORPH_RECT,(9,3)) squrkernel = cv.getStructuringElement(cv.MORPH_RECT,(5,5)) image = cv.imread("E:/opencv/picture/credit_card_02.png") image = myutils.resize(image, width=300) image_gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY) image_tophat= cv.morphologyEx(image_gray,cv.MORPH_TOPHAT,rectkernel) image_close = cv.morphologyEx(image_tophat,cv.MORPH_CLOSE,rectkernel) cv.imshow("image_tophat",image_tophat) cv.imshow('image_close',image_close) image_thres= cv.threshold(image_close,0,255,cv.THRESH_BINARY|cv.THRESH_OTSU)[1] image_contours= cv.findContours(image_thres.copy(),cv.RETR_EXTERNAL,cv.CHAIN_APPROX_SIMPLE)[1] locs = [] for(n,con) in enumerate(image_contours): (gx,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值