今天我们来介绍一下如何使用(opencv/python)来实现OCR处理银行票据。文末有代码和相关文档下载!
在第一部分中,我们将讨论两个主题:
1.首先,我们将了解MICR E-13B字体,美国,英国,加拿大等国家用于支票上都是使用的这种字体。
2.其次,我们将讨论如何从MICR E-13B参考图像中提取数字和符号。这将使我们能够提取每个字符的ROI,然后将其用于OCR银行支票。
MICR E-13B 字体:
MICR(磁墨字符识别)是处理文件的金融工业技术。
MICR的E-13B变体包含14个字符:
·数字:数字0-9。
·过境:银行分行分隔。
·金额:交易金额分隔符。
·在我们:客户帐号分隔符。
·dash:数字分隔符(例如路由和帐号之间)。
银行支票字符识别看起来更难:
在银行支票上使用的MICR E-13B字体中,数字有一个轮廓。但是,控制符号对于每个角色具有三个轮廓,使任务稍微更具挑战性。我们不能使用简单的轮廓和边框方法。相反,我们需要设计自己的方法来可靠地提取数字和符号。
用OpenCV提取MICR数字和符号:
创建一个新的文件,命名为bank_check_ocr.py,并插入以下代码:
# import the necessary packagesfrom skimage.segmentation import clear_border
首先我们先导入各种我们需要的包,以确保程序的正确运行
·OpenCV:从此页面选择适合您系统的安装版本。
·scikit-image:这是通过pip安装的,pip install-Uscikit-image
·numpy :通过 pip install numpy。
·imutils:这是可以通过 pip 安装:pip install--upgrade imutils。
接着我们来构建一个从MICR字体中提取字符的函数:
def extract_digits_and_symbols(image, charCnts, minW=5, minH=15):
对于初学者,我们的功能需要4个参数:
·image:MICR E-13B字体图像(代码下载中提供)。
·charCnts:包含参考图像中的字符轮廓的列表。
·minW:表示最小字符宽度的可选参数。默认值为5像素宽度。
·minH:最小字符高度。默认值为15像素。
接着我们初始化我们的charCnts列表的迭代器。列表对象本质上是“可迭代的”,意味着__iter__方法是由生成器完成的。
最后初始化空列表以保存我们的rois(感兴趣的区域)和loc(ROI位置)。我们将在函数结尾的一个元组中返回这些列表。
我们开始循环,看一下迭代器的工作原理:
while True:
在我们的函数中,我们开始一个无限循环,我们的退出条件是当我们捕获StopIterator异常时。为了捕获这个异常,我们需要设置try-catch块。对于循环的每次迭代,我们通过调用next(charIter)来获取下一个字符轮廓。从这个函数调用,我们可以提取矩形的(x,y)坐标和宽度/高度。接着我们初始化一个roi,我们将在短时间内存储字符图像。
接下来,我们将检查我们的边框宽度和高度的大小,并采取相应的措施:
if cW