© Fu Xianjun. All Rights Reserved


重点:

模板匹配、轮廓检测、阈值处理、边缘检测

原图:

1.导包:

import cv2
import numpy as np
def cv_show(name, img):cv2.imshow(name, img)cv2.waitKey(0)cv2.destroyAllWindows()

2.框选图像中的数字部分

def sort_contours(cnts, method="left-to-right"):reverse = Falsei = 0if method == "right-to-left" or method == "bottom-to-top":reverse = Trueif method == "top-to-bottom" or method == "bottom-to-top":i = 1boundingBoxes = [cv2.boundingRect(c) for c in cnts] #用一个最小的矩形,把找到的形状包起来x,y,h,w(cnts, boundingBoxes) = zip(*sorted(zip(cnts, boundingBoxes),key=lambda b: b[1][i], reverse=reverse))return cnts, boundingBoxes
# 读取模板图片
template = cv2.imread('ocr_a_reference.png')
cv_show('template', template)
# 模板图片灰度化。这里的模板图片本身就是二值化的因此没有明显区别。
template_gray = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY)
cv_show('templage_gray', template_gray)
# 二值化,转化为数字为白色,背景为黑色的图片。
template_binary = cv2.threshold(template_gray, 127, 255, cv2.THRESH_BINARY_INV)[1]
cv_show('template_binary', template_binary)

效果:

3.选中数字

# 根据二值化的模板图,进行轮廓检测
cnts, hierarchy = cv2.findContours(template_binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 画出每个数字的轮廓
template_rect = cv2.drawContours(template.copy(), cnts, -1, (0,0,255), 2)
cv_show('template_rect', template_rect)
# 对十个数字根据左上角的位置进行排序,这样数字按照从小到大的顺序排列出来。
cnts = sort_contours(cnts, method="left-to-right")[0]
number = {}
# 根据排列的结果,将每个数字截取出来。将每个数字图片所对应的数字对应起来。
# 这里要注意,对像素值进行取值时,数组的行对应的是图片的y轴,列对应的图片的x轴。
for (i, cnt) in enumerate(cnts):(x,y,w,h) = cv2.boundingRect(cnt)roi = template_binary[y:y+h, x:x+w]roi = cv2.resize(roi, (57,88))number[i] = roi

效果:

4.对信用卡信息进行处理,去除多余的背景信息

# 读取信用卡图片
cardImg = cv2.imread('credit_card_01.png')
cardImg = cv2.resize(cardImg, (300, int(float(300 / cardImg.shape[1]) * cardImg.shape[0])), interpolation=cv2.INTER_AREA)
cv_show('cardImg', cardImg)
cardImg_gray = cv2.cvtColor(cardImg, cv2.COLOR_BGR2GRAY)
cv_show('cardImg_gray', cardImg_gray)# 指定卷积核大小
rectKernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7))
sqKernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
# 进行礼帽操作
cardImg_tophat = cv2.morphologyEx(cardImg_gray, cv2.MORPH_TOPHAT, rectKernel)
cv_show('cardImg_open', cardImg_tophat)

效果:

5.对信用卡上的数字进行选取,对于非卡号数字进行剔除

# 使用sobel算子进行边缘检测,这里仅适用x方向的梯度。因为经过实验,使用x,y混合的梯度,效果并不理想。
sobelx = cv2.Sobel(cardImg_tophat, cv2.CV_64F, 1, 0, ksize=3)
sobelx = cv2.convertScaleAbs(sobelx)
(minX, maxX) = (np.min(sobelx), np.max(sobelx))
sobelx = (255 * ((sobelx - minX) / (maxX - minX)))
sobelx = sobelx.astype('uint8')
cv_show('sobelx', sobelx)
#进行闭运算,使相邻的数字连接起来,这样便于筛选。
cardImg_close = cv2.morphologyEx(sobelx, cv2.MORPH_CLOSE, rectKernel)
cv_show('cardImg_close', cardImg_close)cardImg_binary = cv2.threshold(cardImg_close, 0, 255, cv2.THRESH_OTSU | cv2.THRESH_BINARY)[1]
cv_show('cardImg_binary', cardImg_binary)cardImg_close = cv2.morphologyEx(cardImg_binary, cv2.MORPH_CLOSE, sqKernel)
cv_show('cardImg_close', cardImg_close)
# 轮廓检测,检测出每一个数字区块
cnts, hierarchy = cv2.findContours(cardImg_close, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cardImg_cnts = cv2.drawContours(cardImg.copy(), cnts, -1, (0,0,255), 2)
cv_show('cardImg_cnts', cardImg_cnts)# 对轮廓进行筛选, 根据边框的尺寸仅保留卡号区域
locs = []
for (i, c) in enumerate(cnts):(x, y, w, h) = cv2.boundingRect(c)ar = w / float(h)if ar > 2.5 and ar < 4.0:if (w > 40 and w < 55) and (h > 10 and h < 20):locs.append((x, y, w, h))locs = sorted(locs, key=lambda x: x[0])
for (x, y, w, h) in locs:cv2.rectangle(cardImg_cnts, (x,y),(x+w,y+h),(0,0,255),3)
cv_show('cardImg_cnts', cardImg_cnts)

效果:

5.得到卡号区域后,对卡号进行数字划分。进行模板匹配,得到每个数字图像所对应的数字

output = []
# 对每个4数字块进行处理
for (i, (x, y, w, h)) in enumerate(locs):group_output = []group = cardImg_gray[y-5:y + h + 5, x-5:x + w + 5]group = cv2.threshold(group, 0, 255, cv2.THRESH_OTSU|cv2.THRESH_BINARY)[1]cv_show('group', group)group_cnts, group_hierarchy = cv2.findContours(group, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)group_cnts = sort_contours(group_cnts, method="left-to-right")[0]# 分割每个数字for cnt in group_cnts:(nx,ny,nw,nh) = cv2.boundingRect(cnt)roi = group[ny:ny+nh, nx:nx+nw]roi = cv2.resize(roi, (57, 88))cv_show('roi', roi)score = []# 对每个数字进行模板匹配for (number_i, number_roi) in number.items():result = cv2.matchTemplate(roi, number_roi, cv2.TM_CCOEFF)score_ = cv2.minMaxLoc(result)[1]score.append(score_)group_output.append(str(np.argmax(score)))
# 绘制每个数字cv2.rectangle(cardImg, (x - 5, y - 5),(x + w + 5, y + h + 5), (0, 0, 255), 1)cv2.putText(cardImg, "".join(group_output), (x, y - 15),cv2.FONT_HERSHEY_SIMPLEX, 0.65, (0, 0, 255), 2)output.append(group_output)cv_show('cardImg', cardImg)

最终效果:

数字图像处理——信用卡数字识别相关推荐

  1. 近三年数字图像处理与数字媒体技术相关的前沿技术研究和应用

    近三年来,数字图像处理和数字媒体技术的前沿研究和应用取得了巨大的发展,主要集中在以下几个方面:深度学习,虚拟现实和增强现实,数字图像处理,数字媒体处理,数据恢复,图像压缩,视频跟踪,计算机视觉,机器人 ...

  2. 数字图像处理_Matlab——车牌识别分析

    目录 一.导入图片 1. 从文件导入 1.1 原理: 1.2 代码: 2. 摄像头拍照识别 2.1 了解 2.1 代码: 二.预处理 1. 预处理-- 原图->灰度图 2. 预处理-- 边缘检测 ...

  3. 基于数字图像处理的杂草识别

    一.课题介绍 杂草同农田作物争夺阳光和养分,严重影响了农作物的生长.为了达到除草的目的,人们开始喷洒大量的除草剂来进行除草.可是却忽略了除草剂的不当使用给人.畜以及环境造成的危害.本文从实际应用出发, ...

  4. MATLAB 数字图像处理---车牌简单识别【亲测有效】

    文章内容:利用 MATLAB 对图像进行简单处理,包括图像的模糊.锐化.和直方图均衡化:对图像进行边缘检测:并对利用 MATLAB 对图像中的数字提取识别. 目录 1 MATLAB 对图像进行简单处理 ...

  5. 数字图像处理(1)-数字图像处理的基本步骤

    1.4数字图像处理的基本步骤 数字图像处理的内容划分为以下两个主要类别:一类是其输入输出都是图像.一类是其输入可能是图像,但输出是从这些图像中提取的属性. 图像获取是数字图像处理的第一步处理.图像获取 ...

  6. 计算机 数字图像处理试题,数字图像处理试题及参考答案

    一.填空题(每题1分,共15分) 1.列举数字图像处理的三个应用领域医学.天文学.军事 1024?,256个灰度级的图像,需要8M bit. 2.存储一幅大小为1024 3.亮度鉴别实验表明,韦伯比越 ...

  7. FPGA|数字图像处理实现口罩识别——二值化

    [写在前面]刚入门小菜鸟,记录一下口罩识别学习过程.参考文件和网址会在文末注明.有错误欢迎指出,也欢迎进行补充~ 原理图如下,二值化对应为红框里的部分 使用的二值化方法是手动指定一个阈值,通过阈值来进 ...

  8. 数字图像处理实验——数字图像处理初步

    一.实验目的与要求 1.熟悉及掌握在MATLAB中能够处理哪些格式的图像: 2.熟练掌握在MATLAB中如何读取图像及图像的属性信息(大小.颜色.亮度(灰度).宽度.高度等): 3.掌握如何在MATL ...

  9. 《数字图像处理与机器视觉——Visual C++与Matlab实现》——0.2 数字图像处理与识别...

    本节书摘来自异步社区出版社<数字图像处理与机器视觉--Visual C++与Matlab实现>一书中的第0章,第0.2节,作者: 张铮 , 王艳平 , 薛桂香,更多章节内容可以访问云栖社区 ...

最新文章

  1. JavaScript - Closure
  2. 《机器学习技法》---模型聚合
  3. tos重装mysql_云服务器(腾讯云)从零开始部署记录(3)之mysql5.7安装
  4. 河南省2020年计算机高考真题,2020年最新版对口高考试卷(计算机).docx
  5. 学校中有老师和学生两类人,而在职研究生既是老师又是学生,对学生的管理和对教师的管理在他们身上都有体现。...
  6. Python【每日一问】35
  7. selenium获取文本的几种方法小结(获取源码)
  8. 现场操作前,软件界面的各个功能面板应该通过拖动进行合理布局.请看参考图
  9. PASCAL VOC 数据集详解与MS COCO组合方式
  10. vue 图片放大、缩小、旋转、滚轮操作图片放大缩小
  11. 自动化技术实现目录全览
  12. 解决了.Net 2003“试图调试项目时发生错误”的问题
  13. 区块链电子合同,杜绝萝卜章风险
  14. CSS解构系列之-新浪页面解构-02
  15. 一文学会LaTeX基础
  16. 旺季大促白热化,如何做好谷歌广告投放
  17. Maco可视化报表设计器
  18. 摩尔定律终结:“偏执狂”英特尔缘何不再偏执?
  19. libuv异步任务逻辑和uv_queue_work()
  20. JavaScript基础----全方位的基础篇(一),前方高能哦

热门文章

  1. Mysql内查询时报错,错误代码: 1146
  2. 计算机培训研修心语,学子榜样 | 2018级国家励志奖学金程春旭:不忘初心,砥砺前行...
  3. DNS、Http和Https
  4. libvirt 详解(2)
  5. 【如何配置环境变量】
  6. ab压力测试是使用以及介绍
  7. ps流 转发_一种国标PS流转RTMP直播流的实时转换方法与流程
  8. 思科虚拟服务器修改域名,思科域名服务器设置
  9. C语言习题练习2——被5整除问题
  10. 用Python语言模型和LSTM做一个Drake饶舌歌词生成器!自己蒙了!