十ITK讀取一張dcm圖像然后通過vtk顯示


一、功能

  通過ITK讀取一張圖片(dcm格式),然后通過vtk顯示出來。

  版本:VS2019

      itk5.0.1

     vtk 8.2.0

二、程序主要思路

  1-讀取dcm格式圖片

  2-轉換為vtk可以讀取的數據類型

  3-設置顯示參數,然后顯示出來

三、代碼

  工程構建參見前面的博客,代碼部分如下:

//保證VTK正常運行
#include "vtkAutoInit.h" 
VTK_MODULE_INIT(vtkRenderingOpenGL2); // VTK was built with vtkRenderingOpenGL2
VTK_MODULE_INIT(vtkInteractionStyle);

#include "itkImage.h"
#include "itkImageFileReader.h"
#include "itkGDCMImageIO.h"
#include "itkImageToVTKImageFilter.h"

#include <vtkSmartPointer.h>
#include <vtkImageActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleImage.h>

int main(int argc, char * argv[])
{
    
    //設置讀取圖像類型
    using PixelType=signed short;
    const unsigned int  Dimension= 2 ;
    typedef itk::Image<PixelType, Dimension> ImageType;
    typedef itk::ImageFileReader<ImageType> ReaderType;
    //讀取指針
    ReaderType::Pointer reader = ReaderType::New();
    //設置讀取文件
    reader->SetFileName("D:\\Files\\Data\\3219032438350584179-8\\DICOM\\S258070\\S20\\I10");
    //創建讀取DCM的GDCMIOImage類
    using ImageIOType =itk::GDCMImageIO;
    ImageIOType::Pointer gdcmImageIO = ImageIOType::New();
    reader->SetImageIO(gdcmImageIO);
    try
    {
        reader->Update();
    }
    catch (itk::ExceptionObject& e)
    {
        std::cerr << "exception in file reader" << std::endl;
        std::cerr << e << std::endl;
        return EXIT_FAILURE;
    }

    //鏈接濾波器,轉換為VTK類型
    typedef itk::ImageToVTKImageFilter<ImageType> ConnectorType;
    ConnectorType::Pointer connector = ConnectorType::New();
    connector->SetInput(reader->GetOutput());
    try
    {
        connector->Update();
    }
    catch (itk::ExceptionObject& e)
    {
        std::cerr << "exception in file reader" << std::endl;
        std::cerr << e << std::endl;
        return EXIT_FAILURE;
    }

    /* vtkImageActor在3D場景下渲染圖像 */
    vtkSmartPointer<vtkImageActor> actor = vtkImageActor::New();
    actor->SetInputData(connector->GetOutput());
    actor->InterpolateOff();
    actor->Update();
    

    vtkSmartPointer<vtkRenderer> render = vtkRenderer::New();
    render->AddActor(actor);
    render->SetBackground(255, 1, 1);//設置窗口背景顏色

    vtkSmartPointer<vtkRenderWindow> window = vtkRenderWindow::New();
    window->SetSize(600, 600);       //設置窗口大小
    window->AddRenderer(render);
    window->SetWindowName("the CT picture ");//設置窗口名稱

    vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkRenderWindowInteractor::New();
    interactor->SetRenderWindow(window);

    interactor->Initialize();
    interactor->Start();
    return 0;
}

四、結果顯示

  在這里注意,我發現如果設置的讀取的讀片類型不同,顯示的效果會有差異:

  比如如果圖片格式是:

//設置讀取圖像類型
    using PixelType=unsigned char;
    const unsigned int  Dimension= 2 ;
    typedef itk::Image<PixelType, Dimension> ImageType;

  圖片效果如下:

  

   如果圖片格式設置如下:

    //設置讀取圖像類型
    using PixelType=signed short;
    const unsigned int  Dimension= 2 ;
    typedef itk::Image<PixelType, Dimension> ImageType;    

  圖片顯示如下:

  

   感覺都不是很清晰。

五、參考文獻

  關於vtk如何現實圖片:https://blog.csdn.net/shenziheng1/article/details/54565337

  代碼主要來源:https://blog.csdn.net/cuihaolong/article/details/53943981


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM