版本:ITK 5.1.1
关键类:
- itk::ImageSeriesReader 用于读取图像序列;
- itk::ImageSeriesWriter 用于写入图像序列;
- itk::GDCMSeriesFileNames 用于读取序列文件名;
- itk::NumericSeriesFileNames 支持按照特定格式生成序列文件名。
#include <iostream>
#include "itkSymmetricSecondRankTensor.h"
#include "itkGDCMImageIO.h"
#include "itkImage.h"
#include "itkImageSeriesReader.h"
#include "itkGDCMSeriesFileNames.h"
#include "itkImageSeriesWriter.h"
int readAndWriteDicomSeries(){
string directoryName = "D:\\....";//Dicom文件的输入文件夹路径
using PixelType = signed short;
constexpr unsigned int Dimension = 3;
//初始化待读取序列的格式类型
using ImageType = itk::Image<PixelType, Dimension>;
using ReaderType = itk::ImageSeriesReader<ImageType>;
using ImageIOType = itk::GDCMImageIO;
using NamesGeneratorType = itk::GDCMSeriesFileNames;
//设置IO,并获取文件名
ImageIOType::Pointer gdcmIO = ImageIOType::New();
NamesGeneratorType::Pointer namesGenerator = NamesGeneratorType::New();
namesGenerator->SetInputDirectory(directoryName);
const ReaderType::FileNamesContainer& filenames =
namesGenerator->GetInputFileNames();
//输出文件名
std::size_t numberOfFileNames = filenames.size();
std::cout << numberOfFileNames << std::endl;
for (unsigned int fni = 0; fni < numberOfFileNames; ++fni)
{
std::cout << "filename # " << fni << " = ";
std::cout << filenames[fni] << std::endl;
}
//读取dcm序列
ReaderType::Pointer reader = ReaderType::New();
reader->SetImageIO(gdcmIO);
reader->SetFileNames(filenames);
try
{
reader->Update();
}
catch (const itk::ExceptionObject& e)
{
std::cerr << "exception in file reader " << std::endl;
std::cerr << e << std::endl;
return EXIT_FAILURE;
}
//写入Dicom序列
cout << "start write";
const string outputDirectory = "D:...";//Dicom序列的输出路径
itksys::SystemTools::MakeDirectory(outputDirectory);
//设置输出图像格式
using OutputPixelType = unsigned short;
constexpr unsigned int OutputDimension = 2;
using Image2DType = itk::Image<OutputPixelType, OutputDimension>;
using SeriesWriterType = itk::ImageSeriesWriter<ImageType, Image2DType>;
SeriesWriterType::Pointer seriesWriter = SeriesWriterType::New();
//生成输出序列文件名
typedef itk::NumericSeriesFileNames OutputGeneratorType;
OutputGeneratorType::Pointer outputGenerator = OutputGeneratorType::New();
ImageType::IndexType start = region.GetIndex();
ImageType::SizeType outputSize = region.GetSize();
std::string format = outputDirectory;
format += "/image%03d.dcm";
outputGenerator->SetSeriesFormat(format.c_str());
outputGenerator->SetStartIndex(start[2]);
outputGenerator->SetEndIndex(start[2] + outputSize[2] - 1);
outputGenerator->SetIncrementIndex(1);
seriesWriter->SetFileNames(outputGenerator->GetFileNames());
//设置输出数据及参数
seriesWriter->SetInput(filter->GetOutput());
seriesWriter->SetImageIO(gdcmIO);
ImageType::RegionType region =
reader->GetOutput()->GetLargestPossibleRegion();
seriesWriter->SetMetaDataDictionaryArray(
reader->GetMetaDataDictionaryArray());
try
{
seriesWriter->Update();
}
catch (const itk::ExceptionObject& excp)
{
std::cerr << "Exception thrown while writing the series " << std::endl;
std::cerr << excp << std::endl;
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}