1

我基本上是在尝试使用 gdcm C++ 库从 DICOM 文件中读取所有或大部分属性值。我很难找出任何非字符串值。gdcm 示例通常假设我事先知道组/元素编号,因此我可以使用属性模板类,但我不需要或对它们感兴趣,我只需要报告所有属性名称和值。实际上这些值应该进入 XML,所以我需要一个字符串表示。我目前拥有的是这样的:

for (gdcm::DataSet::ConstIterator it = ds.Begin(); it!=ds.End(); ++it) {
    const gdcm::DataElement& elem = *it;
    if (elem.GetVR() != gdcm::VR::SQ) {
        const gdcm::Tag& tag = elem.GetTag();
        std::cout << dict.GetDictEntry(tag).GetKeyword() << ": ";
        std::cout << elem.GetValue() << "\n";
    }
}

对于像 UL 这样的数值,输出似乎类似于“Loaded:4”,可能意味着库已经加载了 4 个字节的数据(一个无符号长整数)。这根本没有帮助,如何获得实际值?我肯定忽略了一些明显的东西。

从示例中,似乎有一个 gdcm::StringFilter 类可以做到这一点,但它似乎想在 DICOM 文件中单独搜索每个元素,这会使算法复杂度成为二次方,这当然是我想要的喜欢避免。

TIA 帕沃

4

4 回答 4

1

我最终将 gdcm::StringFilter::ToStringPair() 的部分提取到一个单独的函数中。似乎至少适用于更简单的 DCM 文件......

于 2012-09-10T08:33:48.283 回答
1

你看过gdcmdump吗?您可以使用它将 DICOM 文件输出为文本或 XML。您还可以查看源代码以了解它是如何做到的。

于 2012-08-27T17:17:07.717 回答
1

您也可以先阅读常见问题解答,特别是如何将属性值转换为字符串?

正如那里所解释的,您只需要使用 gdcm:: StringFilter

sf = gdcm.StringFilter()
sf.SetFile(r.GetFile())
print sf.ToStringPair(gdcm.Tag(0x0028,0x0010))
于 2013-12-31T12:25:25.907 回答
0

尝试这样的事情:

gdcm::Reader 阅读器;

reader.SetFileName(absSlicePath.c_str());

if( !_reader.Read() )
{
    return;
} 

gdcm::File file = reader.GetFile();
gdcm::DataSet ds = file.GetDataSet();
std::stringstream strm;
strm << ds;

你会得到一个包含所有 DICOM 标签值的字符串流。实际上,大多数 DICOM 类(DataElement、DataSet 等)都重载了 std::ostream & operator<< (std::ostream &_os, const *Some_Class* &_val)。因此,您可以展开 for 循环并使用 operator<< 将值放入字符串流,然后放入字符串。

例如,如果您使用的是 QT :

ui->pTagsTxt->append(QString(strm.str().c_str()));

于 2013-07-15T11:19:20.160 回答