Matlab中的lsqcurvefit函数的使用
lsqcurvefit函数
非线性曲线拟合是已知输入向量xdata和输出向量ydata,并且知道输入与输出的函数关系为ydata=F(param, xdata),但不知道系数向量param,此时可以使用lsqcurvefit函数求得param使得输出的如下最小二乘表达式成立:
min Σ(F(param,xdatai)-ydatai)^2。
lsqcurvefit函数的调用格式:
- 最简单的格式:
param=lsqcurvefit(fun, param0, xdata, ydata) - 高级调用格式——更多输入设置/ 输出信息:
[param, resnorm, residual, exitflag, output] = lsqcurvefit(@fun, param0, xdata, ydata, lb, ub, options)
调用示例
拟合图像三次失真函数
取上述蓝色特征点进行曲线拟合,红色特征点用于验证:
original_data=[90,90;179,90;268,90;356,90; %原始图像蓝色特征点
90,178;179,178;268,178;356,178;
90,267;179,267;268,269;356,267;
90,356;179,356;268,356;356,356];
cubic_data=[54,55;165,68;262,73;356,76; %三次失真图像蓝色特征点
68,165;170,170;265,174;356,176;
73,262;173,264;267,267;356,267;
76,356;176,356;267,356;356,356];
original=[445,90;534,90;445,178;534,178]; %原始图像红色特征点
cubic=[450,73;547,68;448,173;542,170]; %三次失真图像红色特征点
b0=[0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01, ...
0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01]; %初始化参数beta
[b1,r]=lsqcurvefit(@cubic_func,b0,original_data,cubic_data);
disp(b1);
disp(r);
disp(cubic);
disp(cubic_func(b3,original));
自定义三次失真函数cubitc_func.m
function Y=cubic_func(b,x)
m=b(1).*x(:,1).^3+b(2).*x(:,2).^3+b(3).*x(:,1).^2.*x(:,2)+b(4).*x(:,1).*x(:,2).^2+b(5).*x(:,1).^2 ...
+b(6).*x(:,2).^2+b(7).*x(:,1).*x(:,2)+b(8).*x(:,1)+b(9).*x(:,2)+b(10);
n=b(11).*x(:,1).^3+b(12).*x(:,2).^3+b(13).*x(:,1).^2.*x(:,2)+b(14).*x(:,1).*x(:,2).^2+b(15).*x(:,1).^2 ...
+b(16).*x(:,2).^2+b(17).*x(:,1).*x(:,2)+b(18).*x(:,1)+b(19).*x(:,2)+b(20);
Y=[m,n];
end
拟合得到的失真函数:
红色特征点验证拟合效果(上为原始特征点):
图片下载:
链接:https://pan.baidu.com/s/1NpuAys2ACCiOj3_1LBJe_g
提取码:t6s5