无法使用 VTK (vtkDICOMImageReader) 识别切片 ID/系列 ID
Cant identify slice id/ series id using VTK (vtkDICOMImageReader)
我有两种 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 对目录的解释。这里声明:DICOM数据方面有一些关于what VTK is capable of managing的细节(under detailed description, warning)。 (我不确定我当前的数据是否违反了此规范)
DICOM的第二种目录结构,底层文件夹命名为A-Z,每个文件夹包含25个文件(无后缀),命名为(在每个文件夹中)Z01-Z25。
我可以使用以下方法单独打开文件:
reader->SetFileName(tempFile.c_str());
而不是指定目录。如果我阅读底部文件夹中的所有 25 个,它是来自不同扫描的不同有序块的混合。我准备设置一个函数来浏览目录中的所有文件夹和文件以查找和 assemble 与一次扫描关联的所有切片,但到目前为止我无法 find/appropriately 在 vtkDICOMImageReader 中实现一个函数至:
A:检测我在哪个独特的切片系列集合中(系列标签)
也不
B:检测我当前的系列切片数以及系列总数(切片数/系列切片总数)
我可以根据需要 post 更多来源,但基本上已经尝试在加载来自不同系列的切片时监控 "reader" 和 "sliceData" 中的所有参数,但到目前为止还没有得到任何东西向我提供上述数据。我假设我没有在切片加载之间适当地更新,或者没有查看正确的对象参数。
任何有关我在代码方面做错了什么甚至我对 DICOM 结构的理解不足的信息都将不胜感激!
ps:我正在使用 C++,但我相当确定 Python
中的用法相似
不幸的是,Dicom 非常复杂,根据数据来自哪家公司的扫描仪以及系统的年龄,事情的实施会略有不同。在你的第一个例子中,听起来你有一个简单格式化的目录,里面有单独的切片文件,没有额外的 scout 图像,所以 VTK 能够读入并渲染切片,它看起来很好。
你的第二个例子听起来像是一个更复杂的结构,可能包含多个系列,可能包含 scout 图像甚至 non-image 类型的 Dicom 文件。要处理此类数据,您需要一些逻辑来读取 meta-data 并找出您感兴趣的文件以及如何 assemble 它们。整个集合的 meta-data 包含在一个名为 "dicomdir" 的文件中,该文件应该位于顶级目录中。此数据与 .dcm 文件 headers 中的数据是冗余的,但从该文件读取可以省去从每个文件中单独扫描 header 的麻烦。
VTK 是图像 manipulation/display 库而不是 Dicom 系统。我不确定他们对复杂的目录结构有很好的支持。您可以尝试 reader->SetFileName('dicomdir');
看看他们是否有自动处理此问题的逻辑,但如果可行,我会感到有点惊讶。
如果您要处理像这样的复杂 multi-series 数据,您可能需要使用另一个库来提取所需的信息。我强烈推荐 DCMTK
。这是一个很棒的 open-source C++ 库,用于与 Dicom 一起工作,只是不要期望它超级简单。
正如我在评论中发布的那样,在这种情况下,vtk-dicom 更适合您的需求。以下是一些有用的链接:
- 有关如何使用 vtk-dicom API 扫描目录、根据系列和研究组织数据的教程:https://dgobbi.github.io/vtk-dicom/doc/api/directory.html
- vtk-dicom 文档,附录中有安装说明:http://dgobbi.github.io/vtk-dicom/doc/vtk-dicom.pdf
您不应根据文件名或在目录结构中的位置来推测 DICOM 文件的内容。
相反,DICOM 文件夹的根目录应包含一个 DICOMDIR 文件,其中包含文件列表及其关系(例如,患者对象包含包含系列和图像的研究对象)。
我不知道 VTK 是否提供了一种读取和解释 DICOMDIR 文件的方法;如果不是,那么您可以尝试用 dcmtk or Imebra.
来解释它们
披露:我是 Imebra 的作者
我有两种 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 对目录的解释。这里声明:DICOM数据方面有一些关于what VTK is capable of managing的细节(under detailed description, warning)。 (我不确定我当前的数据是否违反了此规范)
DICOM的第二种目录结构,底层文件夹命名为A-Z,每个文件夹包含25个文件(无后缀),命名为(在每个文件夹中)Z01-Z25。 我可以使用以下方法单独打开文件:
reader->SetFileName(tempFile.c_str());
而不是指定目录。如果我阅读底部文件夹中的所有 25 个,它是来自不同扫描的不同有序块的混合。我准备设置一个函数来浏览目录中的所有文件夹和文件以查找和 assemble 与一次扫描关联的所有切片,但到目前为止我无法 find/appropriately 在 vtkDICOMImageReader 中实现一个函数至:
A:检测我在哪个独特的切片系列集合中(系列标签)
也不
B:检测我当前的系列切片数以及系列总数(切片数/系列切片总数)
我可以根据需要 post 更多来源,但基本上已经尝试在加载来自不同系列的切片时监控 "reader" 和 "sliceData" 中的所有参数,但到目前为止还没有得到任何东西向我提供上述数据。我假设我没有在切片加载之间适当地更新,或者没有查看正确的对象参数。
任何有关我在代码方面做错了什么甚至我对 DICOM 结构的理解不足的信息都将不胜感激!
ps:我正在使用 C++,但我相当确定 Python
中的用法相似不幸的是,Dicom 非常复杂,根据数据来自哪家公司的扫描仪以及系统的年龄,事情的实施会略有不同。在你的第一个例子中,听起来你有一个简单格式化的目录,里面有单独的切片文件,没有额外的 scout 图像,所以 VTK 能够读入并渲染切片,它看起来很好。
你的第二个例子听起来像是一个更复杂的结构,可能包含多个系列,可能包含 scout 图像甚至 non-image 类型的 Dicom 文件。要处理此类数据,您需要一些逻辑来读取 meta-data 并找出您感兴趣的文件以及如何 assemble 它们。整个集合的 meta-data 包含在一个名为 "dicomdir" 的文件中,该文件应该位于顶级目录中。此数据与 .dcm 文件 headers 中的数据是冗余的,但从该文件读取可以省去从每个文件中单独扫描 header 的麻烦。
VTK 是图像 manipulation/display 库而不是 Dicom 系统。我不确定他们对复杂的目录结构有很好的支持。您可以尝试 reader->SetFileName('dicomdir');
看看他们是否有自动处理此问题的逻辑,但如果可行,我会感到有点惊讶。
如果您要处理像这样的复杂 multi-series 数据,您可能需要使用另一个库来提取所需的信息。我强烈推荐 DCMTK
。这是一个很棒的 open-source C++ 库,用于与 Dicom 一起工作,只是不要期望它超级简单。
正如我在评论中发布的那样,在这种情况下,vtk-dicom 更适合您的需求。以下是一些有用的链接:
- 有关如何使用 vtk-dicom API 扫描目录、根据系列和研究组织数据的教程:https://dgobbi.github.io/vtk-dicom/doc/api/directory.html
- vtk-dicom 文档,附录中有安装说明:http://dgobbi.github.io/vtk-dicom/doc/vtk-dicom.pdf
您不应根据文件名或在目录结构中的位置来推测 DICOM 文件的内容。
相反,DICOM 文件夹的根目录应包含一个 DICOMDIR 文件,其中包含文件列表及其关系(例如,患者对象包含包含系列和图像的研究对象)。
我不知道 VTK 是否提供了一种读取和解释 DICOMDIR 文件的方法;如果不是,那么您可以尝试用 dcmtk or Imebra.
来解释它们披露:我是 Imebra 的作者