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

基于坐标分组EasyOCR识别结果中的分离字符串

解决EasyOCR识别文本分组拼接的最优方案

核心思路是利用EasyOCR返回的边界框(bbox)坐标信息,通过判断文本块的垂直位置(是否同行)和水平间距(是否邻近)来分组拼接。以下是可落地的步骤和代码:

1. 预处理DataFrame,提取坐标特征

假设你的DataFrame名为ocr_df,包含text和bbox列(bbox格式为[(x1,y1),(x2,y2),(x3,y3),(x4,y4)]),先计算每个文本块的关键坐标参数:

import pandas as pd
import numpy as np

# 提取坐标特征
ocr_df['y1'] = ocr_df['bbox'].apply(lambda x: x[0][1])
ocr_df['y3'] = ocr_df['bbox'].apply(lambda x: x[2][1])
ocr_df['x1'] = ocr_df['bbox'].apply(lambda x: x[0][0])
ocr_df['x2'] = ocr_df['bbox'].apply(lambda x: x[1][0])

# 计算垂直中心、高度、宽度
ocr_df['y_center'] = (ocr_df['y1'] + ocr_df['y3']) / 2
ocr_df['height'] = ocr_df['y3'] - ocr_df['y1']
ocr_df['width'] = ocr_df['x2'] - ocr_df['x1']

2. 按垂直位置聚类实现自动分行

用KMeans对y_center聚类,自动识别不同行。聚类的簇数根据文本块的垂直间距动态调整:

from sklearn.cluster import KMeans

# 计算行间距阈值:取所有文本块高度中位数的1/2
row_threshold = ocr_df['height'].median() / 2

# 统计相邻y_center的差值,确定聚类簇数
y_sorted = np.sort(ocr_df['y_center'].values)
diff_y = np.diff(y_sorted)
n_clusters = sum(diff_y > row_threshold) + 1

# 聚类得到行号
kmeans = KMeans(n_clusters=n_clusters, random_state=42)
ocr_df['row_num'] = kmeans.fit_predict(ocr_df['y_center'].values.reshape(-1,1))

3. 同一行内按水平位置拼接邻近文本

对每行的文本块按x轴左坐标排序,然后根据水平间距判断是否拼接:

def merge_row_texts(group):
    # 按x轴左坐标升序排序
    sorted_group = group.sort_values('x1').reset_index(drop=True)
    merged_texts = []
    current_text = sorted_group.iloc[0]['text']
    current_x_right = sorted_group.iloc[0]['x2']
    
    # 水平间距阈值:取该行文本块平均宽度的1/5
    avg_width = sorted_group['width'].mean()
    col_threshold = avg_width / 5
    
    for idx in range(1, len(sorted_group)):
        row = sorted_group.iloc[idx]
        # 间距小于阈值则拼接,否则作为新文本块
        if row['x1'] - current_x_right < col_threshold:
            current_text += ' ' + row['text']
            current_x_right = row['x2']
        else:
            merged_texts.append(current_text)
            current_text = row['text']
            current_x_right = row['x2']
    merged_texts.append(current_text)
    return ' '.join(merged_texts)

# 按行分组拼接得到最终结果
final_result = ocr_df.groupby('row_num').apply(merge_row_texts).reset_index(name='merged_text')

关键优化点

  • 动态阈值:行间距和列间距的阈值都基于文本块实际尺寸计算,适配不同仪器显示屏的字符比例差异
  • 聚类分行:避免固定阈值分行的局限性,自动识别不同高度的行
  • 逐行排序拼接:保证文本顺序与屏幕显示完全一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 06:05:20