VTK簡介:html
VTK是一個開源的免費軟件系統,主要用於三維計算機圖形學、圖像處理和可視化。Vtk是在面向對象原理的基礎上設計和實現的,它的內核是用C++構建的。算法
由於使用C#語言開發,而VTK是C++的,因此推薦使用VTK的.Net開發庫:ActiViz。架構
本系列文章主要以技術和代碼講解爲主,ActiViz的安裝和環境配置能夠參考:併發
ActiViz(VTK的C#庫)學習使用心得之二:Activiz.NET的下載和安裝app
官網資料:https://www.kitware.eu/product/activiz高併發
三維重建技術介紹:工具
對於一些複雜的圖像,醫生但願用三維重建來觀察病竈點來輔助診斷,通常在醫學領域內的三維重建類型分爲如下六種:佈局
多層面重建(MPR)學習
最大密度投影(MIP)spa
表面陰影遮蓋(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左右
C#開發PACS、RIS醫學影像處理系統
目錄整理:
(一)PACS客戶端:
C#開發PACS醫學影像處理系統(七):讀取影像Dicom信息
C#開發PACS醫學影像處理系統(十):Dicom影像下載策略與算法
C#開發PACS醫學影像處理系統(十一):Dicom影像掛片協議
C#開發PACS醫學影像處理系統(十二):繪圖處理之圖形標記
C#開發PACS醫學影像處理系統(十三):繪圖處理之病竈測量
C#開發PACS醫學影像處理系統(十四):處理Dicom影像窗寬窗位
C#開發PACS醫學影像處理系統(十五):Dicom影像交叉定位線算法
C#開發PACS醫學影像處理系統(十六):2D處理之影像平移和縮放
C#開發PACS醫學影像處理系統(十七):2D處理之影像旋轉和翻轉
C#開發PACS醫學影像處理系統(十八):Dicom使用LUT色彩加強和反色
C#開發PACS醫學影像處理系統(十九):Dicom影像放大鏡
(二)PACS三維:MRP、MIP、VR
C#開發PACS醫學影像三維重建(一):使用VTK重建3D影像
(三)PACS網頁端:開發Web版本的PACS
C#開發Web端PACS(一):基於PACS客戶端思想重寫Web端
(四)PACS移動端:開發基於HTML5移動端版本的PACS
C#開發移動端PACS(一):使用HTML5和CSS3開發PACS手機端頁面
C#開發移動端PACS(二):使用 .Net MVC 開發手機端PACS服務端
(五)PACS服務端:
C#開發PACS醫學影像處理系統服務端(一):醫療設備的鏈接與收圖
C#開發PACS醫學影像處理系統服務端(二):高併發架構
(六)PACS與RIS系統的通訊與集成
在RIS系統中調起PACS並打開Dicom影像
(七)雲PACS與遠程會診
C#開發PACS醫學影像處理系統之雲PACS(區域PACS)(一):架構概述
C#開發PACS醫學影像處理系統之雲PACS(區域PACS)(二):遠程會診與雙向轉診
(八)科幻級視頻特效:使用Adobe After Effects 製做PACS影像處理系統宣傳視頻
QQ:1850969244 近10年開發經驗,主攻C#、ASP MVC,HTML5, B/S C/S 皆可,目前研究醫療領域醫學影像相關技術, 任何技術問題歡迎加QQ交流。 |