我正在使用
dcmtk
来阅读 dicom。此 dicom 文件包含 100 个图像。每个图像都有一个PatientPosition
。我怎样才能得到这100个PatientPosition
?
如果
DicomImage
可以提供100个PatientPosition
吗?
如果findAndGetSequenceItem
可以提供100个PatientPosition
吗?
希望一些 C++ 代码能够获取 100 PatientPosition
。
任何建议都值得赞赏~~~
我假设您指的是增强型 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];
}
}
}
请注意,这只是我的想法,可能包含错误。 实际上,您至少需要更好的错误处理,您可能会直接访问包含序列中的标签,而不是递归地搜索它,当然还要将位置保存在合理的地方。