在matlab中查找和绘制抛物线

时间:2013-08-06 07:07:05

标签: matlab math

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

的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

  3. 我的抛物线错了。任何帮助将不胜感激。图像为parabola from the equation(blue) plotted on the image(black)

2 个答案:

答案 0 :(得分:2)

我认为你必须在计算a,b和c。

的某个地方进行四舍五入

我使用函数fit(使用fit类型poly2)得到了你提到的三个点,而我的a,b,c是0.0053,-1.6802和254.1895(或者当使用格式为long时添加更多的小数位)。 / p>

同样,当你使用相同的代码时,求解的输出是:

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)。此外,如果我使用您给出的相同代码在原始点上绘制此曲线,则可以正常工作。因此,我能看到的唯一剩余的错误来源是用于从求解的输出中提取a,b和c的值的任何代码中的某种舍入。

答案 1 :(得分:0)

以下作品。 imshow用于交换绘图中使用的纵坐标和横坐标的直观含义的习惯有时会使叠加成为问题。您的问题可能源于您在使用不同功能(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的顺序):

enter image description here