三次B樣條曲線擬合演算法

1 三次B樣條曲線方程

B樣條曲線分為近似擬合和插值擬合,所謂近似擬合就是不過特徵點,而插值擬合就是通過特徵點,但是插值擬合需要經過反算得到控制點再擬合出過特徵點的B樣條曲線方程。這裡會一次介紹兩種擬合演算法。首先介紹B樣條的曲線方程。
B樣條曲線的總方程為:P(t)=∑ni=0PiFi,k(t)P(t)=\sum_{i=0}^{n} P_{i}F_{i,k}(t) (1)
其中PiP_i是控制曲線的特徵點,Fi,k(u)F_{i,k}(u)則是K階B樣條基函式。
* 1.1 三次B樣條曲線方程中基函式為*
Fi,k(t)=1k!∑k−im=0(−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)^k (2)
其中(mk 1)\binom{m}{k 1}表示階乘,化成看的明白的式子就是:
這裡寫圖片描述
將圖片上的基函式代入到方程(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) (3)
方程(3)就是三次B樣條曲線方程。

2 三次B樣條曲線近似擬合

近似擬合很簡單。不需要求控制點,求得Fi,k(t)F_{i,k}(t),由上述方程(3),代入P0,P1,P2,P3P_0,P_1,P_2,P_3就可以得到由這四個點近似擬合的一段三次B樣條曲線,起始點在P0P_0,終點在P1P_1,對於閉合輪廓,最後一段可以取前兩點做輔助,擬合實驗結果我最後一塊給出。這種近似擬合曲線光滑,但是最大不足就是不過特徵點,也就是不過PiP_i,需要過點需要反求控制點再擬合。

3 三次B樣條插值擬合

插值擬合較為複雜。其實也不算是很複雜,找資料過程和理解過程是一個複雜的過程。不過有了前面大神做工作,我們只是借用別人的成果寫程式碼就好了。我給大家看一篇論文,大家可以百度或者去知網搜尋,閉合 B 樣條曲線控制點的快速求解演算法及應用。文章講解了反求控制點的具體步驟,寫的非常詳細,基本上貼近程式碼的那種。大家可以根據這篇論文反求控制點,擬合出來的三次B樣條曲線是經過PiP_i的。程式碼就不放了,很多,可以根據我給的那篇論文直接編寫相應程式碼,有問題可以私信我,知無不言。

4 擬合結果

這裡寫圖片描述 原輪廓
這裡寫圖片描述 近似擬合輪廓。可以看到沒過黑色特徵點,只是近似擬合
這裡寫圖片描述 插值擬。可以看到曲線經過黑色特徵點,不過有一些不足之處。

5 總結

三次B樣條曲線擬合輪廓效果還是可以,較之Beizer(可以參考我部落格三次Beizer曲線擬合演算法),B樣條將一些細節描述的很好,很多細節之處都貼近原輪廓,但是有一些不足之處,可以看到對直線擬合效果不是很好。兩篇部落格都是關於閉合輪廓的擬合,對於非閉合或者只是一段曲線擬合,還有一種曲線是很好的,《數值分析》提到過,叫三次樣條插值擬合,擬合效果很好,我做過擬合一元三次方程曲線,擬合效果跟原曲線非常貼近,不過過程中需要用到追趕法,而追趕法需要滿足一個條件,對於閉合曲線三次樣條插值是不滿足這個條件的,所以我沒去深研究,大家可以去試一試。謝謝大家!