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左右

     

  • 相关阅读:
    The Python Standard Library
    Python 中的round函数
    Python文件类型
    Python中import的用法
    Python Symbols 各种符号
    python 一行写多个语句
    免费SSL证书(https网站)申请,便宜SSL https证书申请
    元宇宙游戏Axie龙头axs分析
    OLE DB provider "SQLNCLI10" for linked server "x.x.x.x" returned message "No transaction is active.".
    The operation could not be performed because OLE DB provider "SQLNCLI10" for linked server "xxx.xxx.xxx.xxx" was unable to begin a distributed transaction.
  • 原文地址:https://www.cnblogs.com/Uncle-Joker/p/13692517.html
Copyright © 2011-2022 走看看