VTKはMIP(2種類)Activizを実現

8848 ワード

 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 btn_open_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 btn_render_Click(object sender, EventArgs e)
        {
            if (!String.IsNullOrEmpty(FileDir))
            {
                _reader = new Kitware.VTK.vtkDICOMImageReader();
                _reader.SetDirectoryName(FileDir);
                _reader.SetDataByteOrderToLittleEndian();
                _reader.Update();

                vtkPiecewiseFunction opacityFun = new vtkPiecewiseFunction();
                opacityFun.AddSegment(opacityLevel-0.5*opacityWindow,0.0,
                                      opacityLevel+0.5*opacityWindow,1.0);

                Console.WriteLine("opacityLevel-0.5*opacityWindow:" + (opacityLevel - 0.5 * opacityWindow).ToString());
                Console.WriteLine("opacityLevel+0.5*opacityWindow:" + (opacityLevel + 0.5 * opacityWindow).ToString());


                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.ShadeOn();
                property.SetColor(colorFun);
                property.SetScalarOpacity(opacityFun);
                


               vtkSmartVolumeMapper mapper = new vtkSmartVolumeMapper();
               // vtkVolumeProMapper mapper = new vtkVolumeProMapper();
               // vtkVolumeRayCastMIPFunction

                mapper.SetBlendModeToMaximumIntensity();
               
                mapper.SetInput(_reader.GetOutput());


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


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

                _renWin.Render();
                _iren.Initialize();
                _iren.Start();
            }
            else
            {
                MessageBox.Show(" !");
            }
        }
    }

2つ目:
 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 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[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.

                // ,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);
               // opacityFun.AddSegment(0,0.0,255,1.0);//all

                //opacityFun.AddPoint(73.0, 0.0);
                //opacityFun.AddPoint(89, 1.0);
                //opacityFun.AddPoint(104, 0.0);//bone
                //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.8);//0.3
                opacityFun.AddPoint(64, 0.0);//soft

            

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


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

                Console.WriteLine("level:{0}
 window :{1}",level,window);                 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(" !");             }         }         private void renderWindowControl1_Load(object sender, EventArgs e)         {             _render = renderWindowControl1.RenderWindow.GetRenderers().GetFirstRenderer();             _renWin = renderWindowControl1.RenderWindow;             _iren = renderWindowControl1.RenderWindow.GetInteractor();         }     }