图像识别技术在发票标签检测中的应用

图像识别技术,特别是光学字符识别(OCR),在处理发票图像中的文本信息方面发挥着重要作用。OCR技术通过计算机视觉技术识别图像中的文本,并能在短时间内准确预测输出结果。本文将探讨如何利用OCR技术实现发票图像中的标签检测,包括发票号码、日期、总金额等关键信息。

学习目标

本文的主要学习目标包括:

  • 学习如何使用OpenCV进行发票上的标签检测,例如发票号码、日期、总金额等。
  • 学习如何从任何发票图像中获取文本的坐标。
  • 了解图像预处理的步骤。
  • 学习如何使用模板图像数据集识别新发票的类型。

基本架构

假设需要从不同模板的发票中检测标签,并提供了一个包含多个模板标签名称的数据集。通过布局映射来确定新发票的图像模板,以便使用已存储的坐标找到新发票的标签。

发票图像预处理

由于输入是发票图像,知道预处理图像是非常重要的一步,这将帮助获得更好的结果。为此,使用了倾斜校正、二值化、噪声过滤和轮廓检测作为预处理的一部分。

# 二值化处理 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文件)中。由于发票上的物品数量可能不同,因此给出了发票图像中发票项目表的起始和结束坐标,以预测发票上的物品数量。

识别新发票的模板

使用模板的标签坐标检测新发票的标签

提高性能的方法

  • 可以在轮廓检测中获得85%的准确率,而包括EasyOcr和paddleOCR的multiOcr模型实现了大约95%的准确率。
  • 余弦相似性方法以82.8%的精度确定文档相似性。如果两个文档共享大量术语,可能会出现误报。
  • 讨论了图像预处理步骤,使用坐标从账单中检测标签,以及发票模板检测。
  • 学习了一些基本代码,并以示例结束了文章。
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485