基于坐标分组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
相关产品推荐
相关产品推荐

