本文主要是介绍ITK学习笔记——体数据读,序列dicom写,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
三维医学图像分别可从Axial、Coronal、Sagittal三个方向进行观察,常用的格式也有很多,最常见的就是dcm格式,代表一张切片。为了方便处理,通常在三维上直接对图像进行处理,常用的三维体数据格式有比如nii.gz、mhd、nrrd。但有时我们对三维体数据处理完后不可避免的要对每一张切片进行观察或者后处理,这样就要将一个三维体数据转换成二维的序列。
下面我们用ITK将nii.gz体数据转换为.dcm序列。
#include "itkGDCMImageIO.h"
#include "itkNumericSeriesFileNames.h"
#include "itkImageFileReader.h"
#include "itkImageSeriesWriter.h"
#include "itkMetaDataObject.h"
#include <vector>
#include "itksys/SystemTools.hxx"int main(int argc, char* argv[])
{typedef signed short PixelType;const unsigned int Dimension = 3;typedef itk::Image< PixelType, Dimension > ImageType;typedef itk::ImageFileReader< ImageType > ReaderType;ReaderType::Pointer reader = ReaderType::New();reader->SetFileName("D:/init.nii.gz");try{reader->Update();}catch (itk::ExceptionObject &excp){std::cerr << "Exception thrown while writing the image" << std::endl;std::cerr << excp << std::endl;return EXIT_FAILURE;}typedef itk::GDCMImageIO ImageIOType;typedef itk::NumericSeriesFileNames NamesGeneratorType;ImageIOType::Pointer gdcmIO = ImageIOType::New();const char * outputDirectory = "D:/out/";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;NamesGeneratorType::Pointer namesGenerator = NamesGeneratorType::New();itk::MetaDataDictionary & dict = gdcmIO->GetMetaDataDictionary();std::string tagkey, value;tagkey = "0008|0060"; // Modalityvalue = "MR";itk::EncapsulateMetaData<std::string>(dict, tagkey, value);tagkey = "0008|0008"; // Image Typevalue = "DERIVED\\SECONDARY";itk::EncapsulateMetaData<std::string>(dict, tagkey, value);tagkey = "0008|0064"; // Conversion Typevalue = "DV";itk::EncapsulateMetaData<std::string>(dict, tagkey, value);SeriesWriterType::Pointer seriesWriter = SeriesWriterType::New();seriesWriter->SetInput(reader->GetOutput());seriesWriter->SetImageIO(gdcmIO);ImageType::RegionType region =reader->GetOutput()->GetLargestPossibleRegion();ImageType::IndexType start = region.GetIndex();ImageType::SizeType size = region.GetSize();std::string format = outputDirectory;format += "/image%03d.dcm";namesGenerator->SetSeriesFormat(format.c_str());namesGenerator->SetStartIndex(start[2]);namesGenerator->SetEndIndex(start[2] + size[2] - 1);namesGenerator->SetIncrementIndex(1);seriesWriter->SetFileNames(namesGenerator->GetFileNames());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学习笔记——体数据读,序列dicom写的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!