三次B样条曲线拟合算法
1 三次B樣條曲線方程
B樣條曲線分為近似擬合和插值擬合,所謂近似擬合就是不過(guò)特征點(diǎn),而插值擬合就是通過(guò)特征點(diǎn),但是插值擬合需要經(jīng)過(guò)反算得到控制點(diǎn)再擬合出過(guò)特征點(diǎn)的B樣條曲線方程。這里會(huì)一次介紹兩種擬合算法。首先介紹B樣條的曲線方程。
B樣條曲線的總方程為:P(t)=∑i=0nPiFi,k(t)P(t)=\sum_{i=0}^{n} P_{i}F_{i,k}(t)P(t)=∑i=0n?Pi?Fi,k?(t) (1)
其中PiP_iPi?是控制曲線的特征點(diǎn),Fi,k(u)F_{i,k}(u)Fi,k?(u)則是K階B樣條基函數(shù)。
1.1 三次B樣條曲線方程中基函數(shù)為:
Fi,k(t)=1k!∑m=0k?i(?1)m(mk+1)(t+k?m?j)kF_{i,k}(t)=\frac{1}{k!}\sum_{m=0}^{k-i}(-1)^{m}\binom{m}{k+1}(t+k-m-j)^kFi,k?(t)=k!1?∑m=0k?i?(?1)m(k+1m?)(t+k?m?j)k (2)
其中(mk+1)\binom{m}{k+1}(k+1m?)表示階乘,化成看的明白的式子就是:
(
將圖片上的基函數(shù)代入到方程(1)中,就是:
P(t)=P0?F0,3(t)+P1?F1,3(t)+P2?F2,3(t)+P3?F3,3(t)P(t)= P_0*F_{0,3}(t)+P_1*F_{1,3}(t)+P_2*F_{2,3}(t)+P_3*F_{3,3}(t)P(t)=P0??F0,3?(t)+P1??F1,3?(t)+P2??F2,3?(t)+P3??F3,3?(t) (3)
方程(3)就是三次B樣條曲線方程。
2019-04-18 更新
有小伙伴提到上式(2)的j是什么意思,其實(shí)j就是控制點(diǎn)的索引值。這里我把書(shū)上的公式摘抄下來(lái),可能看起來(lái)更為清晰。
參考書(shū)籍:《計(jì)算機(jī)圖形學(xué) 第3版》何援軍 第13章
三次B樣條曲線計(jì)算
F0,3(t)=13!∑j=03(?1)jC4j)(t+3?0?j)3F_{0,3}(t)=\frac{1}{3!}\sum_{j=0}^{3}(-1)^{j}C^{j}_{4})(t+3-0-j)^3F0,3?(t)=3!1?∑j=03?(?1)jC4j?)(t+3?0?j)3
=16[(?1)0C40(t+3)3+(?1)1C41(t+2)3+(?1)2C42(t+1)3+(?1)3C43t3]=\frac{1}{6}[(-1)^{0}C^{0}_{4}(t+3)^{3}+(-1)^{1}C^{1}_{4}(t+2)^{3}+(-1)^{2} C^{2}_{4}(t+1)^{3}+(-1)^{3}C^{3}_{4}t^{3}]=61?[(?1)0C40?(t+3)3+(?1)1C41?(t+2)3+(?1)2C42?(t+1)3+(?1)3C43?t3]
=16(?t3+3t2?3t+1)=16(1?t)3=\frac{1}{6}(-t^{3}+3t^{2}-3t+1)=\frac{1}{6}(1-t)^{3}=61?(?t3+3t2?3t+1)=61?(1?t)3
F1,3(t)=13!∑j=02(?1)jC4j)(t+3?1?j)3F_{1,3}(t)=\frac{1}{3!}\sum_{j=0}^{2}(-1)^{j}C^{j}_{4})(t+3-1-j)^3F1,3?(t)=3!1?∑j=02?(?1)jC4j?)(t+3?1?j)3
=16[(?1)0C40(t+2)3+(?1)1C41(t+1)3+(?1)2C42t3]=\frac{1}{6}[(-1)^{0}C^{0}_{4}(t+2)^{3}+(-1)^{1}C^{1}_{4}(t+1)^{3}+(-1)^{2} C^{2}_{4}t^{3}]=61?[(?1)0C40?(t+2)3+(?1)1C41?(t+1)3+(?1)2C42?t3]
=16(3t3?6t2+4)=\frac{1}{6}(3t^{3}-6t^{2}+4)=61?(3t3?6t2+4)
F2,3(t)=13!∑j=01(?1)jC4j)(t+3?2?j)3F_{2,3}(t)=\frac{1}{3!}\sum_{j=0}^{1}(-1)^{j}C^{j}_{4})(t+3-2-j)^3F2,3?(t)=3!1?∑j=01?(?1)jC4j?)(t+3?2?j)3
=16[(?1)0C40(t+1)3+(?1)1C41t3=\frac{1}{6}[(-1)^{0}C^{0}_{4}(t+1)^{3}+(-1)^{1}C^{1}_{4}t^{3}=61?[(?1)0C40?(t+1)3+(?1)1C41?t3
=16(?3t3+3t2+3t+1)=\frac{1}{6}(-3t^{3}+3t^{2}+3t+1)=61?(?3t3+3t2+3t+1)
F3,3(t)=13!∑j=00(?1)jC4j)(t+3?3?j)3F_{3,3}(t)=\frac{1}{3!}\sum_{j=0}^{0}(-1)^{j}C^{j}_{4})(t+3-3-j)^3F3,3?(t)=3!1?∑j=00?(?1)jC4j?)(t+3?3?j)3
=16[(?1)0C40t3=\frac{1}{6}[(-1)^{0}C^{0}_{4}t^{3}=61?[(?1)0C40?t3
=16t3=\frac{1}{6}t^{3}=61?t3
2 三次B樣條曲線近似擬合
近似擬合很簡(jiǎn)單。不需要求控制點(diǎn),求得Fi,k(t)F_{i,k}(t)Fi,k?(t),由上述方程(3),代入P0,P1,P2,P3P_0,P_1,P_2,P_3P0?,P1?,P2?,P3?就可以得到由這四個(gè)點(diǎn)近似擬合的一段三次B樣條曲線,起始點(diǎn)在P0P_0P0?,終點(diǎn)在P1P_1P1?,對(duì)于閉合輪廓,最后一段可以取前兩點(diǎn)做輔助,擬合實(shí)驗(yàn)結(jié)果我最后一塊給出。這種近似擬合曲線光滑,但是最大不足就是不過(guò)特征點(diǎn),也就是不過(guò)PiP_iPi?,需要過(guò)點(diǎn)需要反求控制點(diǎn)再擬合。
3 三次B樣條插值擬合
插值擬合較為復(fù)雜。其實(shí)也不算是很復(fù)雜,找資料過(guò)程和理解過(guò)程是一個(gè)復(fù)雜的過(guò)程。不過(guò)有了前面大神做工作,我們只是借用別人的成果寫(xiě)代碼就好了。我給大家看一篇論文,大家可以百度或者去知網(wǎng)搜索,閉合 B 樣條曲線控制點(diǎn)的快速求解算法及應(yīng)用。文章講解了反求控制點(diǎn)的具體步驟,寫(xiě)的非常詳細(xì),基本上貼近代碼的那種。大家可以根據(jù)這篇論文反求控制點(diǎn),擬合出來(lái)的三次B樣條曲線是經(jīng)過(guò)PiP_iPi?的。代碼就不放了,很多,可以根據(jù)我給的那篇論文直接編寫(xiě)相應(yīng)代碼,有問(wèn)題可以私信我,知無(wú)不言。
##4 擬合結(jié)果
原輪廓
近似擬合輪廓。可以看到?jīng)]過(guò)黑色特征點(diǎn),只是近似擬合
插值擬。可以看到曲線經(jīng)過(guò)黑色特征點(diǎn),不過(guò)有一些不足之處。
##5 總結(jié)
三次B樣條曲線擬合輪廓效果還是可以,較之Beizer(可以參考我博客三次Beizer曲線擬合算法),B樣條將一些細(xì)節(jié)描述的很好,很多細(xì)節(jié)之處都貼近原輪廓,但是有一些不足之處,可以看到對(duì)直線擬合效果不是很好。兩篇博客都是關(guān)于閉合輪廓的擬合,對(duì)于非閉合或者只是一段曲線擬合,還有一種曲線是很好的,《數(shù)值分析》提到過(guò),叫三次樣條插值擬合,擬合效果很好,我做過(guò)擬合一元三次方程曲線,擬合效果跟原曲線非常貼近,不過(guò)過(guò)程中需要用到追趕法,而追趕法需要滿(mǎn)足一個(gè)條件,對(duì)于閉合曲線三次樣條插值是不滿(mǎn)足這個(gè)條件的,所以我沒(méi)去深研究,大家可以去試一試。謝謝大家!
-------------------------------------------------2018-10-30--------------------------------------------
真的很感謝大家的支持,這一年都比較忙,找實(shí)習(xí)and找工作,而且這個(gè)東西是研一上學(xué)期搞的,現(xiàn)在看都毫無(wú)印象,對(duì)自己說(shuō)一句:牛逼。我把代碼放在網(wǎng)盤(pán)了(能運(yùn)行,但現(xiàn)在沒(méi)效果,大家可以檢查下,之前是OK的),本來(lái)想上傳到CSDN,好像要C幣,而且要審核,太墨跡了。
鏈接: https://pan.baidu.com/s/1mSQMmvL71gwEAqgiT6O9Gg 提取碼: xv5f
總結(jié)
以上是生活随笔為你收集整理的三次B样条曲线拟合算法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。