當前位置: 華文問答 > 數位

三維重建 3D reconstruction 有哪些實用演算法?

2015-04-26數位

打個擦邊球,最近我lead的國家級大學生創(hua)新(shui)創(xian)業(yu)計畫快結題了,做的是基於 醫學CT切層掃描的肝部三維重建。 最後還要視覺化,就是把肝部的三維模型渲染出來,這樣子的畫我們團隊選擇的解決方案就是 重建出三角形網格 再基於我的迷你3d引擎用傳統方法渲染。

.

1,CT斷層掃描

CT(電子電腦斷層掃描)_百度百科

CT(Computed Tomography),即電子電腦斷層掃描,它是利用精確準直的X線束、γ射線、超音波等,與靈敏度極高的探測器一同圍繞人體的某一部位作一個接一個的斷面掃描,具有掃描時間快,影像清晰等特點,可用於多種疾病的檢查;根據所采用的射線不同可分為: X射線 CT(X-CT)、超聲CT(UCT)以及 γ射線 CT(γ-CT)等。

.

反正要做一次CT掃描,就整個人躺在那,從那個洞裏經過,全身過一遍。然後就能得到全身幾十或者幾百張CT掃描斷層。(想象把一個人切成幾百片吧,但是CT掃描只是像一系列采樣而已,而且數據是灰度圖)

一般的CT圖就長上面的樣子,上面的圖大概就是在腰或者胸附近切的幾刀(= =我也不知是哪,專業人士輕噴)雖然真的CT圖會有更多資訊,但其實就把它當 灰度圖 看就好了,CT值和器官密度什麽的在這個計畫就不管了。

.

.

2,肝部辨識

這個不是本回答的重點,只說兩句。師兄說要像上圖那樣標出目標器官大致區域和前後景區域,然後用openCV裏的GrabCut來把目標區域挖出來,這樣精度會相對高一點。把目標區域挖出來以後就對影像 二值化 再保存成檔, 屬於肝的像素是1,背景是0

!!!!!!!!然後這個才是重點!!!!!!!!!!

.

.

3,基於MarchingCube演算法的三維重建

這個方法最早在1987年就在論文【Marching Cubes : A High Resolution 3D Surface Construction Algorithm】中被Willian E. Lorensen 和Harvey E. Cline共同提出[1],論文裏還特別地提到了一下醫學影像的3d表面重建的基本流程。(ps:這論文到現在已經1.2萬參照了,害怕)因為我看論文並沒有非常仔細,所以有些細節可能跟這篇經典論文有出入,但是大致還是沒問題的,畢竟MarchingCubes演算法 我覺得是一個演算法框架,可以有非常多的變體演算法來適應自己的計畫

首先,Marching Cube有個迷之中文轉譯,叫「 移動立方體演算法 」。所以從名字就能大概能看出了,這個三維重建的演算法是一個 分治 的演算法(divide and conquer)。(雖然「移動」這個詞是有點迷)。

我們先想象一下,用一個超大的長方體 包住目標物體 (就是目標器官必須完全地位於大長方體內部)。再把這個大長方體,分成 A x B x C個一模一樣的小長方體。

其中,每個 平行於水平面的長方體截面就對應著一個CT斷層圖片(的一部份)

上圖是我靈性p的一張示意圖,示意著某個小長方體與和它相鄰兩個CT截面之間的關系。

所以,這個「分而治之」的 基本單元就是一個小立方體 ,這麽做其實相當於是三維空間上的重采樣,所以你要分成多少個長方體其實你可以自己定的。下一個思想也是比較關鍵的,就是 判斷小立方體的8個頂點分別是否在目標器官的內部 。如果某個頂點在物體內部,那麽給這個頂點標上一個0;如果這頂點在物體外部,則給它標上一個1。好了那麽怎麽判斷某個頂點在不在目標器官內部呢?這就用上了 上一個步驟得到的二值化圖 ,直接看圖的對應位置是不是1就好了(剛才不是說了影像處理步驟得到的結果,目標器官的區域的像素就標為1)。

.

之後我們根據圖片判斷出8個頂點的「0」與「1」。排列組合就有2^8=256種情況。每一種情況,我們可以在小立方體內生成一些 等值面 ,或者理解成生成 0個或多個位於立方體內部的三角形 。對,一共有256種局部三角形的組成的情況。

為了針對某個小立方體去生成局部三角形,MarchingCubes非常喪心病狂地做了一件事: 窮舉了256種情況能生成的三角形 。(雖然,這256種情況可以 被概括成15個基本情況 ,基本情況經過旋轉、映像等操作可以生成所有的256種情況)。

上圖就是參照自1987年論文[1]裏面的圖,圖裏描述了15種基本情況。上圖基本說說明了,什麽情況就可以在哪生成三角形。其中 三角形的每個頂點都是在小立方體的棱上 的。於是每 個小立方體都這麽幹,所有小立方體生成的三角形拼在一起就是目標器官的表面了

(ps : 這種窮舉法的描述裏面是會有 二義性(Ambiguity) 的情況存在,在這裏不展開講)

.

論文這麽說是很舒服的,程式碼寫起來一點都不舒服好吧。於是就稍微參考了下VTK (Visualization Toolkit)的MC模組的源碼,可以上github找去,這庫還是很強的。然而看別人程式碼,而且是沒什麽註釋的程式碼真的難受,所以還是自己寫了。 只不過VTK這個模組的程式碼有段很值錢的程式碼,對,就是那個窮舉256種情況的陣列。

上圖我把VTK裏那個珍貴的陣列復制了過來=。=不知道有沒有侵權,噓

仔細把那個陣列和上面論文裏的圖的v1-v8, e1-e12 對比了一下,發現是沒問題的,VTK就是按論文的定義去實作的,註意下標的起始數位就行了。

.

.

4, MarchingCube三維重建效果圖

我的天,醜的嚇人!但是這個醜講道理是不能甩鍋給MarchingCube的,要怪就怪影像辨識做的不怎麽樣:)。(但在MarchingCube演算法生成的模型還是比較多的明顯鋸齒)。

所以最後折衷一下做個網格簡化吧!

好多了好多了!

update1:有個小想法,如果曲面重建的source data是散亂點雲,那可以把三維點正投影到最近的水平切片上,然後用2D Delaunay三角剖分在切片上重建出一個三角形組成的二維填充區域,然後接下來進行上述步驟,感覺也能重建出曲面=。=

.

我寫的MarchingCube演算法程式碼放在了github上:

https:// github.com/CHINA-JIGE/M archingCube

--------------------------------------------------------------------------------

參照:

[1]Lorensen W E, Cline H E. Marching cubes: A high resolution 3D surface construction algorithm[J]. Acm Siggraph Computer Graphics, 1987, 21(4):163--169.