起因:
在沒有看梁昌洪老師的公開課之前,對向量場知識一無所知,碰到泊松融合,泊松重建的文章時非常痛苦。現在將知識慢慢補起來,並用程序可視化,一來鞏固知識,二來了解離散化形式和其實際中遇到的問題。
目的:
從Poisson Surface Reconstruction一文得到啓發。
先模擬一個包含目標點雲的數量場,使得模型點雲的數量值爲1,其他爲0。
通過對此數量場進行一次梯度算子,得到一向量場,也就是其表面內法線估計;
再對此向量場進行一次,得一數量場,也就是表面指示數量場,即數值爲1的點就是表面。
當然其中對比實際和論文有很多簡化和差異,不再贅述。
本文就是一個3D版laplace邊緣檢測,但出發點是矢量場的內容。
步驟:
梯度指向最大變化方向
散度表示源狀態
1.建立模型點雲和數量場
簡單認爲模型就是一個完美球。而我們的點雲也都是網格對齊的。
模型點值爲1,其他爲0。
2.使用得矢量場。
對於離散情況得3D梯度算子,我直接從2D形式推廣,也就是
至於怎麼來得,2D形式推導可參考我之前寫的:
Chango的數學Shader世界(十)流體模擬-有限微分形式
此時,只有模型表面點梯度纔不爲0向量,爲模型表面內法線方向。
在離散情況下,由於我們離散梯度計算的原因,表面“接壤”的黑色層和白色層兩個點梯度都不會爲0.
3.再使用得laplace數量場。
爲什麼我不從一開始的數量場1步推導laplace算子到laplace數量場?
因爲一來可以學會梯度場到數量場的轉換,二來在泊松融合等實際應用中,都是將背景圖的梯度場與ROI的梯度場相加,再的,否則僅用ROI的laplace結果然後加上去邊緣必然無法融合。(3D模型泊松融合也是一樣的道理)。
所以分兩步走是必然的。
那麼怎樣離散的laplace怎麼得到呢?這裏有點繞。
我們知道連續函數有,laplace由三部分相加組成。
現在,嘗試取梯度場的x分量組成數量場,此數量場是,因爲我們的梯度場是。
再求此數量場的梯度,則得梯度場,那我們可以發現,所需的是其第一個分量。
我們再來捋一捋,之前算離散梯度是==。
所以,現在有了梯度場,要求,則只要關心x方向vx1,vx2兩個向量的x值,就是對應離散梯度的x1,x2。
所以計算得(vx2.x-vx1.x)/2。
,同理,最後相加即可。
我畫個圖,可能更加清楚:
結果,laplace數量場中,只有靠近球面的點纔不爲0,模型表面被“標記”了。