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

C#开发PACS医学影像三维重建(一):使用VTK重建3D影像的更多相关文章

  1. C#开发PACS医学影像处理系统(六):加载Dicom影像

    对于一款软件的扩展性和维护性来说,上层业务逻辑和UI表现一定要自己开发才有控制权,否则项目上线之后容易被掣肘, 而底层图像处理,我们不需要重复造轮子,这里推荐使用fo-dicom,同样基于Dicom3 ...

  2. C#开发PACS医学影像处理系统(十七):2D处理之影像旋转和翻转

    1.任意角度旋转 在XAML设计器中,设置RotateTransform属性 <InkCanvas x:Name="ToolInkCanvas" UseCustomCurso ...

  3. C#开发PACS医学影像处理系统(十四):处理Dicom影像窗宽窗位

    概念解释(网络资料): 窗宽: 窗宽指CT图像所显示的CT 值范围.在此CT值范围内的组织结构按其密度高低从白到黑分为16 个灰阶以供观察对比.例如,窗宽选定为100 Hu ,则人眼可分辨的CT值为1 ...

  4. C#开发PACS医学影像处理系统(十五):Dicom影像交叉定位线算法

    1.定位线概念:某个方位的影像在另一个方向的影像上的投影相交线,例如横断面(从头到脚的方向)在矢状面(从左手到右手)上的影像投影面交线. 举个例子:右边的是MR(核磁共振)的某一帧切片,这是从头开始扫 ...

  5. C#开发PACS医学影像处理系统(十六):2D处理之影像平移和缩放

    1.平移,利用WPF中控件边距来控制位移: /// <summary> /// 平移图像 /// </summary> /// <param name="X&q ...

  6. C#开发PACS医学影像处理系统(二):界面布局之菜单栏

    在菜单栏布局上,为了使用自定义窗体样式和按钮,我们需要先将窗体设置为无边框,然后添加一个Grid作为菜单栏并置顶,VerticalAlignment="Top" logo图片和标题 ...

  7. C#开发PACS医学影像处理系统(三):界面布局之工具栏

    工具栏布局采用WPF中Grid作为容器,按钮采用自定义样式和图标,并采用Separator分割线: XAML设计器代码: 其中  Style="{StaticResource ButtonS ...

  8. C#开发PACS医学影像处理系统(十二):绘图处理之图形标记

    在医生实际使用过程中,对于有病灶的影像需要一些2D绘图操作,例如对于病灶的标记和测量, 这就牵涉到在WPF中的2D绘图操作技术,一般的思路是监听鼠标的按下和抬起以及运动轨迹,目前整理出的常用绘图和测量 ...

  9. C#开发PACS医学影像处理系统(十三):绘图处理之病灶测量

    接上一篇文章,当我们可以绘制图形标记后,就可以在此操作类上面进行扩展, 比如测量类工具,目前整理出的常用绘图和测量功能如下: 测量工具类:(图形标记类请参考本系列文章:绘图处理之图形标记) 功能 说明 ...

随机推荐

  1. wsgi的environ变量

    The environ dictionary is required to contain these CGI environment variables, as defined by the Com ...

  2. 牛客网PAT练兵场-打印沙漏

    题目地址:https://www.nowcoder.com/pat/6/problem/4053 题意:模拟题 /** * Copyright(c) * All rights reserved. * ...

  3. 【趣味设计模式系列】之【代理模式3--Cglib动态代理源码解析】

    1. 图解 上图主要描述了Cglib动态代理的主要执行过程,下面做详细分析,以下源码使用的Cglib版本为3.2.12. 2. Enhancer源码分析 public Object create() ...

  4. 两台Linux服务器文件同步

    在给公司或者学校做系统部署的时候,为了数据安全往往我们至少需要两台服务器,接下来请看: 我们要实现的是把客户端(192.168.0.1)的复制到目标服务器(192.168.0.2) 一.目标服务器 1 ...

  5. Bellman-Ford算法 例题:P3371 单源最短路径

    看到还没人用Bellman-Ford过,赶紧水一发 lz非常弱,求各位大佬轻喷qwq 洛谷题目传送门:P3371 0."松弛"操作 如果存在一条边\((u,v)\)通过中继的方式可 ...

  6. VS2015+opencv3.1.0 imshow()函数出现中文乱码----问题一

    Visual Studio提供高级保存选项功能,它能指定特定代码文件的编码规范和行尾所使用的换行符.在Visual Studio 2015中,该命令没有默认显示在“文件”菜单中.用户需要手工设置,才能 ...

  7. Vue.js学习(八)—— 树形结构下拉框组件vue-treeselect

    vue-treeselect是一个多选组件,具有对Vue.js的嵌套选项支持. 具有嵌套选项支持的单个和多个选择 模糊匹配 异步搜索 延迟加载(仅在需要时加载深层选项的数据) 键盘支持(使用Arrow ...

  8. playable

    探索TimelinePlayableAPI,让Timeline为所欲为 https://blog.csdn.net/qq826364410/article/details/80534892 Playa ...

  9. UI 科学

    以简书为案例讲述「尼尔森十大可用性原则」 http://www.jianshu.com/p/a45e4ad68e20 你真的懂得尼尔森的十大可用性原则么? http://jy.sccnn.com/po ...

  10. webdriver入门之环境准备

    1.安装ruby 下载ruby的安装包,很简单,不解释.装好之后打开cmd输入以下命令验证是否安装成功 ruby -v 2.安装webdriver 确保机器联网,用gem命令安装是在有网络的情况下进行 ...