如何根據matlab擬合的曲線讀出影象中點的座標值

時間 2021-06-11 15:20:59

1樓:匿名使用者

樓主的意思是:已知**上的一條曲線,如何獲取該曲線上點的座標(x,y)。

下面有段程式,是本人讀曲線座標所寫,看看對樓主是否有幫助:

clcclear all

im1 = imread('runx2.jpg'); %樓主在此替換成自己的**.

im = rgb2gray(im1);

im = im(end:-1:1,:);

%imshow(im)

[m,n]=size(im);

cordx=;

cordy=;

for i=1:m

for j=1:n

if im(i,j)<100 %這個引數100可以在 0~255 之間隨意改變,值越小越精確.

cordx=[cordx i];

cordy=[cordy j];

endend

endx=;y=;%得到的座標

l=2;%此處引數可調

for k=1:l:length(cordx)x=[x cordx(k)];

y=[y cordy(k)];

end[xx ind]= sort(y);

yy = x(ind);

plot(xx,yy,'+')

*** = unique(xx);

yyy = zeros(size(***));

for k = 1:length(***)indxx = xx==***(k);

n = sum(indxx);

yyy(k) = sum(indxx.*yy)/n;

endfigure

plot(***,yyy,'+')

runx2 = [***' yyy'];

2樓:

你好你可以使用

[x,y]=ginput

回車以後你就可以輸出改點的x,y座標了

希望對你有幫助

3樓:

曲線方程都有了,那輸入、輸出(座標點)應該可以計算出來的。

還是我對你的問題沒有理解了?

4樓:匿名使用者

以取點座標的方式,把曲線匯出來。先把擬合的曲線儲存在workspace裡, 然後x=[1 2 3 4 5], (確保取值在x 區間內)再求y=fittedmodel(x) 就能知道擬合曲線的座標啦

matlab中怎樣從曲線中獲得精確的座標值~~~~~~~~~~~~~~

5樓:匿名使用者

提供幾種不同的做法,供參考。

方法1:

*****

直接從繪圖資料插值(經檢驗z資料是單調增加的),**如下:

syms x y z

eq1=-2.*pi.*0.

05415.*0.0000002.

*sin(x).*sin((5.*pi.

/6)+x)-4./3.*pi.

* ...

0.0000002.^3.

*2000.*z.*9.

8+2./3.*pi.

*z.*9.8.

*0.0000002.^3.

* ...

(1820-1000).*(cos(x)).^3-2./3.*pi.*z.*9.8.*0.0000002.^3.* ...

(1820+1000)-pi.*z.*9.8.*0.0000002.^2.*(y+0.0000002.*cos(x)).* ...

(1820-1000).*(sin(x)).^2;

eq2=-sin((5.*pi./6)+x).*besselk(0,(z.*9.8.*(1820-1000)./0.05415).^ ...

0.5.*0.

0000002.*sin(x))+(z.*9.

8.*(1820-1000)./0.

05415).^0.5.

* ...

y.*besselk(1,(z.*9.

8.*(1820-1000)./0.

05415).^0.5.

*0.0000002.*sin(x));

z=solve(eq1,z);

eq=subs(eq2,z,z);

h=ezplot(eq,[0.52 0.5245],[-1e-9 0]);

x=get(h,'xdata');

y=get(h,'ydata');

view(-10,35)

grid on

zz=subs(z,,);

x(zz>20000)=;

y(zz>20000)=;

zz(zz>20000)=;

set(h, 'xdata', x, 'ydata', y, 'zdata', zz, 'linewidth', 2);

title('')

zlabel('z')

axis tight

box off

zi = [1 10 100 1000 5000 10000 19000 20000];

xi = interp1(zz, x, zi, 's');

yi = interp1(zz, y, zi, 's');

vpa([xi; yi].',10)

舉例:------

上面的**中z分別取[1 10 100 1000 5000 10000 19000 20000],得到的結果如下(每行代表一組對應的x、y):

[      .5235988072,  .1770687259e-12]

[      .5235990919, -.3682753278e-13]

[      .5236019385, -.2134703182e-11]

[      .5236304028, -.2157265249e-10]

[      .5237568792, -.9522223488e-10]

[      .5239149030,  -.1794854554e-9]

[      .5241991463,  -.3217413726e-9]

[      .5242307131,  -.3370566367e-9]

把資料代回方程,看一下精度:

>> eq = subs([eq1; eq2], , )

eq =

1.0e-005 *

0.0000   -0.0000   -0.0000   -0.0000    0.0000   -0.0000   -0.0000   -0.0000

0.2096    0.2519    0.3885    0.0182    0.0055    0.0072    0.0034   -0.0010

>> norm(eq)

ans =

5.0868e-006

說明:------

(1)你所貼**的前半部分本來用於說明兩個曲面相交的,如果只畫線,該部分屬於多餘;

(2)順便修正一點小錯誤——原**的這兩句有點小問題:

x(z>20000)=nan;

y(z>20000)=nan;

我上次還有點奇怪,為什麼座標範圍看上去不太對勁,但沒有深究。剛才發現是這兩句寫錯了,x、y應該是大寫的。另外,現在為符合插值的需要應把右側nan改為空矩陣()。

(3)有多種插值方法可用,我使用了最有利於平滑曲線的樣條插值,樓主也可以試試其它做法。

(4)注意z0取值的範圍最好不要超過[min(z) max(z)]=[8.45 19943],如果超出該範圍,部分方法需要通過引數指定允許interp1外插(預設情況下,樣條插值允許外插,但線性插值不允許)。

(5)由於方法本身是基於部分離散點資訊得到未知點的,所以很難說是否能保證精度。

(6)相容性:這裡的繪圖**在2007b上測試沒問題,但在6.5上不行,更高版本沒試,也可能會有問題。

方法2:

*****

從原始問題出發,直接解方程,**如下:

syms x y z

eq1=-2.*pi.*0.

05415.*0.0000002.

*sin(x).*sin((5.*pi.

/6)+x)-4./3.*pi.

* ...

0.0000002.^3.

*2000.*z.*9.

8+2./3.*pi.

*z.*9.8.

*0.0000002.^3.

* ...

(1820-1000).*(cos(x)).^3-2./3.*pi.*z.*9.8.*0.0000002.^3.* ...

(1820+1000)-pi.*z.*9.8.*0.0000002.^2.*(y+0.0000002.*cos(x)).* ...

(1820-1000).*(sin(x)).^2;

eq2=-sin((5.*pi./6)+x).*besselk(0,(z.*9.8.*(1820-1000)./0.05415).^ ...

0.5.*0.

0000002.*sin(x))+(z.*9.

8.*(1820-1000)./0.

05415).^0.5.

* ...

y.*besselk(1,(z.*9.

8.*(1820-1000)./0.

05415).^0.5.

*0.0000002.*sin(x));

zi = [1 10 100 1000 5000 10000 19000 20000];

xi = sym( zi*0 );

yi = xi;

for i = 1 : length(zi)

z0 = zi(i);

[xi(i), yi(i)] = solve(subs(eq1,z,z0), subs(eq2,z,z0));

endvpa([xi-2*pi; yi].',10)

舉例:------

與方法1 的測試用例相同,得到的結果如下:

[       .523598806, -.3251499235e-13]

[       .523599091, -.2887359289e-12]

[       .523601938, -.2523219710e-11]

[       .523630402, -.2159081181e-10]

[       .523756878, -.9522774887e-10]

[       .523914902,  -.1794926954e-9]

[       .524199145,  -.3217447875e-9]

[       .524230712,  -.3370556700e-9]

同樣,檢驗一下精度:

>> eq = subs([eq1; eq2], , );

>> eq=double(eq)

eq =

1.0e-018 *

0.0000    0.0000    0.0000    0.0000    0.0000    0.0000    0.0000    0.0000

0.0000    0.0002    0.0021    0.0182    0.0812    0.1539    0.2774    0.2907

>> norm(eq)

ans =

4.3823e-019

說明:------

(1)由於求解方程組得到x總是位於要求的座標範圍之外,所以把它減小2*pi。

(2)這種方法需要符號數學工具箱的支援,精度遠高於前一種方法。

(3)相容性:用solve解方程的結果可能和符號數學工具箱版本相關,我用maple核心的6.5和2007b做了測試,可以求出想要的結果,但在mupad核心的版本上可能會有問題。

方法3:

*****

使用數值方法解方程。本來以為第2種方法有些條件下會失效,所以考慮這種做法,但從實際情況看,方法2的效果很好,所以,這個就不做了。

***********************************=

最後,八卦幾句:

已經多次回答樓主的問題了,有點好奇您是從**找到這麼多複雜的表示式要求解的,和您的工作有關嗎?而且難得的是,問題看上去雖然比較複雜,但根據樓主提供的資訊,剛好都是可以求解的,簡直就像是考試的試題一般。

順便說一下,我注意到,這次的方程與上次我回答的問題相比,有7處由9.78換成了9.8(想來應該是重力加速度),應該是有意為之的吧?