VTK 实现体绘制(两种)Activiz

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;

        #endregion

        #region 属性
        public string FileDir
        {
            get;
            set;
        }
        #endregion
        public Form1()
        {
            InitializeComponent();
        }

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

        }

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

        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();//获得颜色映射标量值的范围
                    Console.WriteLine("reader range[0]={0},range[1]={1}", range[0],range[1]);

                    double min = range[0];
                    double max = range[1];
                    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.
                    //将像素的数据范围限定在0-255之间
                  
                    vtkImageCast.SetInput(_reader.GetOutput());
                    vtkImageCast.SetScale(slope);
                    vtkImageCast.SetShift(shift);
                    vtkImageCast.SetOutputScalarTypeToUnsignedShort();
                    vtkImageCast.Update();

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

                    vtkPiecewiseFunction opacityFun = new vtkPiecewiseFunction();
                    opacityFun.ClampingOff();
                    
                 
                   // opacityFun.AddPoint(13, 0.0);
                   // opacityFun.AddPoint(32, 0.25);
                   // opacityFun.AddPoint(51, 0.0);//lung

                   // opacityFun.AddPoint(33.0,0.0);
                    //opacityFun.AddPoint(49,0.3);
                   // opacityFun.AddPoint(64,0.0);//soft

                    opacityFun.AddPoint(73.0,0.0);
                    opacityFun.AddPoint(89,1.0);
                    opacityFun.AddPoint(104,0.0);//bone


                    //opacityFun.AddPoint(opacityLevel-0.5*opacityWindow,0.0);
                    //opacityFun.AddPoint(opacityLevel + 0.5 * opacityWindow, 1.0);


                    vtkColorTransferFunction colorFun = new vtkColorTransferFunction();
                    colorFun.AddRGBSegment(0.0, 0.0, 0.0, 0.0, 255.0, 1.0, 1.0, 1.0);

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

                    vtkFixedPointVolumeRayCastMapper mapper = new vtkFixedPointVolumeRayCastMapper();
                    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("请先选定文件夹!");
                }
            
        }
    }

第二种:

 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;




        #endregion

        #region 属性

        public string FileDir
        {
            get;
            set;
        }
        #endregion
        public Form1()
        {
            InitializeComponent();
        }

        private void btn_Open_Click(object sender, EventArgs e)
        {
            FolderBrowserDialog dlg = new FolderBrowserDialog();

            if (DialogResult.OK == dlg.ShowDialog())
            {
                FileDir = dlg.SelectedPath;
            }
        }

        private void btn_render_Click(object sender, EventArgs e)
        {

            if (!String.IsNullOrEmpty(FileDir))
            {
                _reader = new vtkDICOMImageReader();
                _reader.SetDirectoryName(FileDir);
                _reader.SetDataByteOrderToLittleEndian();
                _reader.Update();

                vtkPiecewiseFunction compositeOpacity = new vtkPiecewiseFunction();
                compositeOpacity.AddPoint(-3024, 0, 0.5, 0.0);
                compositeOpacity.AddPoint(-1000, 0, 0.5, 0.0);
                compositeOpacity.AddPoint(-500, 1.0, 0.33, 0.45);
                compositeOpacity.AddPoint(3071, 1.0, 0.5, 0.0);

                vtkColorTransferFunction colorFun = new vtkColorTransferFunction();
                colorFun.AddRGBPoint(-3024, 0, 0, 0, 0.5, 0.0);
                colorFun.AddRGBPoint(-1000, 0.62, 0.36, 0.18, 0.5, 0.0);
                colorFun.AddRGBPoint(-500, 0.88, 0.60, 0.29, 0.33, 0.45);
                colorFun.AddRGBPoint(3071, 0.83, 0.66, 1, 0.5, 0.0);

                vtkVolumeProperty property = new vtkVolumeProperty();
                property.ShadeOff();
                property.SetInterpolationTypeToLinear();
                property.SetColor(colorFun);
                property.SetScalarOpacity(compositeOpacity);

                vtkSmartVolumeMapper mapper = new vtkSmartVolumeMapper();
                mapper.SetBlendModeToComposite();
                mapper.SetInput(_reader.GetOutput());

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


                _render.AddViewProp(volume);
                _render.ResetCamera();
                _renWin.Render();
                _iren.Initialize();
                _iren.Start();


            }
            else
                MessageBox.Show("请先选定文件夹!");
             
        }

        private void renderWindowControl1_Load(object sender, EventArgs e)
        {

            _renWin = renderWindowControl1.RenderWindow;
            _render = renderWindowControl1.RenderWindow.GetRenderers().GetFirstRenderer();

            _iren = renderWindowControl1.RenderWindow.GetInteractor();

          
        }
    }


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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值