5

我有一组点,我需要使用它们与各自正弦线的附近进行分组。我尝试使用标准霍夫变换来确定线条,但这并不能解决问题(仅检测到几条线)。

我想测试一下 RANSAC 是否能更好地检测各种 sin 曲线。你有类似算法的例子吗?

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

在此处输入图像描述

4

1 回答 1

0

RANSAC

算法

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

  • 它随机选择尽可能小的样本来构建或拟合模型。
  • 其他数据点被分类为异常值或异常值
  • 模型被接受或拒绝

输入:

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

可能的改进

  • 确保没有多次测试任何组合
  • 如果可以有更好的方法来选择组合,请使用它。
  • 找到大量内点后,使用一组新内点进行进一步搜索

资料来源:Fischler 和 Bolles - 随机样本共识:用于图像分析和自动制图的模型拟合范式

您的申请

您的模型是定义为 f(x) = 幅度 * sin(period * 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  

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

于 2016-11-07T10:58:01.860 回答