【问题标题】:mapping a curve equation to a staright line equation将曲线方程映射到直线方程
【发布时间】:2014-11-30 20:48:48
【问题描述】:

我不知道这是否可能,但我有一条曲线,我已经找到了该曲线的方程,现在我想将这条曲线上的所有点映射到一条直线。 怎么做?

曲线方程:

K3x^3 + k2x^2 + k1x + k0 = y

那么对应的线方程是什么,它包含曲线中的所有点。 如果我通过使用曲线的端点来制作线方程,那么我如何将该曲线上的所有点映射或拟合到这条线。

例如我附上了一张图片,那么我们可以通过使用某种方程转换将这条曲线变成一条直线。谢谢

我需要将输出转换为下图。

【问题讨论】:

  • 你的意思是你想把一条直线拟合到曲线上吗?如果是,polyfit 函数就是你的朋友 (nl.mathworks.com/help/matlab/data_analysis/…)
  • 我已经使用 polyfit 绘制了这条曲线,并从其他图像中读取点,我想要一个反向方程,它将这个方程映射到直线
  • polyfit 的反面是polyval。但我不知道你想做什么。
  • 嗯,还是不确定我有没有收到你的问题。您是否需要在三阶多项式和直线拟合之间进行解析转换?还是只是直线?
  • @Anshul 您的问题是以您正在搜索某条线的方程式(不在图像上)的方式编写的,但我的印象是您想要找到空间变换(空间曲率)将您的图像转换为直线(也不知道是哪一个),因此请澄清并将丢失的数据添加到您的问题中。理想地编辑图像并为输入曲线和输出线添加点顺序(方向)

标签: matlab math matplotlib curve-fitting scilab


【解决方案1】:

所以我通过简单地从线方程中减去曲线方程来做到这一点,然后我得到了另一个方程(方程减法的结果),我用它来将曲线的所有点映射到线上。

void mapCurvePointsToLine(IplImage *img, double *coeff)
{
        // algo: mapping equation = line equation - curve equation 

        int i, y;
        double m;
        struct points p;
        p.x = malloc(sizeof(*p.x) * img->widthStep);
        p.y = malloc(sizeof(*p.y) * img->widthStep);
        p.np = img->widthStep;


        for( i = 0; i < img->widthStep; i++)  {
                y = round( (pow(i,3)*coeff[3]) + (pow(i,2)*coeff[2]) + (i*coeff[1]) + coeff[0]);

                p.x[i] = i;
                p.y[i] = y;
                img->imageData[(y*img->widthStep) + i] = 255u;
        }   

        //calculate slope and interspect of line
        m =  (p.y[(p.np - 1)] - p.y[0] ) / (p.x[(p.np - 1)] - p.x[0]);
        for( i = 0; i < img->widthStep; i++)  {

                y = p.y[i] + round( (pow(i,3)* (-1 * coeff[3]) ) + (pow(i,2)* ( -1 * coeff[2])) + (i* ( m - coeff[1]) ) ) ; 
                //y = y + round( (pow(i,3)* (-1 * coeff[3]) ) + (pow(i,2)* ( -1 * coeff[2])) ) ;
                img->imageData[(y*img->widthStep) + i] = 255u;
        }   
}

我得到的结果有些失真,可能是因为将计算值四舍五入。查看我附上的输出图像。

【讨论】:

    【解决方案2】:
    1. 任何二维曲线都可以这样表示:

      • p(t)=p0+p1*t+p2*t*t+p3*t*t*t+...
      • 其中p,p0,p1,... 是向量
      • t 是参数&lt;0,1&gt;
      • 你已经有了这个
      • p.x(t)=x0+(x1-x0)*t+0*t*t+0*t*t*t;
      • p.y(t)=k0+k1*t+k2*t*t+k3*t*t*t;
      • 这是一样的...
      • x0,x1 是您的 x 约束
    2. 你想要位于p(0)+(p(1)-p(0))*u;线上的q(p(t))

      • 其中u 是参数&lt;0,1&gt;
      • 所以如果我们假设参数t,u 与曲线到起点的距离成正比
      • 然后u=curve_distance(p(t),p(0))/curve_distane(p(1),p(0));
      • 所以编写函数curve_distance,以间隔
      • 积分路径长度
      • 这就是你所需要的
    3. 曲线距离

      • 首先你需要找到每个点的t参数
      • 一个点总是起点,所以 t0=0
      • 您需要从参数方程和输入点坐标中找到第二个
      • 然后只写循环,用足够小的步长求和距离
      • 或对使用的多项式进行代数求解并直接在 O(1) 中计算

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-03
      • 1970-01-01
      相关资源
      最近更新 更多