【问题标题】:Line Passing Through Given Points通过给定点的线
【发布时间】:2011-04-09 07:47:59
【问题描述】:

我正在尝试在图像的绿色区域中找到对象外线的角度,如上图所示......

为此,我已经扫描了绿色区域并获得了点(如图所示的深蓝色点)...

如你所见,这些点不是直线,所以我不能轻易找到角度。

所以我认为我必须找到一条中间道路 也就是找到线,使每个点和线之间的距离尽可能小。

那么我怎样才能找到这条线,以便每个点都与它有最小距离……?

有什么算法可以解决这个问题,或者除此之外还有什么好的方法吗?

【问题讨论】:

    标签: algorithm math image-processing geometry line


    【解决方案1】:

    显而易见的路线是通过点进行least-squares linear regression

    【讨论】:

    【解决方案2】:

    x 对 y 或 y 对 x 的标准最小二乘回归公式假设一个坐标没有误差,并最小化坐标与直线的偏差。

    但是,完全可以设置最小二乘计算,使得最小化的值是点到线的垂直距离的平方和。我不确定我是否能找到我做数学的笔记本——那是二十多年前的事了——但我确实找到了我当时编写的用于实现算法的代码。

    与:

    • n = ∑ 1
    • sx = ∑ x
    • sx2 = ∑ x2
    • sy = ∑ y
    • sy2 = ∑ y2
    • sxy = ∑ x·y

    你可以计算x和y的方差和协方差:

    • vx = sx2 - ((sx * sx) / n)
    • vy = sy2 - ((sy * sy) / n)
    • vxy = sxy - ((sx * sy) / n)

    现在,如果协方差为 0,那么就没有一条线的相似之处。否则,斜率和截距可以从:

    • 斜率 = 四边形((vx - vy) / vxy, vxy)
    • intcpt = (sy - 斜率 * sx) / n

    其中 quad() 是计算二次方程 x2 + b·x - 1 的根的函数,其符号与 c 相同。在 C 中,这将是:

    double quad(double b, double c)
    {
        double b1;
        double q;
    
        b1 = sqrt(b * b + 4.0);
        if (c < 0.0)
            q = -(b1 + b) / 2;
        else
            q = (b1 - b) / 2;
        return (q);
    }
    

    从那里,您可以很容易地找到线的角度。

    【讨论】:

      【解决方案3】:

      显然这条线将通过平均点 (x_average,y_average)。

      对于方向,您可以使用以下算法(直接从最小化线和点之间的平均平方距离得出):

      dx[i]=x[i]-x_average;
      dy[i]=y[i]-y_average;
      
      a=sum(dx[i]^2-dy[i]^2);
      b=sum(2*dx[i]*dy[i]);
      
      direction=atan2(b,a);
      

      通常的线性回归在这里不起作用,因为它假设变量不是对称的 - 一个依赖于另一个,所以如果你交换 x 和 y,你会有另一种解决方案。

      【讨论】:

        【解决方案4】:

        霍夫变换可能也是一个不错的选择:

        http://en.wikipedia.org/wiki/Hough_transform

        【讨论】:

          【解决方案5】:

          您可能会尝试搜索“总最小二乘”或“最小正交距离”,但当我尝试搜索时,我发现没有立即适用。

          无论如何,假设你有点 x[],y[],线由 a*x+b*y+c = 0 表示,其中 hypot(a,b) = 1。最小正交距离线是最小化 Sum{ (a*x[i]+b*y[i]+c)^2} 的那个。一些代数表明:

          c 是 -(a*X+b*Y),其中 X 是 x 的平均值,Y 是 y 的平均值。

          (a,b) 是 C 的特征向量,对应于它的较小特征值,其中 C 是 x 和 y 的协方差矩阵

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-02-19
            • 1970-01-01
            • 1970-01-01
            • 2018-12-25
            • 2018-07-20
            相关资源
            最近更新 更多