所以我写了一个OCR脚本,它抓取图像并执行OCR并返回带有数字的x,y坐标,当我绘制它时,我得到底层图像。
不会按顺序预测带有数字的x,y坐标,但会检测到轮廓(几乎是随机的)。
有没有办法让他们按照从左到右的顺序排列?
答案 0 :(得分:1)
如果能够获得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 = .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)]
答案 1 :(得分:1)
我不确定我是否理解这个问题。如果你有(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')]