python - 无法使用 VTK (vtkDICOMImageReader) 识别切片 ID/系列 ID

标签 python c++ vtk dicom point-cloud-library

我有两种 DICOM 数据,第一种适用于我现有的代码(我构建它的基础),但我无法导入第二种。

第一种样式有一个底层文件夹,其中包含该文件夹中一次扫描的所有切片(按顺序排列的“.dcm”文件)。我只是使用以下代码将 vtk 指向目录:

vtkSmartPointer<vtkDICOMImageReader> reader = vtkSmartPointer<vtkDICOMImageReader>::New();
reader->SetDirectoryName(dicomDirectory.c_str());
reader->Update();
vtkSmartPointer<vtkImageData> sliceData = reader->GetOutput();
double tempIntensity = sliceData->GetScalarComponentAsDouble(x, y, z, 0);

这不是直接来源(我检查尺寸并设置迭代等)。但简而言之,它有效……我通过这种方法引入了几个不同的 dicom 卷。 (并检查并操纵了生成的体积云)


这取决于 VTK 对目录的解释。这里声明:关于what VTK is capable of managing的一些细节(根据详细说明,警告)在 DICOM 数据方面。 (我不确定我当前的数据是否违反了这个规范)

DICOM 的第二种样式具有目录结构,其中底层文件夹命名为 A-Z,每个文件夹包含 25 个文件(无后缀),名称(在每个文件夹中)为 Z01-Z25。 我可以使用以下方法单独打开文件:

reader->SetFileName(tempFile.c_str());

而不是指定目录。如果我阅读底部文件夹中的所有 25 个,它是来自不同扫描的不同有序 block 的混合。我准备设置一个函数来浏览目录中的所有文件夹和文件,以查找和组装与一次扫描相关的所有切片,但到目前为止,我一直无法在 vtkDICOMImageReader 中找到/适本地实现一个函数来:

A:检测我在哪个独特的系列切片集(系列标签)

也不

B:检测我当前的系列切片数以及系列总计数(切片计数/系列切片总数)


我可以根据需要发布更多源代码,但基本上已经尝试在加载来自不同系列的切片时监控“reader”和“sliceData”中的所有参数,但到目前为止还没有任何东西可以为我提供上述数据。我假设我没有在切片加载之间适本地更新,或者没有查看正确的对象参数。

任何有关我在代码方面做错了什么,甚至是我对 DICOM 结构的理解不足的任何信息,我们将不胜感激!

ps: 我正在使用 c++,但我相当确定在 Python 中的用法是相似的

最佳答案

不幸的是,Dicom 非常复杂,根据数据来自哪家公司的扫描仪以及系统的老旧,事情的实现会略有不同。在你的第一个例子中,听起来你有一个简单格式化的目录,里面有单独的切片文件,没有额外的侦察图像,所以 VTK 能够读入并渲染切片,它看起来很好。

你的第二个例子听起来像是一个更复杂的结构,可能包含多个系列,可能包含侦察图像甚至非图像类型的 Dicom 文件。为了处理这种类型的数据,您需要一些逻辑来读取元数据并找出您感兴趣的文件以及如何组合它们。整个集合的元数据包含在一个名为“dicomdir”的文件中,该文件应该位于顶级目录中。此数据与 .dcm 文件 header 中的数据是冗余的,但从该文件中读取可以省去单独扫描每个文件 header 的麻烦。

VTK 是图像处理/显示库,而不是 Dicom 系统。我不确定他们对复杂的目录结构有很好的支持。您可以尝试 reader->SetFileName('dicomdir'); 并查看它们是否具有自动处理此问题的逻辑,但如果可行,我会感到有点惊讶。

如果您要处理像这样的复杂的多系列数据,您可能需要使用另一个库来提取所需的信息。我强烈推荐 DCMTK。这是一个用于 Dicom 的优秀开源 C++ 库,只是不要期望它 super 简单。

关于python - 无法使用 VTK (vtkDICOMImageReader) 识别切片 ID/系列 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48329092/

相关文章:

python - 用于在城市 map 上绘制点的好 python 工具包?

python - 使用 for 循环在单个图中显示多个图表

C++ : Multiple inheritance with polymorphism

c++ - 对数组使用unique_ptr,如何在 Debug模式下查看每个值 "local"或 "watch"标签

c++ - 用于碰撞检测实现的四叉树

python - 转换 vtkUnstructedGrid 的点数据类型

Python - 检查 "subdictionary"

python - setuptools:是否可以根据开发或安装安装不同的文件?

python - 从Python中的元组列表创建vtkPolyData对象

vtk - 通过平面将 vtk 多数据分割为两个多数据