【正文】
了更好的從量化的角度來對缺陷進行分析,通過缺陷的統(tǒng)計信息與缺陷的實際顯示效果相結合,來提供更加完善的缺陷認知系統(tǒng),輔助人工對缺陷進行分析。區(qū)域生長就是通過設置種子點,然后對種子點周圍的點按照給定的規(guī)則進行判定,看是否在規(guī)定的范圍內,如果在,就歸納為一個區(qū)域,這里由于處理數(shù)據(jù)的特殊性,生長規(guī)則就顯得比較簡單,直接判定與種子點是否相等,如果相等,就歸納為一個區(qū)域,利用棧模式,將整個體數(shù)據(jù)都歸納標記完畢,形成一系列體積大小各異的區(qū)域。根據(jù)上一節(jié)的三維CV分割方法與三維區(qū)域生長方法,得到缺陷體繪制的主要步驟:Step1:利用三維CV對原始CT重建數(shù)據(jù)進行分割,得到二值數(shù)據(jù)。Step3:按照統(tǒng)計數(shù)據(jù)進行重新賦值,將空氣、物體、缺陷分開。 缺陷顯示結果通過上面兩節(jié)介紹的方法,得到了如下的一組缺陷顯示的結果。 缺陷繪制結果Figure Volume rendering resultof the defect 缺陷繪制結果Figure Volume rendering resultof the defect 缺陷繪制結果Figure Volume rendering resultof the defect 缺陷繪制結果Figure Volume rendering resultof the defect 缺陷繪制結果Figure Volume rendering resultsof the defect 缺陷繪制結果Figure Volume rendering resultsof the defect 原始數(shù)據(jù)整體輪廓繪制結果Figure The original data volume rendering results overall profile從上面的缺陷效果圖中,我們可以看到,在突出顯示缺陷的同時,還可以保留數(shù)據(jù)中物體的整體輪廓,給出了缺陷在整個物體中的相對大小以及相對位置信息,并且可以通過實時調節(jié)傳遞函數(shù)來加強對外部輪廓的弱化,更加清晰的觀察缺陷。第四章 CUDA加速體繪制算法本文主要是針對體繪制算法進行相應的應用研究,而體繪制算法在實際應用中存在的最大問題就是計算量大,如果利用傳統(tǒng)的CPU來進行處理,要達到人機交互的實時顯示頻率是比較困難的,為此,本文利用CUDA來加速體繪制算法,并應用到實際三維顯示軟件系統(tǒng)中。為了能夠利用GPU的并行處理能力,GPGPU(Genenral Purpose Computing On Graphics Processing Units)也隨之而來。但是GPGPU這種利用GPU與CPU相結合的異構編程模式,卻在后來的CUDA中得到了充分的展示。CUDA采用的是類C語言的開發(fā)環(huán)境,在這個框架中提供了一系列可以操作GPU的函數(shù),CUDA就如同并行計算與GPU之間的一座橋梁,不僅讓計算受益,也推動了GPU硬件的發(fā)展,為了更好的適應計算,GPU的硬件結構也在不斷的改進與推新,從計算核心數(shù)的增加,到儲存設備的不斷改進,都積極地推動著GPU計算的發(fā)展。 CPU與GPU設計的簡單對比[11]Figure Simple parison of CPU and GPU design[11]從圖中,可以簡單看出,CPU在控制及緩存這塊分配的資源較多,而GPU則著重于計算單元的數(shù)量,通過設計大量的計算單元,來增加其整體的計算能力,從整體上增加GPU的數(shù)據(jù)吞吐能力,除了計算單元的增加,在帶寬上也需要跟上。 CPU與GPU近幾年的帶寬對比[12]Figure CPU and GPU bandwidth of contrast in recent years[12]在浮點數(shù)計算能力上,由于GPU核心的不斷改進以及數(shù)量上的增加,相對與CPU也呈現(xiàn)出較強的上升趨勢,: CPU與GPU近幾年浮點數(shù)處理能力對比[12]Figure Comparison of floating pointprocessing capabilities between CPU and GPU in recent years[12]由于GPU充分利用了多核、多線程的特點,在科學計算領域展現(xiàn)出強勁的發(fā)展趨勢,對于一些需要大量并行計算的應用而言,GPU的崛起也為計算領域帶來了革新[11][12]。CUDA是結合CPU與GPU的異構編程模式,將必要的串行計算交給CPU來進行處理,而那些大量的并行計算工作由GPU來完成,一般稱CPU為主機端(Host),稱GPU為設備端(Device),: CUDA程序執(zhí)行大致流程[12]Figure CUDA program execution flow roughly[12]從主機端開始,進行必要的初始化工作,包括將必要的數(shù)據(jù)拷貝的GPU顯存中,調用CUDA核函數(shù)(Kernel),將控制權交給GPU,讓GPU去進行并行任務處理,待GPU處理完成后,將結果傳回CPU端,這個過程可以根據(jù)實際任務需要重復。(Thread)組織結構。 GPU計算單元簡圖[11]Figure GPU puting unit diagram[11]由于GPU處理器的特殊設計,CUDA在真正進行計算的時候,任務是按照塊來分配的,同一個塊的所有線程在同一個SM中進行發(fā)射,這樣同一個塊里面的所有線程享有一個共享存儲器,由于SM的數(shù)量對于一個特定的GPU來說是固定的,所以在塊數(shù)量超過SM數(shù)量的時候,一個SM中就同時存在多個塊的上下文,但是一個時刻,只有一個塊被激活,CUDA中以塊為單位進行運算,實際在SM中映射是根據(jù)GPU中SM的數(shù)量來決定的,這種映射是由CUDA來完成的,作為編程人員,只需要安排好自己的任務給線程或者塊。 塊與SM的映射關系[12]Figure The mapping between the block and the SM[12]CUDA在執(zhí)行核函數(shù)的時候采用的是SIMT(Single Instruction Multiple Thread)的執(zhí)行模式[11],也就是在同一個塊里面的線程都執(zhí)行相同的指令,這樣是為了提高計算效率,由于SM中的SP數(shù)量一般是固定的,而塊中的線程數(shù)會根據(jù)任務的不同可能有不同的設計,當塊中的線程數(shù)超過了SP的數(shù)量,就會進行多次執(zhí)行命令,讓所有線程都執(zhí)行完,這也是為了充分利用同一個SM中有多個SP的特點。在CUDA編程的時候,數(shù)據(jù)的存儲也是一個非常重要的部分,CUDA內部規(guī)定了一系列不同的存儲器,各自有不同的作用,合理利用這些存儲器,是提高程序執(zhí)行效率的重要手段。共享存儲器作為一種特殊的存儲器,是為了在一個塊中提供給各個線程間快速通信的空間,相對于在其他地方進行線程間通信,這里的速度是最快的。局部存儲器(Local Memory),作為寄存器的候補,在線程中如果寄存器不夠用了,就會將局部數(shù)據(jù)存儲在局部存儲器中,由于局部存儲器相對寄存器有較大的訪問延遲,所以應當盡量避免這樣的情況,在核函數(shù)中控制好局部變量的空間,合理的利用已經申請過的空間。紋理存儲器,作為GPU中比較特殊的部分,具有一些特殊的功能[11],包括地址映射、數(shù)據(jù)濾波、緩存等,而這些功能都是圍繞紋理渲染的需求設計的,這也是早期圖形處理專用的單元。紋理中的數(shù)據(jù)獲取是通過紋理拾取得到的。最為重要的是在紋理存儲器中,提供了濾波功能,濾波包括最近鄰點與線性插值濾波,線性濾波根據(jù)紋理的維度而定,可以對兩個元素(針對一維紋理)、四個元素(針對二維紋理)及八個元素(針對三維紋理)來進行線性差值運算,此運算不占用可編程單元,并提供額外的浮點數(shù)處理能力[11]。CUDA充分利用了GPU的各項能力,提供一個友好的接口,來改善GPU的可編程性,下面將介紹本文利用CUDA對體繪制算法的加速。圖 成像平面像素與CUDA線程對應關系Figure The corresponding relationship between imaging plane pixels and CUDA threads上圖中給出了成像平面像素與CUDA線程的一一對應關系,由于CUDA的核函數(shù)是通過塊來運行的,所以還需要將這些線程組織在一系列塊中。而成像平面大小和是作為參數(shù)傳入核函數(shù)中的,通過公式()的計算,可以得到整個網格中塊的維度。Step2:根據(jù)旋轉矩陣以及線程對應的成像平面坐標,確定視角坐標、光源坐標、以及射線的方向向量。Step4:根據(jù)最近取樣點以及步長,進入沿射線方向的循環(huán)采樣合成階段::根據(jù)當前的采樣點位置,在三維紋理中進行拾取,得到梯度及物體的密度信息。:根據(jù)光照模型以及體繪制的遞歸公式進行顏色和不透明度合成。Step5:將循環(huán)中得到的累加顏色及不透明度信息傳給全局數(shù)組,以便核函數(shù)結束后將結果傳入到CPU中。Step2:設置數(shù)據(jù)傳輸通道參數(shù)、在GPU端分配存儲空間并將數(shù)據(jù)拷貝到GPU的中,然后設置紋理參數(shù)并與此存儲空間進行綁定,形成一個三維紋理(其大小為原始三維數(shù)據(jù)的三個維度,每個節(jié)點的信息為四個浮點數(shù)據(jù))以及一個一維紋理(傳遞函數(shù))。Step4:調用核函數(shù)(核函數(shù)的參數(shù)主要包含生成圖像的大小和一些效果控制參數(shù)),程序控制權從CPU轉換到GPU中。Step6:最后將結果從GPU端傳輸?shù)紺PU端。最后給出整個算法的流程結構圖: CUDA加速體繪制流程圖Figure CUDA accelerated volume rendering flowcharts此流程圖中多了兩個步驟,主要是針對第三章中的缺陷顯示,多了三維CV分割以及三維區(qū)域生長。第五章 體繪制軟件的設計與實現(xiàn) 引言軟件作為計算機重要的組成部分,作用于硬件之上,借助硬件完成需要完成的任務,應用軟件是在操作系統(tǒng)之上的計算機程序,完成一些特定的功能。一般來說做好一款軟件并非一件容易的事,軟件開發(fā)是一項包括需求捕捉,需求分析,設計,實現(xiàn)和測試以及發(fā)布的系統(tǒng)工程。下面就具體介紹整個軟件的框架及實現(xiàn)。Figure The overall effect diagram of the software本軟件主要包括工具欄(上)、主視圖(左)以及控制視圖(右)三個部分。而主視圖,作為體繪制結果的呈現(xiàn)窗口,主要利用了OpenGL(Open Graphics Library)這個圖形操作接口,可以很方便且快速的顯示二維圖像,而且OpenGL提供了一組函數(shù)接口來方便獲取鼠標等外部設備的操作,最終生成我們需要的旋轉或者平移數(shù)據(jù),這在實時動態(tài)顯示中是十分重要的,最后將這些獲取的參數(shù)進行必要的轉換然后傳遞給體繪制函數(shù),進行實時變化繪制。主視圖除了可以顯示體繪制結果,還可以切換到切片顯示模式,來對原始數(shù)據(jù)的切片進行顯示。 部分控制界面視圖Figure Part of the control interface view 部分控制界面視圖Figure Part of the control interface view,左邊的控制視圖是用來人工調節(jié)傳遞函數(shù)的,包括了透明度以及顏色的三個分量;中間的控制視圖,用來設置包圍盒,實現(xiàn)簡單體剖切;右邊的控制視圖,是用來設置三維CV分割的參數(shù)以及區(qū)域生長統(tǒng)計分類需要的體積向量。上面這樣的整體視圖構建,是基于SDMV(Single Document Multi View)[55]這樣的一種模式來實現(xiàn)的,SDMV主要是利用到類CSplitterWnd來實現(xiàn)視圖分割的,CSplitterWnd類可以將一個窗口分成多個視圖窗口,每個窗口需要一個視圖類來進行管理,通過這樣的方式,本軟件將整體的大窗口分成左右兩部分,左邊負責主視圖顯示,右邊負責控制視圖的顯示,根據(jù)需要,又將右邊再一次進行分割,得到幾個不同的控制視圖(可根據(jù)需求擴充),這樣分割的目的,是為了將不同的功能集中在不同的控制視圖中,防止將所有功能放在一個視圖中而造成雜亂無章的現(xiàn)象,并且這樣也自然而然地將不同的功能塊進行了分離,方便軟件的整體管理以及測試,增強其穩(wěn)定性。本文采用的是DLL這種方式,作為Windows系統(tǒng)中最為核心的東西,DLL在Windows軟件設計中占有舉足輕重的地位。Windows API中的所有函數(shù)都包含在DLL中[56]。本文將以下一些功能分別在不同的DLL中實現(xiàn):三維CV分割、三維區(qū)域生長、體繪制。得益于SDMV這個模型以及DLL模塊化,本軟件的可擴充性也非常良好,可以通過將需要擴展的功能塊進行模塊化,提供接口并生成相應的DLL,然后通過SDMV在控制視圖中進行功能塊的擴充,這種擴充并不會影響到其他控制塊的功能,由于在這些控制視圖之間采用的是Windows的消息傳遞機制,所以在設計每個控制視圖類的時候,將能夠接受的消息功能都實現(xiàn),就能很容易擴充到整個軟件中了。其中主視圖的顯示是通過OpenGL來實現(xiàn)的,目的是為了提供更好的交互機制以及利用其雙緩存機制,使顯示更加流暢。研究類容主要包含了直接體繪制算法,缺陷的分割及統(tǒng)計顯示,以及體繪制算法的CUDA加速和三維交互軟件的設計與實現(xiàn)。采用簡單的光線投射算法與人工調節(jié)傳遞函數(shù)相結合的方式,使得最終在顯示工件的時候,到達內外兼?zhèn)涞男ЧH?、針對體繪制算法本身的計算量問題,采用了CUDA來進行加速,通過CUDA來利用GPU的并行處理能力,通過合理安排CUDA的線程分塊,以及利用GPU中的紋理存儲器來進一步優(yōu)化加速效果,使得最終的加速可以滿足在普通PC上進行流程的人機交互操作。 后續(xù)研究及展望由于本人的研究能力和研究精力有限,以及問題本身的難度,以至于還存在一些尚待解決的問題。本文只是實現(xiàn)了一種比較簡單的剖切,通過丟掉數(shù)據(jù)來實現(xiàn),而真實的剖切,在剖切面應該有更多的處理,已達到更好的效果。本人在研究的過程中遇到數(shù)據(jù)過大而造成顯存無法加載的問題,通過簡單的數(shù)據(jù)分段來實現(xiàn)過,但是此方法切換比較麻煩,而且影響整體的觀感,所以并未在文中列出,對此需要一種方法來進行處理,在CT重建中,由于精度的需要,重建的數(shù)據(jù)維度可以是很高的,這是一個實際應用中的問題,具有一定價值和意義