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

VTK簡介:

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

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

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

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

官網資料://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左右

 

C#開發PACS、RIS醫學影像處理系統

目錄整理:

(一)PACS客戶端:

C#開發PACS醫學影像處理系統(一):開發背景和功能預覽

C#開發PACS醫學影像處理系統(二):界面布局之菜單欄

C#開發PACS醫學影像處理系統(三):界面布局之工具欄

C#開發PACS醫學影像處理系統(四):界面布局之狀態欄

C#開發PACS醫學影像處理系統(五):查詢病人信息列表

C#開發PACS醫學影像處理系統(六):加載Dicom影像

C#開發PACS醫學影像處理系統(七):讀取影像Dicom信息

C#開發PACS醫學影像處理系統(八):單元格變換

C#開發PACS醫學影像處理系統(九):序列控件與拖拽

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交流。