什麼是貝塞爾曲線?
貝塞爾曲線於 1962 年,由法國工程師皮埃爾·貝濟埃(Pierre Bézier)所廣泛發表,他運用貝塞爾曲線來爲汽車的主體進行設計,貝塞爾曲線最初由保爾·德·卡斯特里奧於1959年運用德卡斯特里奧算法開發,以穩定數值的方法求出貝塞爾曲線。
貝塞爾曲線具有很多特殊的性質,在一些領域比如圖形設計中應用十分廣泛,貝塞爾曲線完全由其控制點決定其形狀, n個控制點對應着n-1階的貝塞爾曲線,並且可以通過遞歸的方式來繪製。
一階曲線
一階曲線很好理解, 就是根據t來的線性插值. 表示的是一個向量, 其中和是分別按照這個公式來計算的。
可以看到,一階曲線是一條直線。
二階曲線
既然前面提到遞歸,那麼二階必然和一階有關係,
在平面上三個不共線的三點,依次用線段連接,分別取和兩點,使得,此時又是一條直線,可以按照一階方式來插值了:
三階曲線
二階的貝塞爾通過在控制點之間再採點的方式實現降階, 每一次選點都是一次的降階,三階的也是同理:
這樣通過給定的離散點就能確定它們之間的插值曲線了。
鋼筆工具
貝塞爾曲線在圖形設計的應用中,最典型的就是Photoshop中的鋼筆工具。如下,中間一個節點,兩邊兩個手柄,調節手柄的方向可以控制曲線的走向,調節手柄的長度可以控制曲線的弧度,也就是調節的過程。
熟練運用之後就能繪製複雜的圖形,然後上色即可。
使用python繪製圖像
到這裏開始切入正題了,前面提到既然貝塞爾曲線可以通過公式表示,那麼一定可以通過python實現自動化操作。整體的思路就是給定一個位圖圖像,然後將其矢量化以保存矢量路徑,然後讀取路徑使用貝塞爾曲線勾勒填充就可以了。
位圖矢量化
位圖與矢量圖的一大區別就是位圖圖像進行處理,放大後會出現方塊狀,圖片屬於真彩色,圖片會失真。位圖圖像善於重現顏色的細微層次,能夠製作出色彩和亮度變化豐富的圖像,可逼真地再現這個世界,文件龐大,不能隨意縮放。矢量圖中保存的是線條和圖塊的信息,也就是所謂的路徑,在python中可以藉助Potrace
模塊來完成矢量化的操作。
定義貝塞爾曲線
根據前面的知識定義貝塞爾曲線比較簡單,這裏使用粗暴的函數嵌套方式,感興趣的可以另外改善。
對於複雜的圖像我們一般使用三階以上的曲線描摹,需要定義類似於畫筆的操作,即繪製曲線至(x,y)點,
然後就是其他的線條操作。
繪圖
前面位圖中存取了路徑信息,我們只需要根據相應的路徑使用相應的繪製操作即可,如下
整個繪圖過程可以採用python中的turtle模塊,完成動畫,整個過程約二三十分鐘,一氣呵成,用來描摹心儀的小姐姐最合適不過~,下面放上小姐姐的照片,
然後經過簡單的剪輯配樂,就可以做成日常逗人開心的小視頻了,點擊下面鏈接即可觀看,
用python畫出南方菇涼~