四、讀取一系列dcm圖片,然后重新寫入


一、程序功能

  讀取一系列的CT dcm圖片,然后重新寫入到一個文件夾

二、代碼

  

#pragma warning(disable:4996)
#include "itkGDCMImageIO.h" 
#include "itkGDCMSeriesFileNames.h" 
#include "itkImageSeriesReader.h" 
#include "itkImageSeriesWriter.h"

int main(int argc, char** argv)
{
    //定義像素類型,圖像類型,三維有符號數,定義指針
    typedef signed short PixelType;
    const unsigned int Dimension = 3;
    typedef itk::Image< PixelType, Dimension > ImageType;
    typedef itk::ImageSeriesReader< ImageType > ReaderType;

    //聲明讀、寫 DICOM 圖 像 的 itk::GDCMImageIO對象
    //itk::GDCMSeriesFileNames對象將生成並將構成所有體數據的切片的文件名進行排序
    typedef itk::GDCMImageIO ImageIOType;
    typedef itk::GDCMSeriesFileNames NamesGeneratorType;
    ImageIOType::Pointer gdcmIO = ImageIOType::New();
    NamesGeneratorType::Pointer namesGenerator = NamesGeneratorType::New();

    //設置讀取路徑
    //用文件名發生器生成被讀的文件名和被寫的文件名
    namesGenerator->SetInputDirectory("D:\\Files\\ITKFiles\\ITK_5_ReadSeriesDCM\\Data\\InputData");
    const ReaderType::FileNamesContainer& filenames =namesGenerator->GetInputFileNames();

    //設置DICOM圖像IO對象和被讀的文件名的列表
    ReaderType::Pointer reader = ReaderType::New();
    reader->SetImageIO(gdcmIO);
    reader->SetFileNames(filenames);
    try
    {
        reader->Update();
    }
    catch (itk::ExceptionObject& ex)
    {
        std::cout << ex << std::endl;
        return EXIT_FAILURE;
    }
    //得到輸出目錄的名字
    const char* outputDirectory = "D:\\Files\\ITKFiles\\ITK_5_ReadSeriesDCM\\Data\\OutputData";
    //如果目錄
    //還不存在的話,我們就選擇創建目錄。
    itksys::SystemTools::MakeDirectory(outputDirectory);

    //實例化寫圖像的程序
    typedef signed short OutputPixelType;
    const unsigned int OutputDimension = 2;
    typedef itk::Image< OutputPixelType, OutputDimension > Image2DType;
    typedef itk::ImageSeriesWriter<ImageType, Image2DType > SeriesWriterType;

    //我們創建一個序列圖像writer並從reader的輸出連接writer的輸入。這時我們傳遞GDCM
    //圖像IO對象以便能用DICOM格式寫這個圖像。
    SeriesWriterType::Pointer seriesWriter = SeriesWriterType::New();
    seriesWriter->SetInput(reader->GetOutput());
    seriesWriter->SetImageIO(gdcmIO);

    namesGenerator->SetOutputDirectory(outputDirectory);
    seriesWriter->SetFileNames(namesGenerator->GetOutputFileNames());
    seriesWriter->SetMetaDataDictionaryArray(reader->GetMetaDataDictionaryArray());
    try
    {
        seriesWriter->Update();
    }
    catch (itk::ExceptionObject& excp)
    {
        std::cerr << "Exception thrown while writing the series " << std::endl;
        std::cerr << excp << std::endl;
        return EXIT_FAILURE;
    }
    return EXIT_SUCCESS;
}

 三、注意

  第一句是因為有的語法在現在不太符合規范,但是只是算是警告,而不是錯誤

四、參考書目

  《醫學圖像分割與處理》ITK手冊(也就是ITK軟件的說明手冊,官網有)


免責聲明!

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



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