1. 程式人生 > 程式設計 >ITK 實現多張影象轉成單個nii.gz或mha檔案案例

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;
}

補充知識:將一組png圖片轉為nii.gz

主要之前使用matlab 對numpy陣列存放方式不是很瞭解.應該是[z,x,y]這樣在itksnamp上看就對了

import SimpleITK as sitk
import glob
import numpy as np
from PIL import Image
import cv2
 
import matplotlib.pyplot as plt # plt 用於顯示圖片
def save_array_as_nii_volume(data,filename,reference_name = None):
 """
 save a numpy array as nifty image
 inputs:
 data: a numpy array with shape [Depth,Height,Width]
 filename: the ouput file name
 reference_name: file name of the reference image of which affine and header are used
 outputs: None
 """
 img = sitk.GetImageFromArray(data)
 if(reference_name is not None):
 img_ref = sitk.ReadImage(reference_name)
 img.CopyInformation(img_ref)
 sitk.WriteImage(img,filename)
 
image_path = './oriCvLab/testCvlab/img/'
image_arr = glob.glob(str(image_path) + str("/*"))
image_arr.sort()
 
print(image_arr,len(image_arr))
allImg = []
allImg = np.zeros([165,768,1024],dtype='uint8')
for i in range(len(image_arr)):
 single_image_name = image_arr[i]
 img_as_img = Image.open(single_image_name)
 # img_as_img.show()
 img_as_np = np.asarray(img_as_img)
 allImg[i,:,:] = img_as_np
 
# np.transpose(allImg,[2,1])
save_array_as_nii_volume(allImg,'./testImg.nii.gz')
print(np.shape(allImg))
img = allImg[:,55]
# plt.imshow(img,cmap='gray')
# plt.show()

以上這篇ITK 實現多張影象轉成單個nii.gz或mha檔案案例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。