2015-10-14 84 views
3

我使用ITK读取DICOM文件,调用如何使用ITK读取另一个标签内的DICOM标签?

dicomIO->GetValueFromTag(...) 

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

如果我使用GetValueFromTag代替“3002 | 0030”,我回读一个空字符串为“3002 | 0030”是曝光序列并且没有值。如何使用ITK读取标签内的标签?仔细查看ITK文档,我看不出有什么办法可以做到这一点?

回答

-1

通常这个标签应该在顶层,因为它是用于X射线/ CT扫描仪的峰值电压。您是否试图直接简单阅读标签“0018 | 0060”,如:

dicomIO->GetValueFromTag("0018|0060") 

+0

是的,它读作值“”。标签在那里,但在另一个标签内。 – imekon

3

显然,您不能使用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; 
} 
+0

正确的SQ值表示从未加载到ITK MetaDataDictionary中,如[见] [https://github.com/InsightSoftwareConsortium/ITK/blob/master/Modules/IO/GDCM/src/itkGDCMImageIO.cxx#L560] – malat

相关问题