DICOM 文件介绍
DICOM 全名叫 Digital Imaging and Communications in Medicine(医学数字图像与通信),是医学图像和相关信息的过节标准,也定义了临床所需数据医学图像格式;
DICOM 数据格式包含大量属性,例如病人名字、ID、年龄等基本信息,这些信息从储存在 “头文件” 中,这种储存方式避免了病人与图像误配;
一个病人样本 包含多个 DICOM 子文件,单个 DICOM 对象只包含具有一帧像素数据,帧与帧之间以序列形式存在,可以来回切换形成类似于电影放映的情景,类似于把一个3D 图像扫描成像,沿着垂直方向等厚度分割得到
ITK 对 DICOM 数据进行读取
ITK 根据 DICOM 文件读取方式有两种类型,单张 DICOM 读取或 序列 DICOM 读取
ITK 读取单张 DICOM 文件
- itkImageSeriesReader;
- itkGDCMImageIO;
读取后可以通过 itkGCOMImageIO 中 Get*** 函数获取病人相关信息,并打印输出,这里需要注意一点,DICOM 对应的数据类型为 signed short;核心代码:
string DirectoryPath = "D:/Data_Training/Dicom_data/215020265/AT000002.152046493.dcm";
typedef signed short InternalPixelType;
const unsigned int Dimension = 2;
using InternalImageType = itk::Image<InternalPixelType, Dimension>;
typedef itk::Image<InternalPixelType, Dimension> ImageType;
typedef itk::ImageSeriesReader<ImageType> ReaderType;
typedef itk::GDCMImageIO ImageIOType;
ImageIOType::Pointer gdcmIO = ImageIOType::New();
ReaderType::Pointer reader = ReaderType::New();
reader->SetImageIO(gdcmIO);
reader->SetFileNames(DirectoryPath);
// Reading Data;
try
{
reader->Update();
reader->GetMetaDataDictionary();
gdcmIO->GetMetaDataDictionary();// 读取头文件信息;
//信息赋值
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];
char* sex = new char[50];
char* age = new char[50];
char* description = new char[100];
int pixelType = gdcmIO->GetPixelType();
int componentType = gdcmIO->GetComponentType();
int fileType = gdcmIO->GetFileType();
ImageIOType::ByteOrder byteOrder;
byteOrder = gdcmIO->GetByteOrder();
unsigned int dim = 0;
gdcmIO->GetDimensions(dim);
ImageIOType::SizeType imgsize;
imgsize = gdcmIO->GetImageSizeInPixels();
int componetSize = gdcmIO->GetComponentSize();
int dimension = gdcmIO->GetNumberOfDimensions();
int ori = 0;
gdcmIO->GetOrigin(ori);
int spa = 0;
gdcmIO->GetPatientSex(sex);
gdcmIO->GetPatientAge(age);
gdcmIO->GetStudyDescription(description);
gdcmIO->GetSpacing(spa);
gdcmIO->GetPatientName(name);
gdcmIO->GetModality(modility);
gdcmIO->GetPatientID(patientID);
gdcmIO->GetManufacturer(manufacture);
gdcmIO->GetStudyDate(time);
ImageIOType::TCompressionType compressType;
compressType = gdcmIO->GetCompressionType();
gdcmIO->GetInstitution(hospital);
ImageType::SpacingType spacetype;
spacetype = reader->GetOutput()->GetSpacing();
ImageType::PointType origin;
origin = reader->GetOutput()->GetOrigin();
cout << "name:" << name << endl;
cout << "age:" << age << endl;
cout << "sex:" << sex << endl;
cout << "description:" << description << endl;
cout << "hospital:" << hospital << endl;
cout << "modility:" << modility << endl;
cout << "manfacture:" << manufacture << endl;
cout << "dim:" << dim << endl;
cout << "origin:" << origin << endl;
cout << "Time:" << time << endl;
cout << "patientID:" << patientID << endl;
}
catch (const itk::ExceptionObject& excp)
{
cout << " Reading Exceptaion Caught" << endl;
cout << excp.what() << endl;
return EXIT_FAILURE;
}
ITK 读取序列 DICOM 文件
- itkImageSeriesReader;
- itkGDCMImageIO;
- itkGDCMSeriesFileNames;
与单张读取不同的是,多了一个 itkGDCMSeriesFileNames 类,用于打包 DICOM 序列文件,再传入 GDCMImageIO 进行读取
string DirectoryPath = "D:/Data_Training/Dicom_data/215020265";
typedef signed short InternalPixelType;
const unsigned int Dimension = 3;
using InternalImageType = itk::Image<InternalPixelType, Dimension>;
typedef itk::Image<InternalPixelType, Dimension> ImageType;
typedef itk::ImageSeriesReader<ImageType> ReaderType;
typedef itk::GDCMImageIO ImageIOType;
typedef itk::GDCMSeriesFileNames NamesGeneratorType;
ImageIOType::Pointer gdcmIO = ImageIOType::New();
NamesGeneratorType::Pointer namesGenerator = NamesGeneratorType::New();
namesGenerator->SetInputDirectory(DirectoryPath);
const ReaderType::FileNamesContainer & filenames =
namesGenerator->GetInputFileNames();
std::size_t numberOfFileNames = filenames.size();
std::cout << numberOfFileNames << std::endl;
ReaderType::Pointer reader = ReaderType::New();
reader->SetImageIO(gdcmIO);
reader->SetFileNames(filenames);
// Reading Data;
try
{
reader->Update();
reader->GetMetaDataDictionary();
gdcmIO->GetMetaDataDictionary();// 读取头文件信息;
//信息赋值
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];
char* sex = new char[50];
char* age = new char[50];
char* description = new char[100];
int pixelType = gdcmIO->GetPixelType();
int componentType = gdcmIO->GetComponentType();
int fileType = gdcmIO->GetFileType();
ImageIOType::ByteOrder byteOrder;
byteOrder = gdcmIO->GetByteOrder();
unsigned int dim = 0;
gdcmIO->GetDimensions(dim);
ImageIOType::SizeType imgsize;
imgsize = gdcmIO->GetImageSizeInPixels();
int componetSize = gdcmIO->GetComponentSize();
int dimension = gdcmIO->GetNumberOfDimensions();
int ori = 0;
gdcmIO->GetOrigin(ori);
int spa = 0;
gdcmIO->GetPatientSex(sex);
gdcmIO->GetPatientAge(age);
gdcmIO->GetStudyDescription(description);
gdcmIO->GetSpacing(spa);
gdcmIO->GetPatientName(name);
gdcmIO->GetModality(modility);
gdcmIO->GetPatientID(patientID);
gdcmIO->GetManufacturer(manufacture);
gdcmIO->GetStudyDate(time);
ImageIOType::TCompressionType compressType;
compressType = gdcmIO->GetCompressionType();
gdcmIO->GetInstitution(hospital);
ImageType::SpacingType spacetype;
spacetype = reader->GetOutput()->GetSpacing();
ImageType::PointType origin;
origin = reader->GetOutput()->GetOrigin();
cout << "name:" << name << endl;
cout << "age:" << age << endl;
cout << "sex:" << sex << endl;
cout << "description:" << description << endl;
cout << "hospital:" << hospital << endl;
cout << "modility:" << modility << endl;
cout << "manfacture:" << manufacture << endl;
cout << "dim:" << dim << endl;
cout << "origin:" << origin << endl;
cout << "Time:" << time << endl;
cout << "patientID:" << patientID << endl;
}
catch (const itk::ExceptionObject& excp)
{
cout <