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. 正则表达式截取xml

    $str = '<Ips><GateWayRsp><head><ReferenceID>123</ReferenceID><RspCo ...

  2. python 多个装饰器的调用顺序分析

    一般情况下,在函数中可以使用一个装饰器,但是有时也会有两个或两个以上的装饰器.多个装饰器装饰的顺序是从里到外(就近原则),而调用的顺序是从外到里(就远原则) 样例: def func1(func): ...

  3. pandas参数设置小技巧

    在日常使用pandas的过程中,由于我们所分析的数据表规模.格式上的差异,使得同样的函数或方法作用在不同数据上的效果存在差异. 而pandas有着自己的一套参数设置系统,可以帮助我们在遇到不同的数据时 ...

  4. HYSBZ - 2243 树链剖分 + 线段树 处理树上颜色段数

    用线段树处理颜色段数 记录区间内的颜色段数,区间右端点的颜色,区间右端点的颜色. int tr[maxn<<2], lc[maxn<<2], rc[maxn<<2] ...

  5. 3、Entity Framework Core 3.1入门教程-设定字段属性

    本文章是根据 微软MVP solenovex(杨旭)老师的视频教程编写而来,再加上自己的一些理解. 视频教程地址:https://www.bilibili.com/video/BV1xa4y1v7rR ...

  6. C语言基础练习——打印菱形

    C语言基础练习--打印菱形 JERRY_Z. ~ 2020 / 8 / 26 转载请注明出处! 代码: /* * @Author: JERRY_Z. * @Date: 2020-08-26 17:17 ...

  7. python官网打不开

    这可能是因为该站点使用过期的或不安全的 TLS 安全设置. 解决:依次打开IE的Internet选项.高级,往下拉,找到安全模块,勾上四个使用:使用SSL 3.0.使用TLS 1.0.使用TLS 1. ...

  8. 学完Python,我决定熬夜整理这篇总结

    目录 了解Python Python基础语法 Python数据结构 数值 字符串 列表 元组 字典 集合 Python控制流 if 判断语句 for 循环语句 while 循环语句 break 和 c ...

  9. BM算法学习

    根据阮一峰大大的文章实现,不过没实现“搜索词中的上一次出现位置”(我直接实时查找,显然应该预处理): 文章:http://www.ruanyifeng.com/blog/2013/05/boyer-m ...

  10. Prometheus 与 国产 TDengine 的对比

    通过对比,能加深对这两个系统的理解,方便后续架构选型时作出正确决定.他们的设计思路有很多值得借鉴的地方,虽然工作中需要用到这些知识的地方不多,但是了解他们的设计细节能极大满足我的好奇心. 1.场景和需 ...