在 Matlab 中测量二次多项式的曲率

A measure for the curvature of a quadratic polynomial in Matlab

我在 Matlab 中使用以下代码绘制二阶多项式:

 xx = 1 : 4000;
 mu =    1.0e+03 * [ 2.0733; 0.6569];
 b = 198;   
 P = [2.5577,   -1.0134,  102.4344];

 figure;imshow(img,'border','tight');
            hold on;
 plot(xx,polyval(P,xx,[],mu)+b,'LineWidth',1.5,'Color','r');

结果如下图:

但是,如果我注释掉 figure;imshow(img,'border','tight'); 它会显示以下曲线:

首先,我不知道为什么这两个图不同,哪个是多项式的正确图。

其次,我为图 1 中所示的对象寻找弯曲程度的度量,以便我能够比较具有低或高弯曲(曲率)的两个对象。但是,我不知道如何从多项式公式中提取这样的度量。我尝试使用x^2的系数(P(2)),但我不确定它是否代表图1中的曲线,因为图2显示了一些不同的东西。

第一部分:如果你指的是曲率符号,你应该注意图像或矩阵中的坐标系以及绘图中的坐标系。当我们 plot 时,就像在您的图中一样,通常左下角对应于 x 轴和 y 轴的最小值。而在 image coordinate system 中,你有这样的东西:

坐标(行列索引)从左上角开始。

两条曲线之间的另一个视觉差异是它们的绝对曲率,这只是由于轴的限制。如果将轴限制设置为相等,您将看到两条同样弯曲的曲线。为此目的使用 xlim and ylim


第二部分:如果要量化施加在系统上的载荷/压力/重量,x^2的系数的绝对值是一个monotonic variable。因此,您可以完全依赖它并通过向系统施加不同的已知压力来校准它。

曲率半径为 (1 + (dy/dx)^2)^3/2 d^2y/dx^2。

或者写成伪代码

     /*
         curvature of ax*x + b*x + c, given x
     */
     curvaturequad(a, b, c, x)
     {
        dybydx = 2*a*x + b;  // first derivative
        d2ybydx2 = 2 * a;    // second derivative

        dybydx2 = dybydx*dybybx;
        numerator = sqrt(dybydx2 + 1)*(dybydx +1);
        return numerator / d2ybydx2;
     }