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

2021-06-11 04:37:53 字數 6144 閱讀 2795

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(想來應該是重力加速度),應該是有意為之的吧?

matlab中我知道多個曲線了,能擬合成一條曲線嗎?求高手

具體問題要具bai體分析,du 你說的太簡單zhi了。不過也是可以解決的。dao 很顯然你內的5條曲線都容 知道了,那在上面取離散點沒問題吧。你在每條曲線上取適量的的點,然後用離散點擬合不就行了。取點有講究,要根據你5條函式的特點。比如有沒有1個x對應多個y的情況,若果有就錯開等距取點。沒有的話就直...

matlab多項式擬合曲線時,為什麼會出現一部分直線一部分是

x 26.3 33.5 39.1 43.1 47.0 50.0 54.5 56.8 64.9 72.0 77.0 y 8.85 8.17 7.49 7.16 6.81 6.58 6.21 5.91 5.48 5.11 5.98 多項式擬bai合 n 1 a polyfit x,y,n n是給定的多d...

曲線擬合之曲線恢復資料?資料擬合得到的曲線方程

杭州希捷行動硬碟維修。杭州希捷行動硬碟維修點,杭州筆記本硬碟維修3,針對希捷硬碟不能啟動 希捷行動硬碟不識別,慈溪硬碟資料恢復,不能格式化 打不開,提示未格式化,檔案目錄損壞 分割槽丟失 檔案丟失 摔壞 不認盤等故障,提供上門現場硬碟維修,恢復資料服務。一 seagate希捷硬碟維修,希捷行動硬碟維...