找到非常规二维形状的最长完全内部线的算法?

Posted

技术标签:

【中文标题】找到非常规二维形状的最长完全内部线的算法?【英文标题】:Algorithm to find the longest fully-internal line of a non-regular 2D-shape? 【发布时间】:2015-10-06 05:27:04 【问题描述】:

我最近一直在做一些图像处理,并且正在寻找一种算法来确定完全在非常规形状内的最长线段。换句话说,线段应该是在其端点难以捉摸地接触形状的最长线段。

形状可以表示为一组 (x,y) 坐标或二进制数组。像素的最外层(边缘)已经确定。 一个简单的例子是一个椭圆,它的解是长轴。一个更复杂的例子是等边三角形,它会在两个像素之间形成一条线,这两个像素紧邻两个单独的角。我的大部分形状都是椭圆形或“蠕虫状”(长而波浪形)。

最终,我希望将其用作将“蠕虫状”形状划分为段的方法,使用一系列大致垂直于这条线的“切口”。我希望这条消息形成的线比回归确定的线更适合这项任务。应该注意的是,这些形状是高分辨率的,因此可能包含多达 1000 个边缘像素,这就是我试图避免使用简单的迭代/蛮力方法的原因。

感谢您的任何建议!

以下是一些可视化:

【问题讨论】:

您能否澄清一下,当可能有多行时,您将如何对最长的行进行排序? 这听起来与Feret diameter 的最大值相似,后者是particle-based metrics 中的一个。也称为maximum caliper diameter。 @RogerRowland:“完全内部”约束使它成为一个不同且更难的问题。 @YvesDaoust 这就是我评论而不是回答的原因。 OP的问题实际上听起来可能不需要考虑非凸形状的复杂性。似乎所需要的只是找到二维点云主轴的法线。我的评论旨在提供帮助。 这将是一个非常好的问题,如果您可以添加一个示例图像(或数据),以便人们可以使用一些东西,而另一个您可以指示预期结果。 【参考方案1】:

我不确定我的想法是否完全正确,但对我来说这听起来像是 PCA 问题,或者在计算机图形学中是面向对象的边界框问题。

例子:

该框的最长轴将是您的最长线。

网上有很多关于如何计算这个盒子的教程,但是步骤很简单:

    计算点的 PCA 计算您的点在第一个主成分上的投影 获取最大值-最小值 将特征空间中的 (max,0,0) 和 (min,0,0) 重新投影到 XYZ 在它们之间划一条线

请注意,这仅适用于凸形图形。一个椭圆体,三角形对此是可以的,但它会计算一个“L”形几何对象的对角线。如果您知道您的对象将是凸的,那么这是获得“最长内部线”的最快和最简单的方法(因为如果它是凸的,则点之间的所有线都是“内部”)。如果您的对象是非凸的,那么您需要以某种方式将它们分成凸子部分,例如正如@imaluengo 所建议的那样。

【讨论】:

【参考方案2】:

我相信,如果我正确理解了这个问题,在计算机视觉文献中,类似于您试图实现的目标称为平面形状分解。它并不完全相同(不是在形状中找到最长的线),而是一种将形状分解成行分隔的有意义片段以供以后形状使用的方法-分析或形状匹配操作(这可能对您想要的有用)。

下面是从后面引用的论文 (1) 中提取的示例图像:

如果这是您想要实现的(或多或少),请查看以下论文以了解计算形状分解的方法(并参阅参考书目了解其他方法):

(1) 平面形状分解变得容易: http://bmvc2015.swansea.ac.uk/proceedings/papers/paper013/index.html

【讨论】:

优秀的参考,这完美地解决了我更大的问题,同时满足了我的“蠕虫”标准,这是隐含的非凸的。

以上是关于找到非常规二维形状的最长完全内部线的算法?的主要内容,如果未能解决你的问题,请参考以下文章

找到顶点边缘(多边形)的最佳算法

由点指定的两条无限线的交点

计算几何问题汇总--点与线的位置关系

加速算法在两个二维点数据集中找到最接近的项目

如何在二维矩阵中找到孔?

51nod 1376: 最长递增子序列的数量(二维偏序+cdq分治)