zoukankan      html  css  js  c++  java
  • 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:UsersAdministratorDesktopvtk801");
    
                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左右

     

  • 相关阅读:
    PAT 1010. 一元多项式求导 (25)
    PAT 1009. 说反话 (20) JAVA
    PAT 1009. 说反话 (20)
    PAT 1007. 素数对猜想 (20)
    POJ 2752 Seek the Name, Seek the Fame KMP
    POJ 2406 Power Strings KMP
    ZOJ3811 Untrusted Patrol
    Codeforces Round #265 (Div. 2) 题解
    Topcoder SRM632 DIV2 解题报告
    Topcoder SRM631 DIV2 解题报告
  • 原文地址:https://www.cnblogs.com/Uncle-Joker/p/13692517.html
Copyright © 2011-2022 走看看