一、程序功能
讀取一系列的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軟件的說明手冊,官網有)