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

我想测试RANSAC是否可以更好地检测各种正弦曲线。您是否有类似算法的示例?

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

最佳答案

兰萨克

算法

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

  • 它随机选择最小的样本以构建或拟合模型。
  • 其他数据点被分类为离群值或离群值
  • 该模型被接受或拒绝

  • 输入:
  • 用于确定离群值和离群值的容错性
  • 阈值上限百分比
  • 测试的最大样本组合

  • 可能的改进
  • 确保不对任何组合进行超过一次的测试
  • 如果可以使用更好的方法来选择组合,请使用它。
  • 一旦找到许多内线,请使用一组新的内线进行进一步搜索

  • 来源:
    Fischler and 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
    

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

    关于matlab - 通过RANSAC查找正弦线,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30870904/

    10-11 00:01