Math 考虑到许多矩形,按直线分组的最佳方法是什么

Math 考虑到许多矩形,按直线分组的最佳方法是什么,math,language-agnostic,geometry,Math,Language Agnostic,Geometry,TLDR:如何找到水平排列的盒子 假设我有这样一张图片的数据: 我们可以直观地看到,我们有两条线: 皮重:11700千克5月16日上午10:40:58 总量:21300公斤12:49:34 8月9日下午 图中显示的每个蓝色框的数据如下: Top 左侧 宽度 高度 方框每个角的坐标(X,Y) 我的主要想法是从我的“网格”的顶部开始,循环遍历y的每个值,然后将它们共享最大数量匹配的“y”值的框分组,但对于一些看似简单的事情来说,这似乎太过分了 真的不知道从这里该去哪里 我能够使用这段

TLDR:如何找到水平排列的盒子


假设我有这样一张图片的数据:

我们可以直观地看到,我们有两条线:

  • 皮重:11700千克5月16日上午10:40:58
  • 总量:21300公斤12:49:34 8月9日下午
图中显示的每个蓝色框的数据如下:

  • Top
  • 左侧
  • 宽度
  • 高度
  • 方框每个角的坐标(
    X
    Y
我的主要想法是从我的“网格”的顶部开始,循环遍历y的每个值,然后将它们共享最大数量匹配的“y”值的框分组,但对于一些看似简单的事情来说,这似乎太过分了

真的不知道从这里该去哪里


我能够使用这段代码(在JavaScript中)将框对齐,它基本上会找到第一个“最左上方”的框,然后找到任何与第一个框中间开始的线“相交”的框

我们不在乎箱子的顺序,所以只要我们在任何一行中从最左边开始,我们就是黄金

function getMostTopLeftBox(boxes) {
  const sorted = boxes.slice()
    .sort(
      (a, b) => {
        if (a.Left === b.Left) {
          return a.Top < b.Top ? -1 : 1;
        }
        return a.Left < b.Left ? -1 : 1;
      }
    );
  return sorted[0];
}

function getAlignedBoxesFromSet(boxes) {
  const mostTopLeftBox = getMostTopLeftBox(boxes);
  const line = mostTopLeftBox.Top + (mostTopLeftBox.Height / 2);
  return boxes
    .filter(({ Top, Height }) => Top < line && (Top + Height) > line)
    .sort(({ Left: a }, { Left: b }) => a < b ? -1 : 1)
}

function getAlignedBoxes(boxes) {
  let remaining = boxes;

  const lines = [];

  const next = () => {
    const line = getAlignedBoxesFromSet(remaining);
    lines.push(line);

    remaining = remaining.filter(box => line.indexOf(box) === -1);

    if (!remaining.length) {
      return;
    }

    return next();
  };

  next();

  return lines;
}
函数getMostTopLeftBox(框){
const sorted=box.slice()
.分类(
(a,b)=>{
如果(a.Left==b.Left){
返回a.TopTopline)
.sort({Left:a},{Left:b})=>a{
常量行=getAlignedBoxesFromSet(剩余);
推(线);
剩余=剩余.filter(box=>line.indexOf(box)=-1);
如果(!剩余长度){
返回;
}
返回next();
};
next();
回流线;
}
上面的代码和上面提供的数据集给了我们

但是,它不考虑框上的微小角度,例如,此图像:


移除敏感信息的不同框的另一个示例:

从上面可以看出,应将以下值视为在同一行上:

  • 产品:[类型]
  • Num Of[type]:0
  • [value]:[value]


我可能会对此提出一个新问题,但部分答案是计算出一条直线的实际曲线,而不仅仅是假设所有直线的中间角都是直线的实际“曲线”,因此如果我从最左边的框开始,然后前进到第二个框,现在我有两条不同的线,我想找到平滑曲线,然后我会用它来找到下一个框,因为我找到了每个框,我想调整这条曲线来找到完整的线,我会进一步研究这一条,如果有人有任何提示,请提一下

我已经设法解决了这个问题,在问题中发布了代码的变体

这是一个解决方案的代码沙盒,我将对此做一个完整的总结,但现在就在这里:

下面是一个基于从所有水平线的角度计算的斜线的分组框的示例,如果所有框都是直的,那么结果将是直线也是直的,因此它应该适用于所有场景

这里还有一个直线的示例:

在与下一个长方体相交之前,可以看到长方体中的线,它每次都这样做,直到找到完整的长方体线(直到不再对齐),这比使用整个数据集的平均角度效果更好


我希望能够为已经找到的框生成一条数学曲线,并将其应用于找到下一个框,但目前,使用前一个框作为锚非常有效

可以查看每个
Top
Top+Height
的间隔,通过计算重叠并相应分组,将其与以前的间隔进行比较?框是否重叠?这些线总是水平的还是可以倾斜的?这些线可以稍微倾斜,我认为有可能重叠,但几乎不会发生,我收到的数据通常与示例类似@投石机我用第一个盒子的中间找到了那条线的“中间线”,然后将其他盒子与之比较,但我觉得我遗漏了一些案例。另一种方法可以做到这一点。。。从一个矩阵开始,通过查看左边最小的
来填写第一列(票价、总额等)。通过查看间隔将每个框分组为列。然后将这些列添加到矩阵中。(从逻辑上讲,这比分析单个行要好。由于角度“轻微”,因此水平变化不应像垂直变化那样大。但同样,这可能不适用于角度>30º的情况。)听起来像是您正在处理的一个很酷的ML项目。:-)绝对是一个很酷的项目。上面发布的图片是一些可以收集到的信息的通用示例,我添加了更多显示更多数据的图片,显示按列组织可能会有点困难。