Math 考虑到许多矩形,按直线分组的最佳方法是什么
TLDR:如何找到水平排列的盒子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”值的框分组,但对于一些看似简单的事情来说,这似乎太过分了 真的不知道从这里该去哪里 我能够使用这段
假设我有这样一张图片的数据: 我们可以直观地看到,我们有两条线:
皮重:11700千克5月16日上午10:40:58
总量:21300公斤12:49:34 8月9日下午
Top
左侧
宽度
高度
- 方框每个角的坐标(
,X
)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项目。:-)绝对是一个很酷的项目。上面发布的图片是一些可以收集到的信息的通用示例,我添加了更多显示更多数据的图片,显示按列组织可能会有点困难。