版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
醫(yī)學(xué)圖像三維重建技術(shù)的研究
0醫(yī)學(xué)圖像可視化科學(xué)可視化(vics)是計算機圖形和數(shù)據(jù)處理技術(shù)的一個重要研究方向。事實上,將任何抽象的事物、過程用圖形圖像表示出來都可以稱為可視化。作為科學(xué)術(shù)語,“可視化”一詞正式出現(xiàn)于1987年2月美國國家基金會(NationalScienceFoundation,NSF)召開的一個專題研討會上。醫(yī)學(xué)圖像可視化是科學(xué)計算可視化中的一個重要領(lǐng)域。在醫(yī)學(xué)領(lǐng)域中,CT和MRI產(chǎn)生出大量的二維圖像數(shù)據(jù)。所謂醫(yī)學(xué)圖像可視化,就是把由CT、MRI等數(shù)字圖像成像技術(shù)所獲得的人體信息在計算機上直觀地表現(xiàn)為三維效果,從而提供傳統(tǒng)手段無法獲得的結(jié)構(gòu)信息,有很高的臨床價值。因此,由二維斷層圖像重建三維醫(yī)學(xué)圖像,構(gòu)建醫(yī)學(xué)可視化系統(tǒng)在醫(yī)學(xué)可視化領(lǐng)域中具有重大的意義及應(yīng)用價值??梢暬ぞ甙?VisualizationToolKit,VTK)是目前醫(yī)學(xué)可視化領(lǐng)域中使用最廣泛的可視化開發(fā)工具。VTK是在三維函數(shù)庫OpenGL的基礎(chǔ)上利用面向?qū)ο蠹夹g(shù),設(shè)計和實現(xiàn)的可視化開發(fā)庫。它把可視化開發(fā)過程中經(jīng)常遇到的細節(jié)屏蔽起來,并將一些常用的算法封裝成類的形式供開發(fā)者使用(如本文將提到的MarchingCube算法,封裝成vtkMarchingCubes類)。VTK是一個開源、自由獲取的、支持多平臺的軟件系統(tǒng),由美國的Kitware公司負責(zé)維護。目前最新的版本是VTK5.4.2。由于VTK是開放式的免費軟件,而且具有強大的三維圖形圖像處理功能,良好的體系結(jié)構(gòu)和高度的靈活性、可移植性,目前在美國、西歐等各個高校、研究所已經(jīng)得到廣泛的應(yīng)用。在美國的某些大學(xué)里就有專門的教材用于高校教學(xué)。雖然VTK在歐美已經(jīng)十分流行,但其在國內(nèi)的發(fā)展卻不容樂觀,這些都應(yīng)該引起有關(guān)部門和高校的重視。國內(nèi)的浙江大學(xué)、清華大學(xué)、東南大學(xué)、中科院自動化所等在醫(yī)學(xué)圖像三維重建及可視化研究方面均做出了大量研究,開發(fā)了一些實驗系統(tǒng)。但目前國內(nèi)尚無成熟的商用系統(tǒng)。因此,開展這方面的研究,具有重要理論意義和廣闊的應(yīng)用前景。MFC是Windows下一套完整的C++ApplicationFrameworks[9,P246],與Windows系統(tǒng)的結(jié)合最為緊密且使用廣泛,另外它更有強大的UI開發(fā)能力,可利用它開發(fā)出專業(yè)級的軟件。VTK和MFC結(jié)合編程實現(xiàn)醫(yī)學(xué)圖像的可視化,能發(fā)揮各自的優(yōu)勢與性能,容易開發(fā)出功能完善、性能極佳的醫(yī)學(xué)可視化軟件。本文將實現(xiàn)VTK和MFC兩者的混合編程,實現(xiàn)面繪制技術(shù)中的MC算法以及體繪制中的光線投射法(RayCasting)。1可視化網(wǎng)絡(luò)的建立構(gòu)成VTK的兩個對象模型分別是圖形模型和可視化模型。其中圖形模型主要的類有以下7個:vtkRenderWindow渲染窗口、vtkRenderer渲染器、vtkLight燈光、vtkCamera照相機、vtkActor演員、vtkProperty屬性和vtkMapper映射器??梢暬P屠昧藬?shù)據(jù)流(Data-flow)方法,將各個模塊連接成一個流動的可視化網(wǎng)絡(luò)(Visualizationnetwork),形成流水線管道(Pipeline),管道是貫穿VTK的一個核心內(nèi)容,任何一個VTK程序都至少有一條Pipeline。各個模塊對網(wǎng)絡(luò)中流動的數(shù)據(jù)執(zhí)行相應(yīng)數(shù)據(jù)的處理以及響應(yīng)用戶輸入??梢暬W(wǎng)絡(luò)的最高層是輸入模塊,用于讀取數(shù)據(jù)或生成數(shù)據(jù);接下來就是一系列的處理模塊用于處理數(shù)據(jù)(如提取等值面,計算表面法線等);最后以一個或多個映射器(Mapper)結(jié)束管道,映射器的作用是把數(shù)據(jù)轉(zhuǎn)化成圖形或?qū)懭胛募蛄?Stream)中。可視化模型由兩類對象組成(如圖1所示),分別是處理對象(ProcessObject)和數(shù)據(jù)對象(DataObject)。處理對象又包括源(Source),過濾器(Filter)和映射器(Mapper)。源位于管道的開始,用于讀入或生成數(shù)據(jù);源的輸出連接過濾器,在VC里可用語句:myFilter->SetInput(mySource->GetOutput())實現(xiàn)兩者的相連;過濾器的輸出通過類似的語句與映射器相連,從而終止管道。每個處理對象可以有零個,一個或多個輸出,并且輸出的數(shù)據(jù)類型是固定的,可通過有關(guān)的類進行變換,在實現(xiàn)處理對象之間的相連時要注意數(shù)據(jù)類型的匹配,這也是VTK選用C++語言書寫的其中一個原因,因為C++是一種強類型語言。VTK管道的執(zhí)行采用了一種基于每個對象內(nèi)部修改時間的惰性賦值(Lazyevaluation)機制,亦即只有數(shù)據(jù)要求更新時才被執(zhí)行,這涉及兩個重要的方法:Update()和Execute()方法。每個處理對象都會跟蹤它的最新修改時間(Lastmodificationtime),如果來自某個對象的輸出請求更新,或者該對象(或其輸入)被修改過,那么這個處理對象才會重新執(zhí)行。管道的執(zhí)行通過調(diào)用Update()方法,但通常我們都不用手動去調(diào)用這個方法,當(dāng)Actor接收到渲染(Render)的命令時,Update()方法會送到它的映射器,然后自動地送往管道。Update()方法執(zhí)行的方向與圖1所示箭頭方向相反。Update()會一直被送到源對象(SourceObject),源對象會比較它的修改時間和最近一次執(zhí)行的時間,如果被修改過,那么它就會調(diào)用方法Execute()重新執(zhí)行,Execute()方法的執(zhí)行過程與圖1箭頭方向一致。2vtk和mbc的合并本文以VisualC++6.0為例。2.1vtkmfc.lib等函數(shù)庫文件的設(shè)置建立新的VTK項目時,必須配置一些相關(guān)參數(shù)及環(huán)境變量,而且每建一個VTK的項目都必須進行這些設(shè)置。因為這些設(shè)置都是【Project/setting】里的,新項目沒有默認這些設(shè)置。具體需要設(shè)置的參數(shù)如下:(2)修改【Project/setting】->Link->Input->Object/librarymodules值為:vtkMFC.libvtkDICOMParser.lib等。這些設(shè)置是告訴編譯器新建項目要用到VTK里的哪些函數(shù)庫,在項目鏈接時可能會用到這其中的某些庫文件,如果在編程過程中提示還缺什么庫文件的話再臨時加進去。有一點需要特別指出的是vtkMFC.lib這個庫文件,它是實現(xiàn)VTK和MFC混合編程的關(guān)鍵函數(shù)庫。通過以上三個步驟的設(shè)置,就可以實現(xiàn)VTK和集成開發(fā)環(huán)境的集成。2.2vtkmfcwit-ls-pb文獻里提出了實現(xiàn)VTK與MFC集成兩種方法,其中第一種方法是通過設(shè)置vtkRenderWindow類中的SetParentId函數(shù)為當(dāng)前視圖或?qū)υ捒蚓浔?通過如下語句實現(xiàn):vtkRenderWindow*renWin=vtkRenderWindow::New();renWin->SetParentId(this->m_hWnd);這種方法只是簡單地把VTK自帶的渲染窗口覆蓋在對話框或視圖當(dāng)中,屏蔽了MFC的鼠標(biāo)響應(yīng)和消息傳遞,不便于后續(xù)編程實現(xiàn)更復(fù)雜的功能。文獻提到的第二種方法是VTK和MFC的深層集成,即通過改寫視圖類的相關(guān)函數(shù)從而達到集成的目的。筆者在這里嘗試實現(xiàn)VTK與MFC集成的另一種方法,沿用MFC的設(shè)計機制,把數(shù)據(jù)處理(由文檔類負責(zé))和數(shù)據(jù)顯示(由視圖類負責(zé))分開,使用VTK自帶的類;vtkMFCWindow。具體步驟如下:(1)在視圖類里加入兩個私有成員變量,vtkRenderer*m_pvtkRenderer和vtkMFCWindow*m_pvtkMFCWindow,分別表示渲染器與渲染窗口,并定義函數(shù)用于獲取這兩個指針,因為在文檔類里要用到這兩個指針,而私有成員在類外禁止訪問。(2)改寫視圖類的虛函數(shù)OnInitialUpdate(),在該函數(shù)里用New()方法實例化vtkMFCWindow對象,并關(guān)聯(lián)繪制器,此為關(guān)鍵代碼。即:this->m_pvtkMFCWindow=newvtkMFCWindow(this);this->m_pvtkMFCWindow->GetRenderWindow()->AddRenderer(this->m_pvtkRenderer);(3)在視圖類的OnDraw()函數(shù)里調(diào)用vtkMFCWindow里的成員函數(shù):DrawDC()。即:this->m_pvtkMFCWindow->DrawDC(pDC)。當(dāng)然還要做一些有關(guān)m_pvtkRenderer和m_pvtkMFCWindow的初始化及“善后”工作。這里就不一一講述。(4)在文檔類里增加可視化管道中會用到的類,用這些類實例化對象,讓這些對象作為文檔類的數(shù)據(jù)成員,管道的執(zhí)行過程可用成員函數(shù)的形式來實現(xiàn)。用VTK里的類vtkMFCWindow與MFC集成,可以很方便地利用VTK里設(shè)置的一些默認交互方法,如按下按鍵“P”用于拾取,按鍵“T”和按鍵“J”用于改變交互方式等。類vtkMFCWindow派生自MFC的類CWnd,vtkMFCWindow里定義了公共成員函數(shù):GetRenderWindow()和GetInteractor(),分別返回指向vtkWin32OpenGLRenderWindow和vtkRenderWindowInteractor對象的指針,利用這兩個方法就可以改變繪制窗口和交互方法的一些屬性,而且還可以重寫這個類的很多用于交互的虛函數(shù),如OnLButtonDblClk,OnLButtonDown,OnKeyUp等。3tk里的tkmarchingcxys醫(yī)學(xué)圖像三維重建目前用到的方法主要是面繪制和體繪制,其中面繪制主要的算法有:Cuberille算法、MarchingCubes算法和DividingCubes算法,最常用的是MarchingCubes(移動立方體法),在VTK里把這個方法封裝成類vtkMarchingCubes的形式供用戶使用。體繪制用到的算法主要有:光線投射法(RayCasting),拋雪球法(Splatting,orFootPrint),錯切-變形法(Shear-Warp),最大強度投影法(MaximumIntensityProjection,MIP)[3,P210]以及三維紋理映射(3DTextureMapping)[3,P218](基于硬件),另外還有基于硬件的VolumePro繪制[2,P157]。VTK目前支持三種體繪制技術(shù):光線投射法、紋理映射和基于硬件的VolumePro[2,P137]。本文將編程實現(xiàn)面繪制中的MC算法,以及體繪制中的光線投射法,其中光線投射法又涉及到幾個復(fù)合函數(shù),都將一一進行比較。3.1投影合成法測試數(shù)據(jù)的完整性MC算法是三維規(guī)則數(shù)據(jù)場等值面生成的經(jīng)典算法,為了在這一數(shù)據(jù)場中構(gòu)造等值面,應(yīng)先給出所求等值面的值,即所謂的“閾值”,MC算法首先找出該等值面經(jīng)過的體元位置,每個體元有八個數(shù)據(jù)點(如圖(2)所示),分別位于該體元的八個角點上。如果某體元一個角點的值大于(或等于)閾值,則該角點位于等值面之內(nèi)(或之上)。如果該角點的值小于閾值,則該角點位于等值面之外。由于這一方法是逐個體元依次處理的,因此被稱為移動立方體法(MarchingCubes)。利用該算法可以快速顯示人體組織和器官的輪廓,占用計算機系統(tǒng)資源相對較少,交互速度也相對較快。但它不能保留體數(shù)據(jù)的完整性,只是顯示體數(shù)據(jù)的一個面或只是一個空殼,如圖(6)-(c)所示。光線投射法(RayCasting)是以圖像空間為序的直接體繪制算法,它的基本原理(如圖3所示)。從屏幕上的每個像素點出發(fā),沿設(shè)定的視點方向,發(fā)出一條射線,這條射線穿過三維數(shù)據(jù)場,沿這條射線選擇若干個等距的采樣點,由距離某一采樣點最近的八個體素的顏色值及不透明度值做插值,求出該采樣點的顏色值和不透明度值。在求出該條射線上所有采樣點的顏色值和不透明度值后,可以采用由前到后或由后到前的兩種不同的方法將每一采樣點的顏色及不透明度值進行合成,從而計算出屏幕上該像素點處的顏色值,生成最終圖像。由后向前的圖像合成方法:設(shè)第i個體素的顏色值為Cnow,不透明度值為αnow,進入第1個體素的顏色值為Cin,不透明度值為αin,經(jīng)過第1個體素后的顏色值為Cout,不透明度值為αout,對于由后向前的圖像合成方法有:Cout=Cin(1-αnow)+Cnowαnow由前向后的圖像合成方法,有:Coutαout=Cinαin+Cnowαnow(1-αin);αout=αin+αnow(1-αin)在由前向后進行圖像合成的過程中,不透明度值α必然逐步增大。當(dāng)α值趨近于1時,說明該像素點的圖像已接近于完全不透明,后面的體元不會再對該像素點的圖像有所貢獻,因而可以不再計算了。由于由前向后的圖像合成方法可以省去無效的計算,速度較快,因而得到更為廣泛的應(yīng)用。在將采樣點進行合成時,VTK提供了三種方法,如圖所示(8)-(a)(b)(c)所示,光線投射法可以完整地保留體數(shù)據(jù),包括數(shù)據(jù)體的表面和內(nèi)部,這對于醫(yī)學(xué)臨床應(yīng)用具有重要的價值。但這種算法需要遍歷每個體素,而且當(dāng)觀察方向發(fā)生變化時,數(shù)據(jù)場中的采樣點之前的前后關(guān)系也必然發(fā)生變化,這就需要進行重新采樣,所以計算量極為龐大,針對該算法存在的問題,人們也提出了不少優(yōu)化方法。3.2圖像數(shù)據(jù)的提取管道是VTK程序里的核心,每一個VTK程序都至少有一條管道。所以在實現(xiàn)MC算法和光線投射法時,首先必須“搭建”管道,如圖4所示,是每個VTK程序都應(yīng)該有的一條管道的基本形式。利用MC算法實現(xiàn)醫(yī)學(xué)圖像三維重建的基本流程如圖5所示,與圖4的流程基本上一樣。但如果按該流程編程的話,提取等值面所用的時間將會相當(dāng)長,在LenovoY430,CPU-T4200,RAM-1,集顯上測試,最長的時間能達五六分鐘才能顯示一幅圖像,顯然這樣的處理速度是不利于交互的。所以應(yīng)該對讀入的數(shù)據(jù)進行處理,然后再進行等值面提取操作。文獻中提到了一種減少數(shù)據(jù)量的方法:對讀入的原始DICOM格式的數(shù)據(jù)轉(zhuǎn)換為BMP格式的,再將所有的數(shù)據(jù)寫到一個擴展名為“raw”的文件中,從而達到減少數(shù)據(jù)量的目的。這樣確實能夠達到減少數(shù)據(jù)量的目的,但同時也會造成原始數(shù)據(jù)的破壞,因為DICOM格式的圖像,存儲的灰度級能達4096級之多,而BMP存儲的圖像,其灰度級遠遠達不到4096,這樣會造成圖像的很多細節(jié)的丟失。筆者的方法是:用vtkDICOMImageReader批量讀入DICOM格式的圖像后,對其進行重采樣(類vtkImageShrink3D),即圖5“1”處(如圖6(a)、(b))。然后再進行等值面的提取(類vtkMarchingCubes或類vtkContourFilter),設(shè)置閾值提取等值面。然后再對提取后的數(shù)據(jù)進行削減、平滑等操作,即圖5“2”處,最后再通過Mapper傳送到圖形硬件,從而實現(xiàn)對二維醫(yī)學(xué)圖像等值面提取生成三維的圖像,如圖6所示。用VTK進行體繪制的基本流程如圖7所示。要注意對讀入的數(shù)據(jù)一定要對它的數(shù)據(jù)類型進行轉(zhuǎn)換(圖(7)“1”處所示),因為有些VolumeMapper只接受unsignedchar和unsignedshort等類型的數(shù)據(jù),連接流水線管道時一定要注意數(shù)據(jù)類型的匹配。圖7“2”處,可以設(shè)置不同的采樣點合成函數(shù),它的作用是對光線投射法中的每一條射線上等距采樣點的合成,以生成該射線位置上的像素值,VTK提供三種合成函數(shù),分別是:vtkVolumeRayCastCompositeFunction,vtkVolumeRayCastMIPFunction和vtkVolumeRayCastIsosurfaceFunction,如圖8(a)、(b)、(c)所示。其中圖8(b)是取閾值為1150進行繪制的,比較這三個圖像可知,用vtkVolumeRayCastCompositeFunction合成函數(shù)的效果是最好的,其參數(shù)設(shè)置也較易,所以該函數(shù)也是最常用的。圖7“3”處,可以設(shè)置不同的顏色值和不透明度值,用于觀察不同的人體組織,通常這也是體數(shù)據(jù)可視化中最難的一部分,因為你必須了解底層數(shù)據(jù)的具體意義,以CT圖像為例,空氣與皮膚的分界值大概為500,而軟組織與骨骼的分界值大概為1150。圖8(d)是將皮膚設(shè)為半透明的效果。圖7“4”處,可以加入功能強大的Widget組件,用于對任意平面的切割,以觀察人體內(nèi)部的信息,這一點對于醫(yī)學(xué)臨床應(yīng)用具有相當(dāng)重要的意義,其效果如圖8(d)、(e)所示。圖7“5”處,不能用類vtkVolumeMapper直接實例化對象,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 教師職稱述職報告范文錦集8篇
- 買賣合同協(xié)議書集錦七篇
- 五星級網(wǎng)吧員工管理制度
- 培訓(xùn)課件 -企業(yè)戰(zhàn)略性人力資源管理
- 酒店弱電系統(tǒng)設(shè)計方案(二)
- 佳作欣賞廣播稿3篇
- 飼料運輸合同
- 出租車間廠房合同
- 停車場出租合同范文
- 門面房租賃合同范文
- 醫(yī)源性皮膚損傷課件
- 崔允漷-基于課程標(biāo)準(zhǔn)的教學(xué)
- 2023年小學(xué)五年級下冊英語期末試卷分析,菁選3篇
- DL-T 2231-2021 油紙絕緣電力設(shè)備頻域介電譜測試導(dǎo)則
- 員工月度績效考核管理辦法
- 2023年云南保山電力股份有限公司招聘筆試題庫及答案解析
- GB/T 41904-2022信息技術(shù)自動化基礎(chǔ)設(shè)施管理(AIM)系統(tǒng)要求、數(shù)據(jù)交換及應(yīng)用
- GB/T 41908-2022人類糞便樣本采集與處理
- 信息系統(tǒng)運維服務(wù)方案
- 簡支梁、懸臂梁撓度計算程序(自動版)
- 統(tǒng)編版小學(xué)四年級語文上冊五六單元測試卷(附答案)
評論
0/150
提交評論