vs2017使用ITK读取DICOM头文件信息

本文介绍如何使用ITK库在C++中读取DICOM文件并获取患者的基本信息,如姓名、年龄、性别等,通过两个示例展示了如何通过`GDCMImageIO`和`ImageSeriesReader`实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

方法一

一、所需头文件。

#include "itkImageFileReader.h"
#include "itkImageFileWriter.h"
#include "itkGDCMImageIO.h"
#include "itkImageSeriesReader.h"
#include "itkGDCMSeriesFileNames.h"

二、传入文件路径,和所读取头文件信息的指针。传入char*的原因是ITK自带的方法GetPatientName(char*)传入参数是char*.

void contentWindowClass::readDicom(QString path, char * name, char * age, char * sex, char * time, char * ID)
{
	typedef signed short InputPixelType;//设置像素类型
	const unsigned int Dimension = 2;//设置图像维数
	typedef itk::Image<InputPixelType, Dimension> InputImageType;//用新类型名替换
	typedef itk::ImageFileReader<InputImageType> ReaderType;
	typedef itk::GDCMImageIO ImageIOType;

	ImageIOType::Pointer gdcmIO = ImageIOType::New();//创建智能指针
	ReaderType::Pointer reader = ReaderType::New();

	std::string filePath = path.toStdString();//QString类型转换为std::string 类型
	reader->SetImageIO(gdcmIO);//建立reader和gdcmIO的连接
	reader->SetFileName(filePath);//打开文件

	try
	{

		reader->Update();//更新数据时容易出错

	}
	catch (itk::ExceptionObject & e)
	{
		std::cerr << "exception in file reader " << std::endl;
		std::cerr << e.GetDescription() << std::endl;
		std::cerr << e.GetLocation() << std::endl;
		return;
	}
	//reader->GetMetaDataDictionary();???作用
	gdcmIO->GetMetaDataDictionary();//怎么调用const重载类型?????

	gdcmIO->GetPatientName(name);//读取所需头文件数据
	gdcmIO->GetPatientAge(age);
	gdcmIO->GetPatientSex(sex);
	gdcmIO->GetStudyDate(time);
	gdcmIO->GetPatientID(ID);
}

方法二

官方提供的读取病人信息的代码。

参见:D:\ITK\InsightToolkit-4.13.3\Examples\IO\DicomPrintPatientInformation.cxx

#include "itkGDCMImageIO.h"
#include "itkImageFileReader.h"
#include "itkMetaDataObject.h"

std::string FindDicomTag( const std::string & entryId, const itk::GDCMImageIO::Pointer dicomIO )
{
  std::string tagvalue;
  bool found = dicomIO->GetValueFromTag(entryId, tagvalue);
  if ( !found )
    {
    tagvalue = "NOT FOUND";
    }
  return tagvalue;
}


int main( int argc, char* argv[] )
{
  if( argc < 2 )
    {
    std::cerr << "Usage: " << argv[0] << " DicomFile " << std::endl;
    return EXIT_FAILURE;
    }

  typedef signed short       PixelType;
  const unsigned int         Dimension = 2;

  typedef itk::Image< PixelType, Dimension >      ImageType;
  typedef itk::ImageFileReader< ImageType >       ReaderType;

  ReaderType::Pointer reader = ReaderType::New();

  itk::GDCMImageIO::Pointer dicomIO = itk::GDCMImageIO::New();

  reader->SetFileName( argv[1] );
  reader->SetImageIO( dicomIO );

  try
    {
    reader->Update();
    }
  catch (itk::ExceptionObject &ex)
    {
    std::cout << ex << std::endl;
    return EXIT_FAILURE;
    }


  std::string patientName  = FindDicomTag("0010|0010", dicomIO);
  std::string patientID    = FindDicomTag("0010|0020", dicomIO);
  std::string patientSex   = FindDicomTag("0010|0040", dicomIO);
  std::string patientAge   = FindDicomTag("0010|1010", dicomIO);
  std::string studyDate    = FindDicomTag("0008|0020", dicomIO);
  std::string modality     = FindDicomTag("0008|0060", dicomIO);
  std::string manufacturer = FindDicomTag("0008|0070", dicomIO);
  std::string institution  = FindDicomTag("0008|0080", dicomIO);
  std::string model        = FindDicomTag("0008|1090", dicomIO);


  std::cout << "Patient Name : " << patientName  << std::endl;
  std::cout << "Patient ID   : " << patientID    << std::endl;
  std::cout << "Patient Sex  : " << patientSex   << std::endl;
  std::cout << "Patient Age  : " << patientAge   << std::endl;
  std::cout << "Study Date   : " << studyDate    << std::endl;
  std::cout << "Modality     : " << modality     << std::endl;
  std::cout << "Manufacturer : " << manufacturer << std::endl;
  std::cout << "Institution  : " << institution  << std::endl;
  std::cout << "Model        : " << model        << std::endl;

  return EXIT_SUCCESS;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值