6 DICOM成像协议编码实现-读取元素

以下链接是本系列文章,不足之处,可在评论区讨论:系列文章  本篇文章对应 专栏 从零讲解DICOM协议-成像协议中的文章DICOM成像协议剖析和DICOM成像协议实现思路,建议先看以上两篇文章以了解DICOM底层协议,有助于理解代码实现。上篇文章DICOM成像协议编码实现-数据组解析讲解了DICOM解析引擎的实现思路和整体代码框架,并完成读取DICOM文件至内存中的代码实现。读取文件头按照元数据组特性读取元数据组中的各个DataElement按照数据组特性读取数据组中的各个DataEleme
摘要由CSDN通过智能技术生成

以下链接是本系列文章,不足之处,可在评论区讨论:
系列文章

以下链接中的代码是完整的且可运行的,链接如下,可按需下载:
dicom成像程序

  本篇文章对应 专栏 从零讲解DICOM协议-成像协议中的文章DICOM成像协议剖析DICOM成像协议实现思路,建议先看以上两篇文章以了解DICOM底层协议,有助于理解代码实现。

上篇文章DICOM成像协议编码实现-数据组解析讲解了DICOM解析引擎的实现思路和整体代码框架,并完成

  1. 读取DICOM文件至内存中
  2. 读取文件头到文件头对象中
  3. 按照元数据组特性读取元数据组中的各个DataElement
  4. 按照数据组特性读取数据组中的各个DataElement

本篇文章将继续进行以下几部分的代码思路讲解和实现:

  1. 如果PixelData是压缩格式,则用相应的解压算法解压
  2. CT值转BMP,保存BMP图像

  完成DICOM文件的解析后,数据按照vector< DcmElement > 存储,此时要获取某一元素,直接按照tag查询。
  前面解析DcmElement时,只是从内存中拷贝连续地址空间内的数据,并没有按照大小端格式处理数据,此时数据是不能直接用的。在获得对应的DcmElement后,需要进行大小端处理,转换后的数据才是有效数据。且vr由27种类型,还要对数据进行类型转型。

  根据tag名称获取元素值。构造枚举变量,和tag的group,element对应,简化输入。DICOM由4000多个元素,其中常用的如下

enum class TagName
{
   
	TransferSyntaxUID,//UI - Unique Identifier (UID)唯一标识符
	PatientName,	  //PN - Person Name病人姓名
	PixelData,	      //OW - Other Word String其他单词字符串
	FramesNum,		  //IS - Integer String整型字符串
	Row,			  //US - Unsigned Short 无符号短型
	Col,			  //US - Unsigned Short 无符号短型
	BitsAllocated,	  //US - Unsigned Short 无符号短型
	SamplesPerPixel,  //US - Unsigned Short 无符号短型
	PixelRepresentation,//US - Unsigned Short 无符号短型
	HighBit,			//US - Unsigned Short 无符号短型
	RescaleSlope,		//DS - Unsigned Short 无符号短型
	RescaleIntercept,	//DS - Decimal String 小数字符串
	WindowCenter,		//DS - Decimal String 小数字符串
	WindowWidth,		//DS - Decimal String 小数字符串
	Photometric,			//CS - Code String代码字符串


	ID,
	BirthDay,
	SeriesNum,
	InstanceNum,
	SeriesInstanceUID,
	Manufacturer,
	InstitutionName,

	Sex,
	Weight,
	Thickness,

	PixelSpacing,
	BitsStored,
	SmallestImagePixelValue,
	LargestImagePixelValue,
	PlanarConfiguration,
	Modality,
	SliceLocation,
	ImagePosition,
};
const char TagType::MetadataFlag[2] = {
    0x02, 0x00 };
const char TagType::SQ[2] = {
    'S', 'Q' };
const char TagType::SQItemBegin[4] = {
    0xFE, 0xFF, 0x00, 0xE0 };
const char TagType::SQItemEnd[4] = {
    0xFE, 0xFF, 0x0D, 0xE0 };
const char TagType::SQEnd[4] = {
    0xFE, 0xFF, 0xDD, 0xE0 };
const char TagType::TransferSyntaxUID[4] = {
    0x02, 0x00, 0x10, 0x00 };
const char TagType::PatientName[4] = {
    0x10, 0x00, 0x10, 0x00 };
const char TagType::PixelData[4] = {
    0xE0, 0x7F, 0x10, 0x00 };
const char TagType::FramesNum[4] = {
    0x28, 0x00, 0x08, 0x00 };
const char TagType::Row[4] = {
    0x28, 0x00, 0x10, 0x00 };
const char TagType::Col[4] = {
    0x28, 0x00, 0x11, 0x00 };
const char TagType::BitsAllocated[4] = {
    0x28, 0x00, 0x00, 0x01 };
const char TagType::SamplesPerPixel[4] = {
    0x28, 0x00, 0x02, 0x00 };
const char TagType::PixelRepresentation[4] = {
    0x28, 0x00, 0x03, 0x01 };
const char TagType::HighBit[4] = {
    0x28, 0x00, 0x02, 0x01 };
const char TagType::RescaleSlope[4] = {
    0x28, 0x00, 0x53, 0x10 };
const char TagType::RescaleIntercept[4] = {
    0x28, 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DICOM医学影像

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值