图像识别技术,特别是光学字符识别(OCR),在处理发票图像中的文本信息方面发挥着重要作用。OCR技术通过计算机视觉技术识别图像中的文本,并能在短时间内准确预测输出结果。本文将探讨如何利用OCR技术实现发票图像中的标签检测,包括发票号码、日期、总金额等关键信息。
本文的主要学习目标包括:
假设需要从不同模板的发票中检测标签,并提供了一个包含多个模板标签名称的数据集。通过布局映射来确定新发票的图像模板,以便使用已存储的坐标找到新发票的标签。
由于输入是发票图像,知道预处理图像是非常重要的一步,这将帮助获得更好的结果。为此,使用了倾斜校正、二值化、噪声过滤和轮廓检测作为预处理的一部分。
# 二值化处理
res = cv.adaptiveThreshold(img, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 11, 2)
plt.figure(figsize=(100, 60))
plt.imshow(res, 'gray')
plt.show()
# 噪声过滤
cv2.fastNlMeansDenoisingColored(img, None, 10, 10, 7, 21)
# 倾斜校正
import numpy as np
from skimage import io
from skimage.transform import rotate
from skimage.color import rgb2gray
from deskew import determine_skew
image = io.imread(_img)
grayscale = rgb2gray(image)
angle = determine_skew(grayscale)
rotated = rotate(image, angle, resize=True) * 255
rotated = rotated.astype(np.uint8)
轮廓检测是为了找到图像中不同位置的发票,使用“轮廓检测方法”来实现。通过使用cv2.findContours()函数找到边缘,以及cv2.contourArea()方法找到面积最大的边缘,然后裁剪图像到该边缘。
使用EasyOCR作为检测模型和PaddleOCR作为识别模型,构建了MultiOcr模型来获取每个发票模板的标签坐标。
reader = easyocr.Reader(['en'])
ocr = PaddleOCR(lang='en')
# 检测
def detect_text_blocks(img_path):
detection_result = reader.detect(img_path, width_ths=0.7, mag_ratio=1.5)
text_coordinates = detection_result[0][0]
return text_coordinates
MultiOcr模型为每个模板发票找到标签名称的坐标,并将其存储在表格(csv文件)中。由于发票上的物品数量可能不同,因此给出了发票图像中发票项目表的起始和结束坐标,以预测发票上的物品数量。