ITK&&VTK读取DICOM数据并渲染

ITK&&VTK读取DICOM数据
虽然VTK有自带的读取DICOM数据的类,vtkDICOMImageReader,但是该类支持的DICOM数据类型并不多,在测试阶段只能完整读取MR类型的数据,而CT数据读取会出错。
DCMTK能够完整读取任何DICOM的数据头等部分,但是暂未找出如何将数据传递给VTK。
ITK通过编译模块ITKVTKGlue,能够使用itkImageToVTKImageFilter.h将ITK读取的图像数据传递给VTK,其中ITK的数据读取部分如下:
    /* ITK */
    typedef signed short InputPixelType;//dicom 对应数据类型
    const unsigned int   InputDimension = 2;
    typedef itk::Image< InputPixelType, InputDimension > InputImageType;
 
    typedef itk::ImageSeriesReader< InputImageType > ReaderType;//定义图像数据读取
 
    ReaderType::Pointer reader = ReaderType::New();
    reader->SetFileName("D:/VTKCode/Data/IM-0001.dcm");//读取文件路径
 
    typedef itk::GDCMImageIO           ImageIOType;//GDCMImageIO读DICOM
    ImageIOType::Pointer gdcmImageIO = ImageIOType::New();
    //关联GDCMImageIO类后,DICOM数据信息就读入内存,ITK能获取更加全面的信息(比起VTK)
    reader->SetImageIO(gdcmImageIO);//之后可以用gdcmImageIO获取读到的DICOM数据中的各字段信息
 
    try
    {
        reader->Update();//读取数据
    }
    catch (itk::ExceptionObject &ex)
    {
        std::cout << ex << std::endl;
        system("pause");
        return EXIT_FAILURE;
    }


数据读取之后传递给ImageToVTKImageFilter对象:
    /* ITK TO VTK */
    typedef itk::ImageToVTKImageFilter< InputImageType> itkTovtkFilterType;
    itkTovtkFilterType::Pointer itkTovtkImageFilter = itkTovtkFilterType::New();
    itkTovtkImageFilter->SetInput(reader->GetOutput());//设置图像数据从ITK转向VTK
    itkTovtkImageFilter->Update();
itkTovtkImageFilter将ITK读取的图像数据转换成vtkImageData并传给VTK的渲染模块:
    /* vtkImageActor在3D场景下渲染图像 */
    vtkSmartPointer<vtkImageActor> actor = vtkImageActor::New();
    actor->SetInputData(itkTovtkImageFilter->GetOutput());
    actor->InterpolateOff();
    actor->Update();
之后就是VTK渲染的一般步骤:
    vtkSmartPointer<vtkRenderer> render = vtkRenderer::New();
    render->AddActor(actor);
 
    vtkSmartPointer<vtkRenderWindow> window = vtkRenderWindow::New();
    window->SetSize(800, 600);
    window->AddRenderer(render);
 
    vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkRenderWindowInteractor::New();
    interactor->SetRenderWindow(window);
 
    interactor->Initialize();

--------------------- 
作者:cuihaolong 
来源:CSDN 
原文:https://blog.csdn.net/cuihaolong/article/details/53943981 
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/qq_19272431/article/details/88204588
今日推荐