从 x,y 坐标的 OCR 后按顺序(从左到右)获取数字

Getting digits in an order (left to right) after OCR from x,y coordinates

所以我写了一个 OCR 脚本,它抓取图像并执行 OCR 和 return x,y 坐标与数字,当我绘制它时,我得到了底层图像。

带有数字的 x、y 坐标不是按顺序预测的,而是在检测到轮廓时(几乎是随机的)预测的。

有没有办法让它们以可读的从左到右的顺序排列?

如果您能够获得 x、y 坐标对,则可以先按 y 值排序,然后按 x 值排序。

xy_list = ((2, 1), (1, 2), (0, 1), (1, 0), (0, 0),
           (2, 2), (1, 1), (0, 2), (2, 0))
xy_list = sorted(xy_list, key=lambda tup: (tup[1], tup[0]))
print(xy_list[:3])
print(xy_list[3:6])
print(xy_list[6:])

给予

[(0, 0), (1, 0), (2, 0)]
[(0, 1), (1, 1), (2, 1)]
[(0, 2), (1, 2), (2, 2)]

这不会考虑在同一行上应考虑的 y 值的细微变化,但略微偏离中心。

编辑

这让 y 变化指定的偏移量。 (所以你可以将它设置为 10.0,在你的情况下)。请注意,我使用的是 Python 3,因此如果您使用的是 2,请确保将 offset 设置为浮点数。

offset = .5
xy_list = ((2, 1), (1, 2.1), (0, 1), (1, 0.1), (0, 0),
           (2, 1.6), (1, 1.3), (0, 2), (2, 0.3))
xy_list = sorted(xy_list, key=lambda tup: (
    round(tup[1]/(2*offset)), tup[0]
))

给予

[(0, 0), (1, 0.1), (2, 0.3)]
[(0, 1), (1, 1.3), (2, 1)]
[(0, 2), (1, 2.1), (2, 1.6)]

我不确定我是否理解问题。如果你有一个 (x,y,digit) 形式的元组列表并且你想将它们排序成行,你可以尝试这样的事情:

L = [(1.1,1.4,'2'),(1.3,.1,'3'),(0.1,.1,'1')]
linewidth = 20
L2=  sorted(L, key = lambda coords: ((coords[0]-linewidth/2)%linewidth, coords[1]))
L2
[(0.1, 0.1, '1'), (1.1, 1.4, '2'), (1.3, 0.1, '3')]