2019独角兽企业重金招聘Python工程师标准>>>

public partial class Form1 : Form
    {
        #region 私有变量
        private Kitware.VTK.vtkRenderer _render = null;
        private Kitware.VTK.vtkRenderWindow _renWin = null;
        private Kitware.VTK.vtkRenderWindowInteractor _iren = null;
        private Kitware.VTK.vtkDICOMImageReader _reader = null;
        private double opacityWindow = 4096;
        private double opacityLevel = 2048;

#endregion

#region 属性
        public string FileDir
        {
            get;
            set;
        }
        #endregion

public Form1()
        {
            InitializeComponent();
        }

private void button1_Click(object sender, EventArgs e)
        {
            FolderBrowserDialog dlg = new FolderBrowserDialog();
            if (DialogResult.OK == dlg.ShowDialog())
            {
                FileDir = dlg.SelectedPath;
            }
        }

private void renderWindowControl1_Load(object sender, EventArgs e)
        {
            _render = renderWindowControl1.RenderWindow.GetRenderers().GetFirstRenderer();
            _renWin = renderWindowControl1.RenderWindow;
            _iren = renderWindowControl1.RenderWindow.GetInteractor();

}

private void button2_Click(object sender, EventArgs e)
        {
            if (!String.IsNullOrEmpty(FileDir))
            {
                _reader = new Kitware.VTK.vtkDICOMImageReader();
                _reader.SetDirectoryName(FileDir);
                _reader.SetDataByteOrderToLittleEndian();
                _reader.Update();

_reader.SetDataScalarTypeToShort();
                _reader.UpdateWholeExtent();
                _reader.GetOutput().UpdateInformation();

double[] range = _reader.GetOutput().GetScalarRange();//获得颜色映射标量值的范围

double min = range[1];//
                double max = range[0];//
                double diff = max - min;
                double slope = 255.0 / diff;//斜率
                double inter = -slope * min;//截距
                double shift = inter / slope;

vtkImageShiftScale vtkImageCast = vtkImageShiftScale.New();
                //With vtkImageShiftScale Pixels are shifted
                //(a constant value added) and then scaled (multiplied by a scalar. As a convenience,
                //this class allows you to set the output scalar type similar to vtkImageCast.
                //This is because shift scale operations frequently convert data types.

//如果不进行转换,vtkVolumeRayCastMapper会无法渲染short类型的数据,
                //必须要经过转换将数据转换为vtkVolumeRayCastMapper可以渲染的数据
                vtkImageCast.SetInput(_reader.GetOutput());
                vtkImageCast.SetScale(slope);
                vtkImageCast.SetShift(shift);
                vtkImageCast.SetOutputScalarTypeToUnsignedShort();
                vtkImageCast.Update();

//获得透明度转换函数的参数
                range = vtkImageCast.GetOutput().GetScalarRange();
                double level = 0.5 * (range[1] + range[0]);
                double window = range[1] - range[0];

vtkPiecewiseFunction opacityFun = new vtkPiecewiseFunction();
                opacityFun.AddPoint(level - window / 2, 0.0);
                opacityFun.AddPoint(level + window / 2, 1.0);

vtkPiecewiseFunction grayTransferFun = new vtkPiecewiseFunction();
                grayTransferFun.AddSegment(level - window / 2, 0.0, level + window / 2, 1.0);

vtkVolumeProperty property = new vtkVolumeProperty();
                property.SetInterpolationTypeToLinear();
                property.SetScalarOpacity(opacityFun);
                property.SetColor(grayTransferFun);

vtkVolumeRayCastMIPFunction mipFun = new vtkVolumeRayCastMIPFunction();
                mipFun.SetMaximizeMethodToOpacity();

vtkVolumeRayCastMapper mapper = new vtkVolumeRayCastMapper();
                mapper.SetVolumeRayCastFunction(mipFun);
                mapper.SetInput(vtkImageCast.GetOutput());
                // mapper.SetInput(_reader.GetOutput());
                //会报错:无法渲染非unsigned char或者unsigned short 类型的数据
                //vtkVolumeRayCastMapper (09C92D38):
                //Cannot volume render data of type short, only unsigned char or unsigned short.

vtkVolume volume = new vtkVolume();
                volume.SetProperty(property);
                volume.SetMapper(mapper);

_render.AddViewProp(volume);
                _render.ResetCamera();

_renWin.Render();
                _iren.Initialize();
                _iren.Start();
            }
            else
            {
                MessageBox.Show("请先选定文件夹!");
            }
        }
    }

转载于:https://my.oschina.net/u/2009228/blog/536371

VTK 实现MinIP Activiz相关推荐

  1. java vtk 三维_[WPF VTK]三维图形开发基础(四)

    0.条条大路 前面介绍的使用WPF自己撰写算法实现点数据的三角划分以图实现轮廓的三维重构. 但简单的算法以及不加其他处理效果不佳,对于点数据的三角划分在查阅了一些论文后发现有: 基于图的最短路径.De ...

  2. VTK Examples中MIP和MPR的功能实现与源码分析

    本篇博客由Markdown编辑器编辑而成. 1. 前言 在之前关于ParaView技术调研中,已经通过修改ParaView5.0的源代码实现了MIP/minIP/aveIP的功能.但是由于对ParaV ...

  3. ActiViz(VTK的C#库)C#64位VTK如何在Visual Studio里创建RenderWindowControl控件

    Visual Studio17里只支持x86位控件拖拽,不支持x64.那怎样在64位的组件form窗口中放RenderWindowControl控件呢?下面我们就详细介绍一下在Visual Studi ...

  4. vtk实现MPR、MIP、minIP、aveIP

    本文参考:VTK Examples中MIP和MPR的功能实现与源码分析 另参考:6种常见的三维重建方式 先编译VTK.VTK Examples 找到MPR示例,这个示例所在的位置在: VTK_Sour ...

  5. vtk相机_C#开发PACS医学影像三维重建(一)使用VTK重建3D影像

    VTK简介: VTK是一个开源的免费软件系统,主要用于三维计算机图形学.图像处理和可视化.Vtk是在面向对象原理的基础上设计和实现的,它的内核是用C++构建的. 因为使用C#语言开发,而VTK是C++ ...

  6. 【VTK】VTK 之一 环境准备

    VTK总结 http://blog.sina.com.cn/s/articlelist_2216172153_3_1.html VTK教程 http://blog.csdn.net/www_dolin ...

  7. MIP 和 MinIP

    一.概述 MIP:maximum intensity projection 最大密度投影 MinIP:Minimum intensity projection 最小密度投影 MIP主要用于CT血管造影 ...

  8. Activiz学习点滴(一)——常用类

    程序集 Kitware.VTK.dll, v5.8.0.607 namespace Kitware.VTK public class WrappedObject : Kitware.mummy.Run ...

  9. Activiz 使用笔记-3 数据源(1)

    2019独角兽企业重金招聘Python工程师标准>>> activiz本身自带的user guide 比较简单,所以我按着vtk的user guide来慢慢学.从简单例子入手去学习V ...

最新文章

  1. ASP.NET 4.0: 请求验证模式变化导致ValidateRequest=false失效
  2. Python应用实战案例-Python实现K线图绘制
  3. ORA-01180: can not create datafile 1 :解决一例
  4. 低配服务器装那个系统吗,用低配服务器好还是高配vps
  5. c语言字符型计算器,求用c语言编程四则混合运算计算器?
  6. Ant Design Landing 产品首页的设计神器
  7. java 多个数字_java 输入多个数字
  8. Python中的与或非
  9. 如何使用磁性套索工具进行抠图
  10. python和c++同时订阅两个话题,在一个回调函数中处理
  11. 小学计算机京剧脸谱教案,[热门]《戏曲脸谱》小学美术教学案例
  12. 银行的总行,营业部,支行,分理处有什么样的关系
  13. 关键词查找并标注出来
  14. IT职业规划:大公司VS小公司,怎样选择更有前途?
  15. 再谈SQL-to-SQL翻译器
  16. ubuntu插入U盘,无法识别
  17. 雷神轮胎携手JBL 演绎科技降噪、感受非凡音悦
  18. 百度索引量与“site”结果是不是一样的,site总是接近百度索引量
  19. Debian/Ubuntu 时区和自动校时设置
  20. gis data editor.php,我们的漏洞Webug 3.0中级进阶攻略(上)

热门文章

  1. 在outlook客户端设置阿里企业邮箱
  2. 【Latex】用Acrobat剪切pdf文件中图
  3. 数据类型的基本功能(一)
  4. linux系统无法识别固态硬盘_重装Linux操作系统为什么识别不了硬盘
  5. ccf 智能运维 裴丹_智能运维是什么?
  6. 测绘资质专业类别及乙级作业限制范围是什么?
  7. 计算机创新创业2000字,创新创业论文范文 创新创业方面硕士毕业论文范文2000字...
  8. Flutter 左右菜单联动
  9. pandas学习手记-柱状图
  10. Qt之实现图片轮播效果