三維重建移動立方體法(Marching Cubes Algorithm)的查找表的構造

最近在做基於CT的三維重建,準備用Marching cubes算法,實現該算法的難點之一就是查找表的構造,建表我採用了笨辦法,即是一點一點的手動建立,我相信肯定有很多巧辦法來建表,我沒采用的原因是第一,我不想浪費腦細胞在這樣的無關產品性能及算法優劣的次要方面上;第二,我覺得用手動一點一點的建表可以降低該算法中的核心部分的代碼複雜度,使得核心部分處理起來更容易。

一個Cube有8個頂點,每個頂點有Inside和Outside兩種狀態,所以一個Cube裏頭三角片的分佈總共可能有2^8=256種組合。考慮到Rotation和Invertion對稱兩種情況後,可以用15種Basic Cube來覆蓋所有256種可能的情況。

但是僅僅通過這15種cubes來重建三維,會產生漏點的情況這是因爲查找表產生了歧義:

Marching Cubes算法提出不久,就有人發現了它的歧義性。先從2D開始說起。

對上圖的兩種連接方式的不同選擇,在同一張圖像上可導致完全不同的結果。經過觀察我們可知,這種歧義性只發生在:一個面上,如果一條對角線的兩端點大於閾值,另一條對角線的兩端點小於閾值的情況。在立方體中,我們把這種面稱作歧義面。

把這個問題放到3D上就產生了Hole問題。先看Direct類型和它的補充模式Reverse類型。按上面的歧義面定義可知,當我們把兩種類型交錯使用就會產生下圖最左邊所示情況:

 

一種擴展的Marching Cubes算法可以解決這個問題。如下圖:

擴展的Marching Cubes算法雖然並沒有解決歧義性問題,但是很好的防止了漏點。G.M.Nielson等人提出了漸近線判別法。它通過計算等值面與體素邊界面的交線(雙曲線)的漸進線與體素的邊界面的相互位置關係來判斷等值面的正確連接方式。可以解決歧義性問題,本文不打算討論具體的細節,如果對此感興趣請查閱相關的文獻。

【查找表的實現代碼】代碼經過測試。

發佈了31 篇原創文章 · 獲贊 57 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章