多个二次(或多项式)最小二乘(表面拟合)的代码?

时间:2017-08-08 02:59:35

标签: image-processing curve-fitting least-squares

对于机器视觉项目我试图搜索二次曲面的图像数据(f(x,y)= Ax ^ 2 + Bx + Cy ^ 2 + Dy + Exy + F)。我的计划是迭代数据区域并执行曲面拟合,查看错误,看它是否是连续曲面(这可能表示图像中的特征)。

我以前能够通过采样线在图像数据中找到二次曲线(f(x)= Ax ^ 2 + Bx + C),使用本网站上的公式

http://mathforum.org/library/drmath/view/72047.html

这很有效,很有希望,但是找到形成连续曲面的二维区域对我的任务更有用。

我看到很多文章表明最小二乘回归可以扩展到多个维度,但是我无法找到这个代码。希望有一个"封闭形式" (非迭代,只是从您的数据点计算)解决方案,如上面针对1D数据所述。有没有人知道某些来源或伪代码可以实现这一目标?感谢。

(对不起,如果我的术语有点偏。)

1 个答案:

答案 0 :(得分:2)

我不确定你的背景是什么,但如果你知道一些线性代数,你会发现linear least squares on wikipedia很有用。

让我们看看下面的例子。假设我们有以下图片

enter image description here

我们想知道它在最小二乘意义上如何适合2D二次函数。

解决问题的最简单方法可能是以最小二乘意义计算最佳系数,然后检查错误。

首先我们需要描述矩阵。

X成为包含图像中每个x,y坐标的矩阵,格式为

X = [x1  x1^2  y1  y1^2  x1*y1  1;
     x2  x2^2  y2  y2^2  x2*y2  1;
     ...
     xN  xN^2  yN  yN^2  xN*yN  1];

对于上面的示例图片,X将是100x6矩阵。

y为形式

的矢量中的图像强度值
y = [img(x1,y1);
     img(x2,y2);
     ...
     img(xN,yN)]

在这种情况下,y是100个元素的列向量。

我们希望最小化关于系数向量S的最小二乘目标函数b

S(b) = |y - X*b|^2

其中|.|是L2范数,b是所需系数

b = [A;
     B;
     C;
     D;
     E;
     F]

S(b)的向量导数相对于b,设置为零,并求解b leads to the standard least squares solution

b = inv(X'X)*X'*y

其中inv是矩阵逆,'是转置,*是矩阵乘法。

MATLAB示例。

% Generate an image

% define x,y coordinates for each location in the image
[x,y] = meshgrid(1:10,1:10);

% true coefficients
b_true = [0.1 0.5 0.3 -0.4 0.4 124];
% magnitude of noise
P = 2;
% create image
img = b_true(1).*x + b_true(2).*x.^2 + b_true(3).*y + b_true(4).*y.^2 + b_true(5).*x.*y + b_true(6);
noise = P*randn(10,10);
img = img + noise;

% Begin least squares optimization

% create matrices
X = [x(:) x(:).^2 y(:) y(:).^2 x(:).*y(:) ones(size(x(:)))];
y = img(:);

% estimated coefficients
b = (X.'*X)\(X.')*y

% mean square error (expected to be near P^2)
E = 1/numel(y) * sum((y - X*b).^2)

输出

b =

    0.0906
    0.5093
    0.1245
   -0.3733
    0.3776
  124.5412


E =

    3.4699

在您的应用程序中,您可能希望定义一些阈值,以便在E < threshold时将图像(或图像区域)接受为二次多项式。