【问题标题】:Curvature of a one-pixel wide curve一像素宽曲线的曲率
【发布时间】:2018-01-18 13:39:51
【问题描述】:

我有一个 numpy 数组,描绘了 一个像素宽、离散、连接的曲线。该曲线是通过图像处理的骨架化操作得到的。我试图在任意点找到上述曲线的曲率,以检测 bends/kinks(曲率值较高)。

我尝试使用general formula for curvature 实现上述功能。但是,由于这是一条像素化的离散曲线,其生成函数未知,因此我尝试使用 numpy gradient 代替。

我在上面看到的问题是,由于曲线是一个像素宽,所以在任何一点上,斜率只能是 0、1 或 无穷大中的一个。结果,我得到的曲率值大多没有意义或无用。

我正在寻找一些关于从哪里开始以获得平滑曲线的建议,以便我可以以更有意义的方式计算曲率。有人可以建议我可以应用的任何数学运算或卷积来实现相同的目标吗?下面是我拥有的具有代表性的二进制图像。

P.S.我对图像处理非常非常陌生,因此参考标准算法(在数学书籍中)或库实现会很有帮助。

【问题讨论】:

  • 要求澄清一下:当你说你“有一个 numpy 数组描绘一个像素宽......曲线”时,你指的是包含骨架化图像的二维数组,即你发布的图片?或者你的意思是你有一个一维数组,其中包含你已经从二维图像中的骨架像素中提取的片段?
  • @LWixson:numpy 数组是我发布的图像。
  • 您可以尝试circle hough transform,其最大半径等于您的截止曲率半径,然后寻找峰值。
  • 我在this document 中找到了一些可能的算法,并打算尝试一下。

标签: python numpy image-processing computer-vision curve-fitting


【解决方案1】:

一种既定的方法是使用两个或多个相邻点将低阶参数曲线拟合到每个骨架化点。然后使用拟合曲线参数和解析公式计算该点的曲率。可以使用几种曲线模型。两个主要模型是:

  1. 圆。曲率半径,R 是曲率的倒数。对于曲线,它等于最接近该点曲线的圆弧的半径。您可以使用各种方法将圆拟合到一组 2D 数据点。一个已经实现了几个的python库是here
  2. 二次方。这可以拟合到该点及其邻居,然后可以通过曲线here 的二阶微分来估计曲率。您可以使用numpy.polyfit 来拟合此模型。一个简单的策略是首先通过拟合局部线(例如,使用 1 阶曲线的 polyfit)估计该点的切线向量。您旋转这些点以将切线向量与 x 轴对齐。最后,您使用 polyfit 将一维二次 f(x) 拟合到旋转点。

制作任何曲率估计器的棘手之处在于可以在不同的尺度上估计曲率。例如,我是否希望我的估算器对高频细节敏感,或者这实际上是噪声?这个决定体现在邻域大小的选择上。太小,噪声和离散化的误差会导致估计不稳定。但是太大,可能会有很大的建模误差(将曲线近似为参数函数的误差)。通常,您必须自己选择最佳邻域大小。

您还会在连接点获得一些较差的曲率估计值,但这在很大程度上是不可避免的,因为那里的曲率没有很好地定义。一个简单的解决方法是在连接点分割所有路径,然后分别估计每条路径上的曲率。

【讨论】:

    【解决方案2】:

    Toby 对连接点提出了一个很好的建议:检测连接点,并在它们之间独立获取每条线。

    1. 检测连接点(和端点)。这很简单:所有已设置且具有两个以上相邻像素的像素都是连接点。所有已设置且只有一个邻居的像素都是端点。检测所有这些点并将它们的坐标放在一个列表中。

    2. 查找点对之间的线。 从列表中的每个坐标开始,寻找从那里开始的线。请注意,对于连接点,您将至少有三条线从那里开始。如果你这样做,你会发现每行两次。您可以通过反转结束于它们开始位置左侧的线来删除重复项(如果两个端点位于同一图像列上,则将顶部的那个作为开始)。现在它们将可以直接比较,因此您可以删除重复项(或首先不存储它们)。请注意,仅比较起点和终点是不够的,因为您可以有不同的线具有相同的起点和终点。

    3. 跟踪每一行。上述步骤要求您跟踪每一行。看看你能不能猜出来,很有趣! Here is a description of an algorithm 追踪物体的轮廓,你可以以此为灵感,因为这个问题非常相似。为每条线存储一个带有 x 坐标的向量和一个带有 y 坐标的向量。

    4. 平滑线条。 正如您所注意到的,连续步骤位于 8 个方向之一,因此角度非常离散。您可以通过平滑坐标向量来防止这种情况。这是一个快速而肮脏的技巧,但它确实有效。将这些向量视为一维图像,并应用平滑滤波器(我更喜欢高斯滤波器 for many reasons)。在这里,您将具有 x 坐标的向量与具有 y 坐标的向量分开过滤。

    5. 计算曲率。 最后,您可以计算曲线的曲率,如norm of the derivative of the unit normal to the curve。计算导数时不要忘记考虑点之间的距离!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-21
      • 2016-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多