ITK提供強大的圖像處理功能,VTK則提供強大的圖像可視化功能。
比較VTK而言,ITK能夠獲取更全面的DICOM頭文件中所包含的醫學信息和病人信息。ITK能夠讀單張圖片或序列圖片。
(1)ITK能夠讀單張圖片並獲取頭文件中信息:
typedef signed short InputPixelType;//dicom 對應數據類型
const unsigned int InputDimension = 2;
typedef itk::Image< InputPixelType, InputDimension > InputImageType;
typedef itk::ImageSeriesReader< InputImageType > ReaderType;
ReaderType::Pointer reader = ReaderType::New();
reader->SetFileName( argv[1] );
typedef itk::GDCMImageIO ImageIOType;//GDCMImageIO讀DICOM
ImageIOType::Pointer gdcmImageIO = ImageIOType::New();
//關聯GDCMImageIO類後,DICOM數據信息就讀入內存,ITK能獲取更加全面的信息(比起VTK)
reader->SetImageIO( gdcmImageIO );
try
{
reader->Update();
reader->GetMetaDataDictionary();//獲取DIOCM頭文件中信息
gdcmImageIO->GetMetaDataDictionary();//獲取DIOCM頭文件中信息
//舉例獲取頭文件中部分信息
char* name = new char[50];//開闢空間而不是賦初值
char* patientID = new char[50];
char* time = new char[50];
char* manufacture = new char[50];
char* modility = new char[50];
char* hospital = new char[50];
int pixelType = gdcmImageIO->GetPixelType();
int componetType = gdcmImageIO->GetComponentType();
int fileType = gdcmImageIO->GetFileType();
ImageIOType::ByteOrder byteOrder;
byteOrder = gdcmImageIO->GetByteOrder();
unsigned int dim = 0;
gdcmImageIO->GetDimensions(dim);
ImageIOType::SizeType imgSize;
imgSize = gdcmImageIO->GetImageSizeInPixels();
int componetSize = gdcmImageIO->GetComponentSize();
int dimension = gdcmImageIO->GetNumberOfDimensions();
int ori = 0;
gdcmImageIO->GetOrigin(ori);
int spa = 0;
gdcmImageIO->GetSpacing(spa);
gdcmImageIO->GetPatientName(name);
gdcmImageIO->GetModality(modility);
gdcmImageIO->GetPatientID(patientID);
gdcmImageIO->GetManufacturer(manufacture);
gdcmImageIO->GetStudyDate(time);
ImageIOType::TCompressionType compressType;
compressType = gdcmImageIO->GetCompressionType();
gdcmImageIO->GetInstitution(hospital);
InputImageType::SpacingType type;
type = reader->GetOutput()->GetSpacing();
InputImageType::PointType origin;
origin= reader->GetOutput()->GetOrigin();
}
(1)ITK能夠讀序列圖片
typedef signed short PixelType;
const unsigned int Dimension = 3;
typedef itk::Image< PixelType, Dimension > ImageType;
typedef itk::ImageSeriesReader< ImageType > ReaderType;//讀序列圖片
ReaderType::Pointer itkReader = ReaderType::New();
typedef itk::GDCMImageIO ImageIOType;//讀DICOM圖片
ImageIOType::Pointer dicomIO = ImageIOType::New();
itkReader->SetImageIO( dicomIO );//數據讀入內存
typedef itk::GDCMSeriesFileNames NamesGeneratorType;
NamesGeneratorType::Pointer nameGenerator = NamesGeneratorType::New();
nameGenerator->SetUseSeriesDetails( true );
nameGenerator->AddSeriesRestriction("0008|0021" );
nameGenerator->SetDirectory(inputFileName);//設置文件目錄
typedef std::vector< std::string > SeriesIdContainer;
const SeriesIdContainer & seriesUID = nameGenerator->GetSeriesUIDs();
SeriesIdContainer::const_iterator seriesItr = seriesUID.begin();//迭代器
SeriesIdContainer::const_iterator seriesEnd = seriesUID.end();
std::string seriesIdentifier;
seriesIdentifier = seriesUID.begin()->c_str();//通過迭代器讀取所有單張切片
typedef std::vector< std::string > FileNamesContainer;
FileNamesContainer fileNames;
fileNames = nameGenerator->GetFileNames( seriesIdentifier );
itkReader->SetFileNames( fileNames );
itkReader->Update();
dicomIO->GetMetaDataDictionary();//獲取DIOCM頭文件中信息
結合ITK, VTK各自的優點,用ITK讀DICOM頭文件信息,用VTK顯示DICOM數據。讀取數據的結果在本人基於QT開發的數字圖像處理軟件中,結果如圖所示: