通过RANSAC找到正弦线

5
我有一组点需要根据它们与相应正弦线的接近程度进行分组。我尝试使用标准的Hough变换来确定这些线,但这并不能解决问题(只检测到少数线条)。
我想测试一下RANSAC是否能更好地检测各种正弦曲线。你有类似算法的示例吗?
我知道RANSAC不是寻找多条线条的最佳工具,所以我会a)找到大多数点拟合的函数;b)迭代搜索,只考虑剩余的点。 enter image description here

3
如果你正在将sin(x)拟合到你的数据中,那么黄色线肯定不会缺失。正弦曲线的“底部”和“顶部”部分肯定不对应同一频率的sin(X*fs) - Ander Biguri
同意@AnderBiguri的观点-如果您想获取该行,则必须在多个频率上运行RANSAC以捕获黄色线。 蓝色线很可能属于一个频率。 - rayryeng
@rayryeng 不仅频率不同,而且形状本身也无法用简单的正弦函数捕捉。在120-160之间的值“转动”非常快,而在40-120之间的值则非常慢。我认为正弦函数将无法适应那个黄色区域。 - Ander Biguri
1
@AnderBiguri - 看起来几乎像是多项式表达式...但是,sin函数也可以被解释为无限多项式的和! - rayryeng
我同意有些非常奇怪。我会再思考一下为什么我有那些几乎对齐但不属于任何拟合线的点。 - albus_c
@albus_c 确保你理解霍夫变换的工作原理。在参数空间中,你将有一个累加器数组,在该数组中,你将有局部极大值。现在,蓝线是属于同一高局部最大值的该数组的箱子。黄点对应于第二个最大值。你要么想做第一个最大值的抑制,要么只是从霍夫变换中返回更多(超过三个)正弦波。尝试后者以查看我是否正确(例如50个正弦波),然后尝试前者,因为它会给你更明智的结果。 - Hennadii Madan
1个回答

0

RANSAC

算法

直到达到内点百分比阈值或测试N个样本组合为止。

  • 随机选择最小的样本来构建或拟合模型。
  • 其他数据点被分类为内点或外点
  • 接受或拒绝模型

输入:

  • 误差容限以确定内点和外点
  • 内点百分比阈值
  • 测试的最大样本组合

可能的改进

  • 确保不会重复测试任何组合
  • 如果有更好的选择组合的方法,请使用该方法。
  • 一旦找到了很多内点,就使用新的内点集进行进一步搜索

来源:Fischler和Bolles - 随机样本一致性:用于图像分析和自动制图的模型拟合范例

您的应用程序

你的模型是一个正弦函数,定义为 f(x) = 振幅 * sin(周期 * x) + 偏移量。拟合这个模型并不容易,因为它依赖于三个参数。我认为这会增加长期风险和过度拟合的可能性。一个可能的解决方案是多次运行算法,使用不同的周期,并保持偏移量和振幅不变。

iterationThreshold = 10000;
iterationCount = 0
errorthreshold = 0.05;

while(numel(inliers(:,1)) > inlierThreshold)

   samples = extractMinimumSamples(points);
   [sineX, sineY] = fitSine(samples);
   inliers = determineInliers(points, SineX, SineY)

   iterationCount = iterationCount + 1;

   if(iterationCount => iterationThreshold)
      break;
   end

end  

请参阅有关此代码修改的可能改进措施


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接