通过RANSAC查找正弦曲线

alb*_*s_c 5 matlab hough-transform ransac

我有一组点,我需要使用它们的附近分组到相应的正弦线.我尝试使用标准Hough变换确定线条,但这并没有解决问题(只检测到几行).

我想测试RANSAC是否能更好地检测各种正弦曲线.你有类似算法的例子吗?

我知道RANSAC不是找到多行的最佳工具,所以我要做的是a)找到适合大多数点的函数; b)迭代搜索,仅考虑其余的搜索.

在此输入图像描述

小智 0

兰萨克

算法

直到达到内点百分比阈值或测试了 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  
Run Code Online (Sandbox Code Playgroud)

另请参阅对此代码的修改可能的改进