ref = imutils.resize(ref, width=400)
ref = cv2.threshold(ref, 0, 255, cv2.THRESH_BINARY_INV |
cv2.THRESH_OTSU)[1]
从MICR图像查找字符的轮廓线,并从左到右排序轮廓
refCnts = cv2.findContours(ref.copy(), cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE)
注意:OpenCV 2.4、3和4返回的轮廓不同,因此下一行代码来兼容不同版本及返回值
refCnts = imutils.grab_contours(refCnts)
refCnts = contours.sort_contours(refCnts, method=“left-to-right”)[0]
复制一个原始图像
clone = np.dstack([ref.copy()] * 3)
遍历排序过的轮廓
for c in refCnts:
计算边界框,并绘制边界框绿色在图像上
(x, y, w, h) = cv2.boundingRect©
cv2.rectangle(clone, (x, y), (x + w, y + h), (0, 255, 0), 2)
展示应用简单轮廓方法的结果
cv2.imshow(“Simple Method”, clone)
cv2.waitKey(0)
使用更高级的方法:从轮廓列表中提取数字和符号,然后初始化一个字典来匹配字符名称和ROI
(refROIs, refLocs) = extract_digits_and_symbols(ref, refCnts,
minW=10, minH=20)
chars = {}
重新初始化克隆图像以便于绘制轮廓
clone = np.dstack([ref.copy()] * 3)
遍历参考list的名称、区域及位置
for (name, roi, loc) in zip(charNames, refROIs, refLocs):
在输出图像上绘制字符边界框
(xA, yA, xB, yB) = loc
cv2.rectangle(clone, (xA, yA), (xB, yB), (0, 255, 0), 2)
缩放ROI区域为固定大小36*36,然后更新匹配字符名称和ROI图像的字典
roi = cv2.resize(roi, (36, 36))
chars[name] = roi
展示字符ROI到屏幕
cv2.imshow(“Char”, roi)
cv2.waitKey(0)
展示更高级方法提取的效果图
cv2.imshow(“Better Method”, clone)
cv2.waitKey(0)
3.2 银行支票数字和符号OCR
# 银行支票(从MICR字体中提取数字和符号提取)
MICR(Magnetic Ink Character Recognition 磁性墨水字符识别)是一种用于处理文档的金融行业技术。
经常会在对账单和支票的底部发现这种E-13B格式的磁性墨水。
USAGE
python bank_check_ocr2.py --image images/example_check.jpg --reference images/micr_chars.png
import argparse
import cv2
import imutils
import numpy as np # pip install numpy
导入必要的包
from imutils import contours # pip install --upgrade imutils
from skimage.segmentation import clear_border # pip install -U scikit-image