相比于VTK类库中vtkDICOMImageReader类读取DICOM序列图像,借助ITK类库实现对DICOM序列图像的读取要复杂许多。但是,使用ITK类库读取图像不像使用VTK类库那么功能局限,VTK类库对每种图像格式都有着专门的读写类,像vtkDICOMImageReader类只能读取普通的DICOM图像,对于压缩后的DICOM图像则只能通过ITK类库来实现读取。
当系统使用ITK来进行读取DICOM格式文件时,基于ITK类库中itkGDCMSeriesFileNames.h头文件,创建一个itk::GDCMSeriesFileNames类型的智能指针,该指针可用于读取并保存DICOM序列图像的文件夹路径,通过该类中的静态函数SetDirectory()实现。基于itkImageSeriesReader.h头文件,声明和实例化读写 DICOM 序列图像的itk::ImageSeriesReader对象,该指针主要负责在指定的文件夹路径下读取DICOM序列图像,通过该类中的静态函数SetFileNames()实现。基于itkImageToVTKImageFilter.h头文件,声明和实例化ITK到VTK转换通道的itk::ImageToVTKImageFilter对象,借助该类中的静态函数SetInput()和Update()实现。基于vtkImageFlip类,负责将从ITK转换到VTK的数据保存供下一步操作,借助该类中的静态函数SetInputData()和Update()实现。
代码实现
头文件
#include "itkImageToVTKImageFilter.h"
#include "itkImage.h"
#include "itkGDCMImageIO.h"
#include "itkGDCMSeriesFileNames.h"
#include "itkImageSeriesReader.h"
宏定义
using namespace std;
typedef short PixelType;
const unsigned int Dimension = 2;
typedef itk::Image< PixelType, Dimension > Input2dImageType;
typedef itk::Image< PixelType, 3 > Input3dImageType;
typedef itk::Image< PixelType, Dimension > Output2dImageType;
typedef itk::Image< PixelType, 3 > Output3dImageType;
typedef itk::GDCMImageIO ImageIOType;//GDCMImageIO读DICOM
ImageIOType::Pointer gdcmImageIO = ImageIOType::New();
using ReaderType3d = itk::ImageSeriesReader< Input3dImageType >;
ReaderType3d::Pointer reader3d = ReaderType3d::New();
typedef itk::ImageFileReader< Input2dImageType > ReaderType2d;
ReaderType2d::Pointer reader2d = ReaderType2d::New();
using NamesGeneratorType = itk::GDCMSeriesFileNames;
NamesGeneratorType::Pointer nameGenerator = NamesGeneratorType::New();
主要实现
reader3d->SetImageIO(gdcmImageIO);
nameGenerator->SetUseSeriesDetails(true);
nameGenerator->SetDirectory(file_path_str);
using SeriesIdContainer = std::vector< std::string >;
const SeriesIdContainer& seriesUID = nameGenerator->GetSeriesUIDs();
auto seriesItr = seriesUID.begin();
auto seriesEnd = seriesUID.end();
using FileNamesContainer = std::vector< std::string >;
FileNamesContainer fileNames;
std::string seriesIdentifier;
while (seriesItr != seriesEnd)
{
seriesIdentifier = seriesItr->c_str();
fileNames = nameGenerator->GetFileNames(seriesIdentifier);
++seriesItr;
}
reader3d->SetFileNames(fileNames);
reader3d->Update();
typedef itk::ImageToVTKImageFilter< Input3dImageType> itkTovtkFilterType;
itkTovtkFilterType::Pointer itkTovtkImageFilter = itkTovtkFilterType::New();
itkTovtkImageFilter->SetInput(reader3d->GetOutput());//设置图像数据从ITK转向VTK
itkTovtkImageFilter->Update();
vtkSmartPointer< vtkImageFlip > reader1 = vtkSmartPointer< vtkImageFlip >::New();
reader1->SetInputData(itkTovtkImageFilter->GetOutput());
reader1->SetFilteredAxes(1);
reader1->Update();
原文链接:https://blog.csdn.net/qq_41060452/article/details/118544058