如何使用ITK读取另一个标签中的DICOM标签?

我正在使用ITK来读取DICOM文件

dicomIO->GetValueFromTag(...)

读取标签值.这适用于像“300a | 011e”(龙门角)这样的标签.问题在于尝试读取嵌入在“3002 | 0030”内的标签“0018 | 0060”.

如果我使用GetValueFromTag作为“3002 | 0030”我读回一个空字符串,因为“3002 | 0030”是曝光序列并且没有值.如何使用ITK读取标签内的标签?通过ITK文档,我看不到有任何方法可以做到这一点?

最佳答案 显然你不能使用ImageIOType从DICOM读取序列,而是必须使用GDCM.

#include "gdcmReader.h"
#include "gdcmImage.h"
#include "gdcmDataElement.h"
#include "gdcmTag.h"

using namespace gdcm;

bool readGDCMTags(std::string filename, float &kvp)
{
    Reader reader;
    reader.SetFileName(filename.c_str());
    reader.Read();

    File &file = reader.GetFile();
    DataSet &ds = file.GetDataSet();

    const Tag tag(0x3002, 0x0030);
    const Tag subTag(0x0018, 0x0060);

    const DataElement &seq = ds.GetDataElement(tag);

    SmartPointer<SequenceOfItems> sqi = seq.GetValueAsSQ();

    assert(sqi->GetNumberOfItems() == 1);

    Item &item = sqi->GetItem(1);

    DataSet &subds = item.GetNestedDataSet();

    if (!subds.FindDataElement(subTag))
    {
        return false;
    }

    const DataElement &de = item.GetDataElement(subTag);

    const ByteValue *value = de.GetByteValue();

    char *buffer;

    VL vl = value->GetLength();
    uint32_t length = (uint32_t)vl;

    buffer = new char[length + 1];

    value->GetBuffer(buffer, length);

    buffer[length] = 0;

    kvp = (float)atof(buffer);

    delete buffer;

    return true;
}
点赞