一、功能
通過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