ITK 實現多張影象轉成單個nii.gz或mha檔案案例
阿新 • • 發佈:2020-07-01
主要實現的部分是利用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檔案案例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。