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

如何对倾斜图像中识别的单行/多行字符按从上到下从左到右排序?

字符识别结果排序解决方案

针对多行字符(含轻微倾斜)的排序问题,直接按y坐标排序失效的核心原因是:同一行字符的y边界/中心可能存在细微偏移,或者图像倾斜导致行的y坐标不规整。以下是落地性强的解决思路和代码示例:

核心步骤

1. 计算字符中心坐标

用边界框的中心替代原始的xmin/ymin,能降低单个字符上下偏移对排序的影响:

df['x_center'] = (df['xmin'] + df['xmax']) / 2
df['y_center'] = (df['ymin'] + df['ymax']) / 2

2. 按行聚类分组

同一行的字符y中心值会高度接近,用聚类算法把这些字符划分到不同行。推荐用DBSCAN(无需预先指定行数,适合倾斜场景下的密度聚类),若能预判行数也可使用KMeans:

from sklearn.cluster import DBSCAN
import numpy as np

# 提取y中心坐标作为聚类特征,reshape成sklearn要求的格式
y_coords = df['y_center'].values.reshape(-1, 1)
# eps控制聚类的距离阈值,需根据字符行间距调整,样例中设为10
dbscan = DBSCAN(eps=10, min_samples=1)
df['row_group'] = dbscan.fit_predict(y_coords)

3. 按行排序+行内按x排序

先按行组序号排序(保证从上到下),每组内按x中心从小到大排序(保证从左到右):

# 先按行组排序,再按x中心排序
sorted_df = df.sort_values(by=['row_group', 'x_center'], ascending=[True, True])
# 输出排序后的字符序列
print('排序结果:', ''.join(sorted_df['name'].tolist()))

针对你提供的样例数据,运行后会得到符合预期的排序结果:DCBA54321。

针对轻微倾斜的额外优化

如果图像存在轻微倾斜,先做倾斜校正会让排序更可靠:

  • 用OpenCV的霍夫变换检测文本行的角度,旋转图像使文本水平
  • 校正后再检测字符边界框,此时行的y坐标会更规整,聚类效果更好

倾斜校正代码示例:

import cv2
import numpy as np

def correct_skew(image):
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    gray = cv2.bitwise_not(gray)
    # 提取边缘
    thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]
    # 检测轮廓坐标
    coords = np.column_stack(np.where(thresh > 0))
    # 计算最小外接矩形的角度
    angle = cv2.minAreaRect(coords)[-1]
    # 调整角度范围至合理区间
    if angle < -45:
        angle = -(90 + angle)
    else:
        angle = -angle
    # 旋转图像完成校正
    (h, w) = image.shape[:2]
    center = (w // 2, h // 2)
    M = cv2.getRotationMatrix2D(center, angle, 1.0)
    rotated = cv2.warpAffine(image, M, (w, h), flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REPLICATE)
    return rotated

校正后的图像再执行字符检测,后续排序流程与前述步骤一致即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 08:32:43