使用ITK读写DICOM序列

版本: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;
}
  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Skyline_98

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值