DICOM图像标签读写

需求:修改DICOM图像中的tag

方法:用ITK中的GDCM

#include "itkImage.h"
#include "itkImageSeriesReader.h"
#include "itkGDCMImageIO.h"
#include "itkGDCMSeriesFileNames.h"
#include "itkMetaDataObject.h"
#include "itkImageFileWriter.h"
ReaderType::Pointer m_pReader;
	m_pReader = ReaderType::New();

	typedef itk::MetaDataDictionary DictionaryType;
	DictionaryType &dictionary = m_pReader->GetMetaDataDictionary();

	std::string tagkey = "0010|0021"; // Conversion Type
	std::string value = "xxxx";

	itk::EncapsulateMetaData<std::string>(dictionary, tagkey, value);

	typedef itk::MetaDataObject<std::string> MetaDataStringType;//管理字符串类型
	//从数据字典中可以获得几乎所有dicom标签对应的数值
	DictionaryType::ConstIterator itr=dictionary.Begin();
	DictionaryType::ConstIterator end=dictionary.End();
	while(itr!=end)
	{
		itk::MetaDataObjectBase::Pointer entry=itr->second;
		MetaDataStringType::Pointer entryValue=dynamic_cast<MetaDataStringType *>(entry.GetPointer());
		//dynamic_cast将一个基类对象指针(或引用)cast到继承类指针 MetaDataStringType::Pointer
		if(entryValue)
		{
			std::string tagKey=itr->first;
			std::string labelId;
			bool found=itk::GDCMImageIO::GetLabelFromTag(tagKey,labelId);
			std::string tagValue = entryValue->GetMetaDataObjectValue();
			if(found)
			{
				std::cout<<"("<<tagKey<<")"<<labelId;
				std::cout<<"="<<tagValue.c_str()<<std::endl;
			}
			else
			{
				std::cout<<"("<<tagKey<<")"<<"unknown";
				std::cout<<"="<<tagValue.c_str()<<std::endl;
			}
			++itr;
		}
	}

	ImageType::Pointer input_data = ImageType::New();
	input_data = m_pReader->GetOutput();
	input_data->SetMetaDataDictionary(dictionary);

	itk::GDCMImageIO::Pointer gdcmImageIO =itk::GDCMImageIO::New();
	gdcmImageIO->SetMetaDataDictionary(dictionary);
	gdcmImageIO->SetKeepOriginalUID(false);

	typedef itk::ImageFileWriter< ImageType > WriterType;
	WriterType::Pointer writer = WriterType::New();
	writer->SetMetaDataDictionary(dictionary);
	writer->SetImageIO(gdcmImageIO);	
	writer->SetFileName( "D:/111" );
	writer->SetInput( input_data );
	writer->Update();

ps:博客的编辑器真难用!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值