ITK 多張圖像轉成單個nii.gz或mha文件

主要實現的部分是利用NameGeneratorType讀入系列圖像,見頭文件#include "itkNumericSeriesFileNames.h"。

需要包含的頭文件有:

#include "itkImage.h"

#include "itkImageSeriesReader.h"

#include "itkImageFileWriter.h"
#include "itkNumericSeriesFileNames.h"
#include "itkPNGImageIO.h"//轉成JPG格式,將PNG替換成JPEG就可以。

int main( int argc, char ** argv )
{
  // 需要四個參數,分別是程序起點,第一張圖像的編號和最後一張圖像的變化,輸出文件的名稱(包含路徑)
  if( argc < 4 )
    {
    std::cerr << "Usage: " << std::endl;
    std::cerr << argv[0] << " firstSliceValue lastSliceValue  outputImageFile " << std::endl;
    return EXIT_FAILURE;
    }
//定義讀入圖像類型,創建對應的reader
  typedef unsigned char           PixelType;
  const unsigned int Dimension = 3;


  typedef itk::Image< PixelType, Dimension >  ImageType;
 
  typedef itk::ImageSeriesReader< ImageType >  ReaderType;
  typedef itk::ImageFileWriter<   ImageType >  WriterType;


  ReaderType::Pointer reader = ReaderType::New();
  WriterType::Pointer writer = WriterType::New();


//輸入參數定義

  const unsigned int first = atoi( argv[1] );
  const unsigned int last  = atoi( argv[2] );
  const char * outputFilename = argv[3];//輸出的文件名加上對應格式的後綴即可,如mha或nii.gz



//系列圖像讀入
  typedef itk::NumericSeriesFileNames    NameGeneratorType;
  NameGeneratorType::Pointer nameGenerator = NameGeneratorType::New();
  nameGenerator->SetSeriesFormat( "vwe%03d.png" );


  nameGenerator->SetStartIndex( first );
  nameGenerator->SetEndIndex( last );
  nameGenerator->SetIncrementIndex( 1 );//張數的增長間距


//讀入圖像,寫出圖像,進行Update
  reader->SetImageIO( itk::PNGImageIO::New() );
  reader->SetFileNames( nameGenerator->GetFileNames()  );
  writer->SetFileName( outputFilename );
  writer->SetInput( reader->GetOutput() );

  try
    {
    writer->Update();
    }
  catch( itk::ExceptionObject & err )
    {
    std::cerr << "ExceptionObject caught !" << std::endl;
    std::cerr << err << std::endl;
    return EXIT_FAILURE;
    }

  return EXIT_SUCCESS;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章