如何从多帧 dicom 读取每帧信息

问题描述 投票:0回答:1

我正在使用

dcmtk
来阅读 dicom。此 dicom 文件包含 100 个图像。每个图像都有一个
PatientPosition
。我怎样才能得到这100个
PatientPosition

如果

DicomImage
可以提供100个
PatientPosition
吗? 如果
findAndGetSequenceItem
可以提供100个
PatientPosition
吗? 希望一些 C++ 代码能够获取 100
PatientPosition

任何建议都值得赞赏~~~

dicom dcmtk
1个回答
0
投票

我假设您指的是增强型 DICOM 对象(例如增强型 CT 图像、增强型 MR 图像等)。 在这种情况下,可以在每帧功能组序列中找到特定于帧的标签(该链接显示增强型 MR 图像的参考)。序列中的每个项目都引用一个单独的帧。

我还假设

PatientPosition
您实际上指的是
PatientPositionPatient
,这将是 MR、CT 和其他一些类型图像的相关标签,但无论标签如何,特定于帧的标签的处理都是相同的。每个特定于帧的标签都嵌入到另一个序列中,该序列将相关标签组合在一起 - 在
PatientPositionPatient
的情况下,这是平面位置序列。由于 dcmtk 允许在子序列中递归搜索标签,您甚至不必知道这一点 - 在相关序列项中搜索标签就足够了:

auto dcmFile = new DcmFileFormat;
auto cond = dcmFile->loadFile(filePath);
if (cond.good()) {

    // load the dataset from the DICOM file
    auto* dataset = dcmFile->getDataset();
    DcmSequenceOfItems* sequence;

    // search for the per-frame functional groups sequence
    OFResult result = dataset->findAndGetSequence(DCM_PerFrameFunctionalGroupsSequence, sequence);
    if (result.good() && sequence && !sequence->isEmpty()) {

        // iterate over all items until none remains
        // this will correspond to the number of frames
        for (int frameNr = 0;; ++frameNr) {
            auto* item = sequence->getItem(frame); 
            if (!item) { // could instead get NumberOfFrames first
                break;
            }

            // Image Position Patient has 3 components
            double pos[3];
            for (i = 0; i < 3; ++i) {

                // findAndGetFloat64 automatically converts the strings to double
                if (!item->findAndGetFloat64(DCM_ImagePositionPatient, pos, i, /*searchIntoSub=*/OFTrue ).good()) {
                    // do some error handling here  
                }
            }
            // do something sensible with the result
            std::cout << "Position: " << pos[0] << ", " << pos[1] << ", " << pos[2];
        }
    }
}

请注意,这只是我的想法,可能包含错误。 实际上,您至少需要更好的错误处理,您可能会直接访问包含序列中的标签,而不是递归地搜索它,当然还要将位置保存在合理的地方。

© www.soinside.com 2019 - 2024. All rights reserved.