You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

寻求Python从发票图片提取表格信息方案及bitnot错误解决

问题解决与优化建议

1. 修复当前报错

错误原因

  • bitnot变量未定义:原教程中该变量是对原始图像做反色处理后的结果,你的代码遗漏了这部分预处理步骤。
  • 变量名错误:代码中side2+h的h应为height(前面解构的变量是height,不是h)。

修正后的完整代码片段

import cv2
import numpy as np
import pytesseract
import pandas as pd

# --- 新增预处理步骤 ---
# 替换为你的发票图片路径
img = cv2.imread("invoice_image.jpg")
# 转灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 反色处理(生成bitnot变量)
bitnot = cv2.bitwise_not(gray)
# ---------------------

extract = []
for i in range(len(order)):
    for j in range(len(order[i])):
        inside = ''
        if len(order[i][j]) == 0:
            extract.append(' ')
        else:
            for k in range(len(order[i][j])):
                # 解构坐标与尺寸
                side1, side2, width, height = order[i][j][k][0], order[i][j][k][1], order[i][j][k][2], order[i][j][k][3]
                # 修正h为height
                final_extract = bitnot[side2:side2+height, side1:side1+width]
                
                # 后续预处理与OCR
                final_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2, 1))
                get_border = cv2.copyMakeBorder(final_extract, 2, 2, 2, 2, cv2.BORDER_CONSTANT, value=[255,255])
                resize = cv2.resize(get_border, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC)
                dil = cv2.dilate(resize, final_kernel, iterations=1)
                ero = cv2.erode(dil, final_kernel, iterations=2)
                
                # 优化OCR配置(中文发票添加lang参数)
                ocr = pytesseract.image_to_string(ero, lang='chi_sim')
                if len(ocr) == 0:
                    ocr = pytesseract.image_to_string(ero, config='--psm 6', lang='chi_sim')
                inside += " " + ocr
            extract.append(inside)

# 导出结果
a = np.array(extract)
dataset = pd.DataFrame(a.reshape(len(hor), total))
dataset.to_excel("output1.xlsx", index=False)

2. 针对发票表格提取的优化建议

  • 预处理增强:如果发票有噪点或倾斜,可在转灰度后添加降噪和矫正:
    # 高斯降噪
    blur = cv2.GaussianBlur(gray, (3,3), 0)
    # 阈值二值化(替代反色,根据图像调整阈值)
    _, thresh = cv2.threshold(blur, 127, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
    # 替换bitnot为thresh即可
    
  • 单元格坐标校验:确保order变量存储的是准确的单元格左上角坐标、宽高,若存在合并单元格,需在之前的线条检测步骤中单独处理。
  • ML替代方案:如果OpenCV+Tesseract效果不佳,推荐使用LayoutLM系列模型(Hugging Face提供预训练权重),专门针对文档布局理解,能更精准提取表格结构与内容;或使用pytesseract的表格模式:
    # Tesseract表格提取(需Tesseract 4.0+)
    ocr_table = pytesseract.image_to_data(bitnot, output_type=pytesseract.Output.DATAFRAME)
    

内容的提问来源于stack exchange,提问作者Mr Micawber

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 01:01:21