傅立葉變換還能畫簡筆畫?谷歌工程師開發(fā)的這個試玩網(wǎng)站火了| 附資源
曉查 發(fā)自 凹非寺
無論是處理聲音和圖像信號,都必須用到傅立葉變換。其實除了這些“正經(jīng)”用途,它還能做一些有意思的事情。
最近,一位名叫Jez Swanson的谷歌工程師自己寫了篇博客,教你用傅立葉變換畫出任何簡筆畫。目前已在Twitter已經(jīng)收獲了3000+點贊。

什么是傅立葉變換
簡而言之,傅里葉變換是將某些東西分解成一系列正弦波,而正弦波是最簡單的周期函數(shù)。
我們先從一些簡單的例子開始,比如下面的波形可以分解成兩個正弦波。
反過來說,傅里葉變換也是組合波形的一種方式。把這兩個正弦波疊加起來,就得到上方的波形。
即使是看起來并不平滑的方波,也能分解成正弦波。
但是方波和前面波形不同,它在進行疊加操作的時候會有困難。因為方波的成分包含無數(shù)正弦波。但是在現(xiàn)實世界中,我們不可能能疊加無限多的波形。
如果我們截取其中主要的部分,就能得到近似的方波波形。隨著高頻的成分越來越多,圖形也會越來越接近方波。
接下來,我們在互動頁面上隨便畫出一個波形,
通常計算機會離散地記錄下波形上一些點的數(shù)值,然后對它們做傅立葉變換,最終得到的波形與原始波形非常相似
這也是計算機處理聲音的方式,MP3文件就是這么做的。
通常計算機會把聲波存儲為一系列點,點的密集程度決定了舍棄掉多高的頻率。電腦只存儲那些前面低頻部分,忽略聲音里的高頻,這就是MP3壓縮的原理。
從三維角度理解
上面簡單介紹了傅立葉變換的基本知識。如果你學過一點三角函數(shù)的知識,就知道正弦波其實和圓有密切的關(guān)系。
我們一邊畫圓,一邊讓繪制點隨著時間前進,就得到在三維空間中的螺旋線圖像。
它從側(cè)面來看就是正弦波:
疊加的“輪子”
既然正弦波可以理解成圓周運動的投影,那么傅立葉變換就可以理解成不同圓周運動的疊加。
每個輪子的轉(zhuǎn)速代表著頻率,輪子的半徑代表著振幅。
理解了以上內(nèi)容,我們就可以用“三維正弦波”做一些有趣的事情,比如畫一個勝利手勢:
在三維角度看,它是這樣的:
我們可以將簡筆畫視為一個3D圖形。想象一個人正在畫一只手,那么這3D圖形就代表了筆尖位置的變化。x、y維度代表筆尖位置,z維度代表筆尖所在的某個時刻。
在這里,我們使用的是3D螺旋正弦波的組合,來得到我們的圖像。
當我們從正面觀察這個3D圖像時,就會看到許多圓圈的疊加運動。我們把一個圓圍繞另一個圓旋轉(zhuǎn)叫做“本輪”(epicycle)。
和前面疊加出方波一樣。我們只用幾個圓圈就可以很好地逼近簡筆畫。前面的大圓確定圖像的大致形狀,而最后的小圓讓邊緣更銳利。
作者Jez已經(jīng)把它做成Demo放在網(wǎng)站上試玩,還用它畫了一幅自畫像。
△
作者自畫像的傅立葉變換
最后奉上Jez本人照片:
自己動手
如果你覺得很酷炫,可以去Jez的個人博客網(wǎng)站去嘗試。
http://www.jezzamon.com/fourier/index.html
他還公布了交互部分的源代碼。這些交互元素大部分是用JS編寫的。
另外Jez還簡單介紹了傅立葉變換是如何用于JPEG圖像壓縮的,這部分內(nèi)容使用了Python和Jupyter Notebook。并把說明文檔放在了Python文件夾中。
如果你想折騰JPEG圖像壓縮原理的部分,還需要安裝Jupyter,以及NumPy,PIL,SciPy和Matplotlib。
掃描二維碼推送至手機訪問。
版權(quán)聲明:本文由財神資訊-領(lǐng)先的體育資訊互動媒體轉(zhuǎn)載發(fā)布,如需刪除請聯(lián)系。