如何通过循环结合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
原代码问题分析
第一个代码:
- 每次循环处理图片时都重新初始化
df = pd.DataFrame(),导致之前的图片数据被完全覆盖,最终只保留最后一张图的结果 - 直接给DataFrame列赋值单个值(如
df[r[3]] = tess.image_to_string(section)),无法正确添加单条数据行
- 每次循环处理图片时都重新初始化
第二个代码:
- 仅处理了最后一张图片(缺少外层循环遍历所有含“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
相关产品推荐
相关产品推荐

