【问题标题】:detect point on a curve boundary检测曲线边界上的点
【发布时间】:2017-03-20 21:05:55
【问题描述】:
我有半圆形或椭圆形物体的边界。示例图片为
边界可能略微呈锯齿状(放大时)。我希望在这些曲线上检测一个兴趣点(位置 x 和 y),我们可以在其中看到形状的明确变化,例如
可以有两个输出:
- 没有兴趣点:我们找不到特定的功能
- 具有 x 和 y 位置的兴趣点
目前,我正在使用 Python 和 OpenCV。我想不出一种有效的方法来解决这个问题。任何帮助将不胜感激。
【问题讨论】:
-
欢迎来到 StackOverflow。请阅读并遵循帮助文档中的发布指南。 on topic 和 how to ask 在这里申请。 StackOverflow 不是设计、编码或教程服务。
标签:
python
opencv
curve
smoothing
【解决方案1】:
没有人说其他人会同意我的结束投票,所以...
我建议两个步骤:
- 将椭圆拟合到给定的点。我敢肯定,您现在已经找到了曲线拟合算法(也许还有软件包)——而且 Stack Overflow 上明确禁止要求这些算法。
- 编写一个小型异常检测器,用于处理拟合曲线与实际数据点之间的差异。
第 2 步很大程度上取决于您对“兴趣点”的定义。标准是什么?我注意到您的第二个兴趣点实际上非常接近拟合曲线;这是向内偏离的两侧区域。
我建议您在极坐标中进行拟合,然后根据 theta 和半径考虑结果。将两条曲线“展平”为一个单位,这样中心角 (theta) 就是新的 x 坐标,到中心的距离就是新的 y 坐标。
现在,减去两条曲线并绘制差异(或将这条新曲线存储为点数组)。在这些差异中寻找适当的异常。这是你必须决定你需要什么的地方。也许“r”值有足够的偏差(半径,距中心的距离);也许是梯度的变化(找到一个峰/谷,但不是一个平缓倾斜的凸起)。你想要绝对差异,还是积分偏差(拟合和异常之间的区域)。您想要它是线性的还是平方的......或其他一些函数?异常的宽度是否符合您的标准?
这就是你需要决定的。这会让你动起来吗?