如何使用 ITK 读取另一个标签中的 DICOM 标签?
How do I read a DICOM tag within another tag with ITK?
我正在使用 ITK 读取 DICOM 文件,调用
dicomIO->GetValueFromTag(...)
读取标签值。这适用于像“300a|011e”(机架角度)这样的标签。问题是试图读取嵌入在“3002|0030”中的标签“0018|0060”。
如果我对“3002|0030”使用 GetValueFromTag,我会读回一个空字符串,因为“3002|0030”是曝光序列并且没有值。如何使用 ITK 读取标签内的标签?翻阅 ITK 文档我看不出有什么方法可以做到这一点?
通常该标签应该位于顶层,因为它是 Xray/CT 扫描仪使用的峰值电压。您是否尝试过直接读取标签“0018|0060”,例如:
dicomIO->GetValueFromTag("0018|0060")
?
显然您不能使用 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;
}
我正在使用 ITK 读取 DICOM 文件,调用
dicomIO->GetValueFromTag(...)
读取标签值。这适用于像“300a|011e”(机架角度)这样的标签。问题是试图读取嵌入在“3002|0030”中的标签“0018|0060”。
如果我对“3002|0030”使用 GetValueFromTag,我会读回一个空字符串,因为“3002|0030”是曝光序列并且没有值。如何使用 ITK 读取标签内的标签?翻阅 ITK 文档我看不出有什么方法可以做到这一点?
通常该标签应该位于顶层,因为它是 Xray/CT 扫描仪使用的峰值电压。您是否尝试过直接读取标签“0018|0060”,例如:
dicomIO->GetValueFromTag("0018|0060")
?
显然您不能使用 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;
}