4

我一直试图在图像中找到抛物线。为了开始的目的,我拍摄了一张白色背景上带有黑色抛物线的图像。然后我使用 find 命令找到了图像上的黑色像素

[yi xi] = find(im<10); % im is the image with black parabola and white background

之后,我从集合中随机抽取 3 个点,并使用符号工具箱求解抛物线方程

syms x y;
%solve them for the parabola equation
A  = [ x^2 x y 1 ;x0^2 x0 y0 1; x1^2 x1 y1 1; x2^2 x2 y2 1];

在哪里

%(x0,y0) = (104,137)

%(x1,y1) = (244,161)

%(x2,y2) = (300,229)

S = solve(det(A),y);

然后我得到系数 a,b,c 为

a = 0.0100

b = -1.6800

c = 254.1900

其中 a、b 和 c 是

a*x^2 + b*x + c = y;

从现在开始,我得到了 eqn,我通过放置系数值并取来绘制抛物线

 xx = 1:300;

 yy = a*xx.^2 + b*xx +c ;

然后我将图像上的抛物线绘制为

 plot(xx,yy,'-');

为了确认我已经采取了正确的点,我还在图像上绘制了选定的点,它们正好位于图像中的抛物线上。所以这不是问题。

问题是:

  1. 我绘制的抛物线(蓝色)不在图像的抛物线上(黑色)。
  2. 当我将 x 坐标的值放入上述等式时。y 的值与 y 坐标的值不同。

    例如:(104,137)

    0.0100*104*104 -1.68*104 + 254.19 = 108.16 - 174.72 + 254.19 = 187.63 而应该是137

我的抛物线是错误的。任何帮助将不胜感激。图像是方程(蓝色)的抛物线绘制在图像(黑色)上

4

2 回答 2

2

我认为您必须在计算 a、b 和 c 时四舍五入。

我使用函数 fit(使用拟合类型 poly2)对您提到的三点进行了尝试,我的 a、b、c 分别为 0.0053、-1.6802 和 254.1895(或者在使用长格式时添加更多小数位)。

同样,当使用相同的代码时,solve 的输出是:

S = (73*x^2)/13720 - (5763*x)/3430 + 87187/343
S2 = double(coeffs(S))

S2 =

  254.1895   -1.6802    0.0053

这给了我与 fit/poly2 相同的 a、b 和 c(仅从外观来看,73/13720 的输出不能为 0.01)。此外,如果我使用您提供的相同代码在原始点上绘制这条曲线,它工作正常。所以我能看到的唯一剩下的错误来源是在你用来从solve的输出中提取a、b和c的值的任何代码中的某种舍入。

于 2013-08-06T09:37:42.770 回答
0

以下作品。使用 imshow 来交换 plot 中使用的纵坐标和横坐标的直观含义的习惯有时会使叠加出现问题。您的问题可能源于您在使用不同功能(imshow 或相关图像显示例程与绘图)进行绘图时如何定义坐标系,特别是图像中原点的位置。这是我的代码:

% create image of parabola
k =[-0.3 10 10];
x = [1:0.1:50];
y = round(k(1)*x.^2 + k(2)*x + k(3));
crd = unique(round([x(:) y(:)]),'rows');
Nx = 100;
Ny = 100;
img = ones(Nx,Ny)*255;
iok = find((crd(:,1)>0) & (crd(:,1)<=Nx) & (crd(:,2)>0) & (crd(:,2)<=Ny));
indx = sub2ind([Nx Ny],crd(iok,1),crd(iok,2));
img(indx) = 0;
imshow(img)

接下来我们拟合抛物线

% pick three points:
x0 = crd(1,1);
y0 = crd(1,2);
x1 = crd(80,1);
y1 = crd(80,2);
x2 = crd(160,1);
y2 = crd(160,2);
% plot these on the original image
hold on
plot(y0,x0,y1,x1,y2,x2,'Markersize',20,'Linestyle','none','Marker','x','Color','r')

如您所示精确求解方程,然后结果是

S = -1094/3627*x^2+12073/1209*x+37415/3627

叠加拟合方程

a= -1094/3627;
b = 12073/1209;
c = 37415/3627;
xx = 1:100;
yy = a*xx.^2 + b*xx +c ;
% then I plot the parabola on the image as
plot(yy,xx,'g--');

一个不太漂亮的图(绿色=适合,红色十字=挑选的点,蓝色=抛物线,没有交换 x 和 y 的顺序):

在此处输入图像描述

于 2013-08-06T09:31:10.170 回答