【Python】批量提取超声波检查图片的某一行数据
目录
0. 背景
1. 坑点及解决方法
2. Python代码
3. 超声波检查图片(素材)
0. 背景
工作需求,需要批量提取多张焊点超声波检查结果的焊核平均直径、长径、短径数据,并导出至EXCEL表中,方便后续数据录入
1. 坑点及解决方法
序号 | 坑点 | 解决方案 |
---|---|---|
1 | 避免对整张图片进行全文识别再提取特定行数据,因OCR识别结果不稳定,可能导致数据所在行号发生变化 | 缩小识别范围,通过ROI(感兴趣区域)定位特定数据区域,该方法已确认有效。 |
2 | 输入多个文件夹时,文件路径使用os.path.join()连接后报错“\“与“/“,拼接后地址中左右正反斜杠都有 | 使用root = os.path.abspath(root)或os.path.normpath(root) |
2. Python代码
# 步骤
# 1. 读取多个文件夹中的图片:遍历指定的文件夹,读取其中的图片。
# 2. 指定识别区域并进行OCR识别:根据图片内容,确定需要识别的区域,并使用Tesseract进行OCR识别。
# 3. 解析识别结果:解析识别结果并存储到Excel中,每行数据的关键词为文件夹名称和图片名称(去后缀)# 注意事项
# 文件夹和图片名称:确保文件夹和图片名称符合预期,避免因名称错误导致关键词生成错误。
# 下划线连接符:你可以根据实际需求选择不同的连接符,例如使用 - 或 . 等。
# 关键词唯一性:确保生成的关键词在所有数据中是唯一的,避免重复。如果存在重复的文件夹和图片名称,可以考虑添加其他标识符,例如时间戳或序号。import cv2
import pytesseract
import pandas as pd
import os
import time
from tkinter import filedialog, messagebox# 配置Tesseract路径(根据你的安装路径进行修改)
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'# 读取图片并指定识别区域
def extract_text_from_image(image_path, roi):image = cv2.imread(image_path)gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)x, y, w, h = roiroi_image = gray[y:y + h, x:x + w]text = pytesseract.image_to_string(roi_image, lang='chi_sim')return text# 解析数据
def parse_row_data(text):lines = text.split('\n')if len(lines) >= 1:row_data = lines[0].strip()parts = row_data.split()if len(parts) >= 3:return {'接合径(长+短)/2(mm)': parts[0],'长轴(mm)': parts[1],'短轴(mm)': parts[2]}return None# 批量处理图片并存储到Excel
def process_images(folder_paths, output_excel, roi):data = []start_time = time.time() # 记录开始时间for folder_path in folder_paths:for filename in os.listdir(folder_path):if filename.endswith('.png') or filename.endswith('.jpg'):image_path = os.path.join(folder_path, filename)image_path = os.path.abspath(image_path) # 拼接后地址中左右正反斜杠都有,使用abspath转化text = extract_text_from_image(image_path, roi)row_data = parse_row_data(text)if row_data:folder_name = os.path.basename(folder_path)image_name = os.path.splitext(filename)[0]keyword = f"{folder_name}_{image_name}"print(f"Image: {filename}, Ninth Row Data: {row_data}, Keyword: {keyword}") # 打印第九行数据和关键词data.append({'Keyword': keyword, **row_data})df = pd.DataFrame(data)df.to_excel(output_excel, index=False)end_time = time.time() # 记录结束时间elapsed_time = end_time - start_time # 计算运行时间print(f"程序运行时间: {elapsed_time:.2f} 秒")def main():output_excel = 'output.xlsx' # 输出EXCELfolder_paths = filedialog.askdirectory(mustexist=True, title="选择文件夹(路径无中文)")if folder_paths:folder_paths = folder_paths.split('\n')roi = (300, 111, 402, 55) # 请根据实际图片调整ROIprocess_images(folder_paths, output_excel, roi)messagebox.showinfo("完成", "处理完成!")else:messagebox.showerror("错误", "未选择文件夹")if __name__ == '__main__':main()