2013-08-06 32 views
4

我一直在試圖找到圖像中的拋物線。爲了開始的目的,我用白色背景上的黑色拋物線拍攝了一張圖片。然後,我通過在matlab中查找並繪製拋物線

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

後,我隨意拿了3分從收集和使用使用符號工具箱求解拋物線方程中使用find命令在圖像上的黑色像素

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)=(104137)

%(X1,Y1)=(244161)

%(X2,Y2)=(300229)

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

然後我得到的coeffcients A,B,C作爲

A = 0.0100

B = - 1.6800

c = 254.1900

其中a,b和c是

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

既然現在我已經得到了公式我通過將係數繪製拋物線值 並採取

xx = 1:300; 

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

然後我繪製的拋物線圖像爲

plot(xx,yy,'-'); 

爲確認我已採取正確的分數,我還繪製了選定的點o在圖像中,它們完全躺在圖像中的拋物線上。所以這不是問題。

的問題是:

  1. 我圖(藍色)不在上的圖像(黑色)的拋物線的拋物線。
  2. 當我把x座標的值放在上面的公式中。 y的值與y座標不同。

    爲例如:(104137)

    0.0100 * 104 * 104 * -1.68 104 + 254.19 = 108.16 - 174.72 + 254.19 = 187.63 而它應該是

我的拋物線是錯誤的。任何幫助將不勝感激。圖像是parabola from the equation(blue) plotted on the image(black)

+0

你不明白你在問什麼,特別是沒有告訴你用什麼來產生拋物線(即我們如何重新生成它)以及你如何構建圖像(imshow,plot,...) –

+0

I我問爲什麼藍色拋物線不在黑色拋物線上。 *點是我用來生成係數(a,b,c)的點。黑色拋物線是原始圖像。藍色拋物線就是我用上面給出的第一個等式繪製的。通過放置(a,b,c)來計算y值,並且x值取自1到圖像中列的數量。所以x = 1:300,y = a * x^2 + b * x + c。繪圖是陰謀(xx,yy,' - ') – t0mkaka

+1

我認爲在計算係數時存在一些問題。請更新問題幷包含一些代碼。 (理想情況下,提供三個點的座標和代碼) –

回答

2

我想你一定是在你計算a,b和c的某個地方四捨五入。

我用你提到的使用函數擬合(與擬合類型poly2)和我的a,b,c分別爲0.0053,-1.6802和254.1895(或在使用格式long時添加更多小數位)提到了三點。

同樣,使用相同的你給的代碼時,解決的輸出是:

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

S2 = 

    254.1895 -1.6802 0.0053 

這給了我同樣的A,B和C相契合/ POLY2(剛從看着它, 73/13720的輸出不能是0.01)。另外,如果我使用相同的代碼在原始點上繪製這條曲線,它可以正常工作。所以我可以看到的唯一剩餘的錯誤來源是在你用來從解決方案的輸出中提取a,b和c的值的任何代碼中的四捨五入。

+1

你說得對。我用roundn(a,-2)四捨五入到小數點後兩位。我正在對它進行四捨五入,因爲我正在對拋物線進行隨機化的霍夫變換,並且在比較不同拋物線的係數的雙倍值時存在問題。我非常抱歉,我錯過了四捨五入的部分,因爲我認爲這將是微不足道的。非常感謝 – t0mkaka

+0

@ t0mkaka您可以嘗試在求解之前對方程進行歸一化(去除平均值併除以數據的標準差),這應該使解決方案對於我認爲的截斷更穩健。 –

+1

@TryHArd對公式進行規範化是很好的。謝謝你的提示。 – t0mkaka

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

+1

謝謝你的努力。但@nkjt答案解決了我眼前的問題。我也考慮過matlab中圖像的座標系變化,並做了必要的修改。再次感謝。 – t0mkaka