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

将PNG图像切分为条状用于银行对账单OCR识别的方案咨询

银行对账单行级切片及识别方案

自定义水平条状切片实现

你目前用的image_slicer仅支持网格切分,不适合行级条状切分需求,直接通过OpenCV+PIL实现自适应行切分即可,核心逻辑是通过水平投影算法自动识别每行文字的上下边界,比固定高度切分准确率更高,完整实现代码如下:

import cv2
import numpy as np
from PIL import Image
from pdf2image import convert_from_path

# 图像预处理:二值化、去噪,提升行边界识别准确率
def preprocess_image(img_path):
    # 灰度读取
    img = cv2.imread(img_path, 0)
    # 自适应二值化
    _, binary = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
    # 小噪点去除
    kernel = np.ones((2, 2), np.uint8)
    binary = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel, iterations=1)
    return binary

# 计算水平投影获取所有行的上下边界
def get_line_ranges(binary_img):
    # 统计每一行的有效像素总和
    horizontal_projection = np.sum(binary_img, axis=1)
    img_height = binary_img.shape[0]
    line_ranges = []
    in_line = False
    line_start = 0

    for y in range(img_height):
        # 检测到有效像素,标记行开始
        if horizontal_projection[y] > 0 and not in_line:
            line_start = y
            in_line = True
        # 有效像素结束,标记行结束
        elif horizontal_projection[y] == 0 and in_line:
            line_end = y
            in_line = False
            # 过滤高度不足的噪声行
            if line_end - line_start > 10:
                # 上下各留2px边距避免切到文字边缘
                line_ranges.append((max(0, line_start - 2), min(img_height, line_end + 2)))
    return line_ranges

if __name__ == "__main__":
    # PDF转图片逻辑和你原有逻辑一致
    pages = convert_from_path('OCRBeebun/Bacon.pdf', 500)
    first_run = False
    if first_run:
        for idx, page in enumerate(pages):
            page.save(f"img_{idx}.png", "PNG")
    
    # 对单张图片做行切分示例
    test_img_path = "img_0.png"
    binary_img = preprocess_image(test_img_path)
    line_ranges = get_line_ranges(binary_img)
    origin_img = Image.open(test_img_path)
    # 逐行切分保存
    for line_idx, (y_start, y_end) in enumerate(line_ranges):
        line_img = origin_img.crop((0, y_start, origin_img.width, y_end))
        line_img.save(f"line_0_{line_idx}.png")

成熟银行对账单识别方案推荐

如果不需要自行开发切分和识别逻辑,可以直接用以下成熟方案:

  • Tesseract优化方案:无需手动切分,直接调用pytesseract的image_to_data接口,即可直接获取每行文字的坐标、置信度和内容,配合参数--psm 6(假设页面为统一格式的文本块)或者--psm 12(适配稀疏文本布局),再加入银行对账单专用训练字库,识别准确率会大幅提升。
  • PaddleOCR:百度开源的OCR工具,自带结构化识别模型已经适配国内常见银行对账单格式,可直接输出行级内容以及交易时间、金额、摘要等关键字段,无需自行做切分和后处理,开箱即用的准确率远高于原生Tesseract。
  • 商用OCR API:如果对准确率和结构化程度要求极高,可直接使用阿里云、腾讯云等云服务商提供的专门银行对账单识别接口,传入PDF或图片即可直接返回完整结构化结果,无需任何预处理开发。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 10:06:03