C#開發PACS醫學影像三維重建(一):使用VTK重建3D影像


VTK簡介:

VTK是一個開源的免費軟件系統,主要用於三維計算機圖形學、圖像處理和可視化。Vtk是在面向對象原理的基礎上設計和實現的,它的內核是用C++構建的。

因為使用C#語言開發,而VTK是C++的,所以推薦使用VTK的.Net開發庫:ActiViz。

本系列文章主要以技術和代碼講解為主,ActiViz的安裝和環境配置可以參考:

ActiViz(VTK的C#庫)學習使用心得之二:Activiz.NET的下載和安裝

官網資料:https://www.kitware.eu/product/activiz

 

三維重建技術介紹:

對於一些復雜的圖像,醫生希望用三維重建來觀察病灶點來輔助診斷,一般在醫學領域內的三維重建類型分為以下六種:

多層面重建(MPR)

最大密度投影(MIP)

表面陰影遮蓋(SSD)

容積漫游技術(VR)

曲面重建(CPR)

虛擬內鏡技術(VE)

 

本系列教程最終效果(實際效果受顯卡能力決定):

 

 

當我們下載並安裝好ActiViz之后,准備好要三維重建的Dcm文件,在VS2017中新建一個桌面應用程序項目:

 引用相關的動態庫:

 在Form1的Load事件中:

        private void Form1_Load(object sender, EventArgs e) {        //創建數據讀取對象
            vtkDICOMImageReader reader = new vtkDICOMImageReader(); //小端字節
 reader.SetDataByteOrderToLittleEndian(); //設置切片數據路徑
            reader.SetDirectoryName(@"C:\Users\Administrator\Desktop\vtk\801"); 
            vtkImageShrink3D shrink = new vtkImageShrink3D(); shrink.SetShrinkFactors(4, 4, 1); shrink.AveragingOn(); shrink.SetInput((vtkDataObject)(reader.GetOutput())); //提取等值面 vtkMarchingCubes skinExtractor = new vtkMarchingCubes(); //建立算法對象,從CT切片數據中提取出皮膚 skinExtractor.SetValue(0, 50); //提取出CT值為50的組織
 skinExtractor.SetInputConnection(shrink.GetOutputPort()); vtkDecimatePro deci = new vtkDecimatePro();  deci.SetTargetReduction(0.3); deci.SetInputConnection(skinExtractor.GetOutputPort()); vtkSmoothPolyDataFilter smooth = new vtkSmoothPolyDataFilter();  //光滑圖像
 smooth.SetInputConnection(deci.GetOutputPort()); smooth.SetNumberOfIterations(200); vtkPolyDataNormals skinNormals = new vtkPolyDataNormals();  //法線
 skinNormals.SetInputConnection(smooth.GetOutputPort()); skinNormals.SetFeatureAngle(60.0); vtkStripper stripper = new vtkStripper();  
 stripper.SetInputConnection(skinNormals.GetOutputPort()); vtkDataSetMapper skinMapper = new vtkDataSetMapper();  skinMapper.SetInput(stripper.GetOutput()); skinMapper.ScalarVisibilityOff(); //設置相機 vtkCamera aCamera = new vtkCamera(); aCamera.SetViewUp(0, 0, -1); aCamera.SetPosition(0, 1, 0); aCamera.SetFocalPoint(0, 0, 0); aCamera.ComputeViewPlaneNormal(); //設置Actor vtkActor coneActor = new vtkActor(); coneActor.SetMapper(skinMapper); coneActor.GetProperty().SetAmbient(0.5); coneActor.GetProperty().SetDiffuse(1); coneActor.GetProperty().SetSpecular(0.6); //顯示類
            vtkRenderer renderer = renderWindowControl1.RenderWindow.GetRenderers().GetFirstRenderer(); renderer.AddActor(coneActor);//添加coneActor對象 //renderer.AddActor2D(new vtkProp());//添加textActor對象
 renderer.SetBackground(0, 0, 0); renderer.SetActiveCamera(aCamera);//添加相機
 renderer.ResetCamera(); vtkRenderWindow renWin = renderWindowControl1.RenderWindow;//設置繪圖窗口renWin->AddRenderer(renderer);//裝載繪圖類
 vtkWin32RenderWindowInteractor iren = new vtkWin32RenderWindowInteractor();
 iren.SetRenderWindow(renWin);//裝載繪圖窗口

        }

這里我用的是頭顱的CT影像切片,運行后就得到了一個未上色的三維模型:

 

修改上面的代碼,嘗試提取腦部血管模型:

 //建立算法對象,從CT切片數據中提取出皮膚
skinExtractor.SetValue(0, 250); //血管CT值為200-300左右

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM