以下链接是本系列文章,不足之处,可在评论区讨论:
系列文章
以下链接中的代码是完整的且可运行的,链接如下,可按需下载:
dicom成像程序
本篇文章对应 专栏 从零讲解DICOM协议-成像协议中的文章DICOM成像协议剖析和DICOM成像协议实现思路,建议先看以上两篇文章以了解DICOM底层协议,有助于理解代码实现。
上篇文章DICOM成像协议编码实现-数据组解析讲解了DICOM解析引擎的实现思路和整体代码框架,并完成
本篇文章将继续进行以下几部分的代码思路讲解和实现:
完成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,