paddleocr识别表格文字内容,对表格内容进行从左上到右下排序

背景:

使用paddleocr识别表格图片文字内容,但是由于图片拍摄或扫描角度问题,不一定是水平平衡的,可能存在一定的倾斜角度。

所以如果是仅按坐标从左上到右下进行排序的话,可能本来同一行的文字,被切分成了上下行。

因此需要使用阈值来进行近似判断。下面就是一个可用例子。

def sort_top_left_to_bottom_right(coord_list):
    """
    对识别结果进行预处理,通过阈值进行‘行’划分,实现按区域坐标进行从左上到右下进行排序。
    :param coord_list:[ [[[x1,y1],[x2,y2],[x3,y3],[x4,y4]],(识别结果1)],[[区域2坐标组,(识别结果2)],... ]
    """
    # 定义一个阈值,用于判断两个y坐标是否足够接近以被视为同一行
    y_threshold = 20 # 可以根据实际情况调整

    # 对坐标列表进行初步排序,首先按y1排序,然后按x1排序
    pre_sorted = sorted(coord_list, key=lambda item: (item[0][0][1], item[0][0][0]))
    
    # 对预排序的列表进行分组和最终排序
    final_sorted = []
    current_group = []
    last_y = None

    for item in pre_sorted:
        current_y = item[0][0][1]
        
        if last_y is None or abs(current_y - last_y) <= y_threshold:
            # 如果y坐标足够接近,添加到当前组
            current_group.append(item)
        else:
            # 如果y坐标相差较大,对当前组按x1排序并添加到最终列表
            final_sorted.extend(sorted(current_group, key=lambda x: x[0][0][0]))
            current_group = [item]
        
        last_y = current_y

    # 处理最后一组
    if current_group:
        final_sorted.extend(sorted(current_group, key=lambda x: x[0][0][0]))

    return final_sorted

 

posted @ 2024-07-01 16:02  动灵  阅读(18)  评论(0编辑  收藏  举报