按坐标从左到右从上到下对对象进行排序

问题描述 投票:0回答:1

我正在编写一个小程序,可以识别网络摄像头中的字符。符号有两种类型:单线和双线。它看起来像这样: First example

我需要将所有识别的字符从左到右从上到下排列,即像这样: Second example

如果单行照片一切都清楚:我们只是按 x 坐标排序,那么我在处理两行照片时就会遇到困难。我试图编写一个简单的按类型排序,如下所示:

sorted_df = df.sort_values(by=['x', 'x'], ascending=[False, True])

但这样的决定往往是错误的。问题还在于带有符号的输入图像可能有轻微的角度。

输入看起来像这样。我用 panda 来和他们一起工作。

import pandas as pd

data = {
        "xmin": [73.728722, 58.541206, 43.370064, 18.349848, 84.141769, 74.219193, 63.876919, 32.109692, 13.477271],
        "ymin": [9.410283, 10.085771, 10.857979, 12.260820, 36.286518, 36.769310, 37.599922, 39.808289, 40.412071],
        "xmax": [85.914436, 70.791809, 56.026375, 33.629444, 92.453529, 82.558533, 72.851395, 47.012421, 27.849062],
        "ymax": [29.401623, 29.874952, 31.069559, 32.480732, 51.482807, 51.720161, 52.238033, 58.858406, 59.132389],
        "name": ["A", "B", "C", "D", "1", "2", "3", "4", "5"]
    }

df = pd.DataFrame(data) 

有没有人有一个简单有效的解决方案?我应该朝哪个方向发展?我将非常感激!

python numpy sorting coordinates coordinate-systems
1个回答
0
投票

假设你的倾斜角度不是太大,即第一行的字符总是明显高于第二行的字符:

  • 您可以先按
    ymin
    对数据进行排序。
  • 然后,您可以通过检查
    ymin
    的排序值中的大跳转来检测到第二行的跳转(或是否存在第二行)。阈值取决于您的数据。根据您的示例,您可以使用
    (ymax - ymin)
    的平均值或其中的某一部分作为动态阈值。
  • 对于该行中的每个字符,您可以简单地按 x 值排序。

如果上述关于倾斜角度的假设无效,我会建议进行一些预处理。这应该相对容易,因为您期望值位于不同的行中,因此您可以[“旋转”您的 x/y 值一定角度],直到连续字符的 y 值几乎没有变化(除了一个潜在的相对行之间有较大的跳跃)。 1

© www.soinside.com 2019 - 2024. All rights reserved.