我有一个扫描表面几何形状的线扫描仪输出。通常输出看起来像这样:
x和y轴指的是以mm为单位的坐标系。 (忽略红点)。这些数据本质上是一个二维点云。
所以我想要实现的是检测此扫描的角点。我尝试开始使用图像处理技术,例如使用哈里斯角点检测器。
然而,问题在于这个数据的分辨率高达0.01um,而所有可能的数据点的可能区域大小为140mm×100mm。如果我将其转换为2d图像,它将是一个非常大的文件,大多数像素为空。
我的问题是,有更好的方法来处理这类数据;或者是否有另一种方法来应用哈里斯角等技术而不需要转换成图像。
答案 0 :(得分:0)
如果您知道轮廓点是“按顺序”记录的,例如顺时针方向,您可以执行以下算法而无需转换为图像(否则,请以该形式准备轮廓):
对于闭合轮廓上的每个点(周期性边界条件):通过考虑后面和前面的N个步骤(或者对于不均匀间隔点“至少N个像素距离”的情况)的点来计算局部离散曲率目前的观点。您选择的N确定噪声抑制级别。为了确保它是合适的,为不同的N值做一些类似3D绘图(x,y =点坐标,z =计算曲率)的东西。实际角落应该很好地突出。
对N满意后:在执行步骤1期间,将所有结果记录为例如描述{点坐标,曲率}的元组向量。完成后,按曲率的绝对值(或记录abs(曲率)开始)对矢量进行排序。
逐步调整从最高到最低曲率的矢量。将最高曲率点记录为拐角。对于每个后续的高曲率点,如果在X像素距离内没有记录(相同符号的曲率较高)角,则将其记录为角(这可防止对同一角的双重检测)。 X应该接近N,但如果需要检测间隔很近的S形或M形曲线,则可能需要进行微调。引入一个角点所需的截止最小曲率(取决于你的噪音水平)也是明智的。
如果n =轮廓点数,则曲率计算在O(n)中运行,无需转到图像表示。确定拐角在理论上是最坏情况O(n²),但实际上通常要快得多。后者事实上的性能取决于轮廓上的重要角落的数量(相对较低,从您的描述中),以及可以有效切割角落搜索的噪音水平。
编辑: 如果您正在考虑简化点云以降低复杂性或运行时间,请注意轮廓简化本身已经是O(n * log(n))。根据轮廓的形状和缩小算法的复杂性,与使用大量轮廓点相比,这可能会降低算法速度。