使用Python,OpenCV进行银行支票数字和符号的OCR!

这一篇将介绍如何使用Python,OpenCV从支票图像中提取OCR银行账户和路由号码(数字和符号)。

OCR银行支票比OCR信用卡更难——这主要是因为银行支票符号由多个部分组成。因此不能假设参考字体图像中的每个轮廓都映射到单个字符。

相反需要额外的逻辑来检查每个轮廓的尺寸,并确定检测到的是数字还是符号。

在找到符号的情况下,需要抓取下两个轮廓来构建边界框(因为银行支票控件字符由三个不同的部分组成)。

. 效果图

MICR E-13B字符集简单提取过程如下:原始图 VS 灰度图 VS 阈值化图 VS 简单提取效果图

可以看到符号区域虽然每个符号由3个轮廓组成,但也被展示为3个轮廓。下一步高级复杂提取则将符号区域的3个轮廓提取为一个。
在这里插入图片描述

MICR E-13B字符集高级复杂提取效果如下:
在这里插入图片描述
银行支票提取数字和符号OCR效果图如下:
在这里插入图片描述

银行支票提取数字和符号OCR过程图如下:
原始图 VS 灰度图 VS 黑帽图 VS Scharr梯度图 VS
矩形内核形态学闭合图 VS Octus阈值化二值化图 VS 清除边界图

  • 灰度图:忽略色彩的影响
  • 黑帽图:在浅色背景下查找暗区域(明亮的背景下查找暗的区域——帐号部分)
  • Scharr梯度图:了解颜色分布闭合部分缝隙
  • 矩形内核形态学闭合图:闭合数字字符轮廓之间的小的缝隙
  • Octus阈值化二值化图:将图像分为白色前景和黑色背景,便于轮廓提取
  • 清除边界图:清除掉靠近边界的任何像素,很有效
  • 轮廓过滤:根据轮廓的面积和宽高比过滤掉无效的轮廓

å¨è¿éæå¥å¾çæè¿°

å¨è¿éæå¥å¾çæè¿°

2. 原理

2.1 MICR E-13B字体

MICR(Magnetic Ink Character Recognition 磁性墨水字符识别)是一种用于处理文档的金融行业技术。您经常会在对账单和支票的底部发现这种E-13B格式的磁性墨水。

银行支票上的数字是MICR E-13B字体,如下图包括类似font-a字体,0~9的10个数字,及后边的4个符号区,共14个字符。

  • 数字:数字0-9
  • ⑆ :中转银行分行分隔符
  • ⑇ :金额,交易金额分隔符
  • ⑈ :客户帐号分隔符
  • ⑉ :破折号:数字分隔符

å¨è¿éæå¥å¾çæè¿°

2.2 从MICR E-13B参考图像中提取数字和符号

将使用OpenCV轮廓和一点Python迭代器切片“魔法”来实现提取。
数字区相对容易一些,一个数字一个轮廓。然而每个符号包含3个轮廓。

3. 源码

3.1 MICR E-13B符号和数字提取

# 银行支票(从MICR字体中提取数字和符号提取)
# MICR(Magnetic Ink Character Recognition 磁性墨水字符识别)是一种用于处理文档的金融行业技术。
# 经常会在对账单和支票的底部发现这种E-13B格式的磁性墨水。

# USAGE
# python bank_check_ocr.py --image images/example_check.jpg --reference images/micr_chars.png

# 导入必要的包
from skimage.segmentation import clear_border # pip install -U scikit-image
from imutils import contours # pip install --upgrade imutils
import numpy as np # pip install numpy
import argparse
import imutils
import cv2

# 从MICR中提取数字和符号
# image: MICR E-
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
使用PythonOpenCV进行数字识别可以分为以下几个步骤: 1. 安装OpenCV库:首先,确保已经安装了PythonOpenCV库。可以使用pip命令安装OpenCV:`pip install opencv-python`。 2. 导入库:在Python脚本中,导入所需的库: ```python import cv2 import numpy as np ``` 3. 加载并预处理图像:使用OpenCV加载图像,并对其进行预处理。通常,数字识别需要在灰度图像上进行。可以使用以下代码加载图像并将其转换为灰度图像: ```python image = cv2.imread('image.jpg') gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) ``` 4. 对图像进行阈值处理:为了将数字从背景中分离出来,可以使用阈值处理。这将使图像变为黑白二值图像。可以使用以下代码进行简单的阈值处理: ```python _, threshold = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU) ``` 5. 查找轮廓:使用OpenCV的`findContours`函数查找图像中的轮廓。可以使用以下代码查找轮廓: ```python contours, _ = cv2.findContours(threshold, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) ``` 6. 遍历轮廓并识别数字:对于每个轮廓,可以计算其边界框并提取数字区域。然后,使用所选的机器学习算法(例如SVM或神经网络)对数字进行识别。这超出了本文的范围,但可以通过训练模型来实现数字识别。 ```python for contour in contours: (x, y, w, h) = cv2.boundingRect(contour) digit = gray[y:y+h, x:x+w] # 使用机器学习算法识别数字 # ... ``` 这只是一个基本的数字识别框架,你可以根据具体需求进行调整和改进。记得导入模型和训练模型来实现数字识别。希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Python是世界上最好的语言

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值