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

如何通过循环结合Tesseract识别结果更新图片ROI数据的DataFrame?

批量处理图片ROI并导出Excel解决方案

需求说明

用户定义了如下ROI区域列表:

roi = [[(284, 764), (996, 840), 'text', 'name'],
       [(1560, 756), (2312, 836), 'text', 'cnic'],
       [(2000, 704), (2060, 748), 'box', 'corporate'],
       [(2296, 696), (2360, 756), 'box', 'individual'],
       [(1220, 844), (2360, 920), 'text', 'email']]

需要完成:

  • 对text类型ROI用Tesseract识别文本
  • 对box类型ROI通过像素计数判断为0或1(像素数超过阈值设为1,否则为0)
  • 遍历文件夹中含“SOF”的图片,将所有图片的处理结果存入DataFrame,列名取自ROI列表最后一列,最终导出到Excel

原代码问题分析

  1. 第一个代码:

    • 每次循环处理图片时都重新初始化df = pd.DataFrame(),导致之前的图片数据被完全覆盖,最终只保留最后一张图的结果
    • 直接给DataFrame列赋值单个值(如df[r[3]] = tess.image_to_string(section)),无法正确添加单条数据行
  2. 第二个代码:

    • 仅处理了最后一张图片(缺少外层循环遍历所有含“SOF”的图片)
    • 每个ROI都新建单独的DataFrame,最后按行拼接导致每行只有一个字段,数据结构完全错误

正确实现代码

import os
import cv2 as cv
import pytesseract as tess
import pandas as pd

# 替换为你的图片文件夹路径
sof_folder = "你的图片文件夹路径"
pixelThreshold = 1100
# 初始化存储所有图片结果的列表
all_results = []

myPicList = os.listdir(sof_folder)
for y in myPicList:
    if 'SOF' in y:
        img_path = os.path.join(sof_folder, y)
        img = cv.imread(img_path)
        if img is None:
            print(f"无法读取图片: {img_path}")
            continue
        
        # 存储当前图片的所有ROI结果
        current_result = {}
        for r in roi:
            # 提取ROI区域:OpenCV坐标为(行,列),对应y轴在前、x轴在后
            x1, y1 = r[0]
            x2, y2 = r[1]
            section = img[y1:y2, x1:x2]
            
            if r[2] == 'text':
                # 识别文本并去除多余换行、空格
                text = tess.image_to_string(section).strip()
                current_result[r[3]] = text
            elif r[2] == 'box':
                # 灰度化、二值化处理
                imgGray = cv.cvtColor(section, cv.COLOR_BGR2GRAY)
                _, imgThresh = cv.threshold(imgGray, 170, 255, cv.THRESH_BINARY_INV)
                totalPixels = cv.countNonZero(imgThresh)
                current_result[r[3]] = 1 if totalPixels > pixelThreshold else 0
        
        # 将当前图片结果加入总列表
        all_results.append(current_result)

# 转换为DataFrame并导出,关闭索引列
df = pd.DataFrame(all_results)
df.to_excel('forms_saved.xlsx', index=False)
print("处理完成,结果已导出到forms_saved.xlsx")

代码说明

  • 用os.path.join拼接路径,避免不同操作系统的路径分隔符问题
  • 每张图片对应一个字典,存储该图片所有ROI的识别结果,保证每行对应一张图片的完整数据
  • 添加图片读取失败的判断,避免程序因损坏图片中断
  • 导出时设置index=False,避免生成多余的索引列

内容的提问来源于stack exchange,提问作者bc210405165 JAWAD MANSOOR

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 22:40:26