Python 无法使用VTK(vtkDICOMImageReader)识别片id/序列id

Python 无法使用VTK(vtkDICOMImageReader)识别片id/序列id,python,c++,vtk,dicom,point-cloud-library,Python,C++,Vtk,Dicom,Point Cloud Library,我有两种风格的DICOM数据,第一种与我构建它的现有代码一起工作,但我无法导入第二种 第一种样式有一个底层文件夹,其中包含一次扫描中的所有切片,这些切片位于该文件夹中的有序.dcm文件中。我使用以下代码简单地将vtk指向目录: vtkSmartPointer<vtkDICOMImageReader> reader = vtkSmartPointer<vtkDICOMImageReader>::New(); reader->SetDirectoryName(dicom

我有两种风格的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);
而不是指定目录。如果我在底部的一个文件夹中阅读所有的25个,它是来自不同扫描的不同有序块的混合。我已准备好设置一个功能,以浏览目录中的所有文件夹和文件,以查找和组装与一次扫描相关的所有切片,但到目前为止,我无法在vtkDICOMImageReader中找到/适当实现以下功能:

A:检测序列标签中我是哪一组唯一的序列片

也不是

B:检测序列中的当前片数以及总序列计数片数/序列片总数

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

任何关于我在代码方面做错了什么的信息,甚至我对DICOM结构的拙劣理解,都将不胜感激


PS:我在C++中工作,但我很确定Python

< P>中的用法类似。不幸的是DICOM非常复杂,并且根据数据来自哪个公司的扫描仪和系统的历史,稍微有些不同。在第一个示例中,听起来您有一个简单格式化的目录,其中包含单个切片文件,并且没有额外的scout图像,因此VTK能够读入并渲染切片,看起来很好

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

VTK是一个图像处理/显示库,而不是Dicom系统。我不确定他们是否能很好地支持复杂的目录结构。您可以尝试reader->SetFileName'dicomdir';看看他们是否有逻辑来自动处理这个问题,但如果这样做有效的话,我会有点惊讶


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

< P>不幸的是DICOM是极其复杂的,并且根据数据来自于哪个公司的扫描仪和系统的历史,事情的实现略有不同。在第一个示例中,听起来您有一个简单格式化的目录,其中包含单个切片文件,并且没有额外的scout图像,因此VTK能够读入并渲染切片,看起来很好

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

VTK是一个图像处理/显示库,而不是Dicom系统。我不确定他们是否能很好地支持复杂的目录结构。您可以尝试reader->SetFileName'dicomdir';看看他们是否有逻辑来自动处理这个问题,但如果这样做有效的话,我会有点惊讶


如果要处理这样复杂的多系列数据,可能需要使用另一个库来提取所需的信息。我强烈推荐DCMTK。这是一个伟大的开源C++库,用于DICOM,只是不要期望它是超级简单的。< /P> < P>我已经在评论中发表了,在这种情况下,VTK DICOM更适合您的需要。以下是一些有用的链接:

有关如何使用vtk dicom API扫描目录、根据系列和研究整理数据的教程: vtk dicom文档以及附录中的安装说明 x:
正如我在评论中所发布的,在这种情况下,vtk dicom更适合您的需要。以下是一些有用的链接:

有关如何使用vtk dicom API扫描目录、根据系列和研究整理数据的教程: vtk dicom文档以及附录中的安装说明:
您不应根据DICOM文件在目录结构中的名称或位置来假定DICOM文件的内容

相反,DICOM文件夹的根目录应包含DICOMDIR文件,其中包含文件列表及其关系,例如,患者对象包含包含序列的研究对象,然后是图像

我不知道VTK是否提供了一种读取和解释DICOMDIR文件的方法;如果没有,那么你可以试着用或来解释它们


披露:我是Imebra的作者

您不应该根据DICOM文件的名称或在目录结构中的位置来假定其内容

相反,DICOM文件夹的根目录应包含DICOMDIR文件,其中包含文件列表及其关系,例如,患者对象包含包含序列的研究对象,然后是图像

我不知道VTK是否提供了一种读取和解释DICOMDIR文件的方法;如果没有,那么你可以试着用或来解释它们



披露:我是Imebra的作者

是的,第二个确实有一个scout文件。对于dicomdir文件的提示,我找到了它,并将看看我能从中得到什么。tbh我不偏爱vtk,它只是我想要的,因为pcl使用它,我将得到DCMTK设置并试用,谢谢!尝试将文件名设置为DICOMDIR文件,但被拒绝。现在我将开始设置DCMTK我应该指出,有一个命令行实用程序dcmdump,它是DCMTK的一部分,它将打印dicomdir或单个dicom文件的内容。这将比直接使用C++代码要简单得多,如果你只是想找出要加载的文件…IDK,问题是我需要加载几百个文件。也可以实现一个更好的导入数据的工具。是的,第二个确实有一个scout文件。对于dicomdir文件的提示,我找到了它,并将看看我能从中得到什么。tbh我不偏爱vtk,它只是我想要的,因为pcl使用它,我将得到DCMTK设置并试用,谢谢!尝试将文件名设置为DICOMDIR文件,但被拒绝。现在我将开始设置DCMTK我应该指出,有一个命令行实用程序dcmdump,它是DCMTK的一部分,它将打印dicomdir或单个dicom文件的内容。这将比直接使用C++代码要简单得多,如果你只是想找出要加载的文件…IDK,问题是我需要加载几百个文件。最好使用一个更好的工具来导入数据。你试过vtk dicom库吗?不是vtkDICOMImageReader,而是vtkDICOMReader。对于DICOM来说,它更有趣,请检查这里:哦,快照。。。不,我没有。现在来看抱歉,我刚刚开始使用开源代码。。。vtkDICOMReader是我需要带到vtk库中的其他代码吗?:/I我有vtk 8.0,但似乎无法加载到vtkDICOMReader中,我将进一步研究它。请查看此链接中的附录:您是否尝试过vtk dicom库?不是vtkDICOMImageReader,而是vtkDICOMReader。对于DICOM来说,它更有趣,请检查这里:哦,快照。。。不,我没有。现在来看抱歉,我刚刚开始使用开源代码。。。vtkDICOMReader是我需要带到vtk库中的其他代码吗?:/我有vtk 8.0,但似乎无法加载到vtkDICOMReader中,我将进一步研究它。请查看此链接中的附录:你说得很对,谢谢。正如你们所有人所说,DICOMDIR文件是我所缺少的。所有三个库vtkDICOM、dcmtk和Imebra都可以读取该文件并允许结构化访问。由于我已经在我的项目中的其他地方使用了vtk,因此添加vtkDICOM是最简单的方法,而不是引入另一个开源库……你说得很对,谢谢。正如你们所有人所说,DICOMDIR文件是我所缺少的。所有三个库vtkDICOM、dcmtk和Imebra都可以读取该文件并允许结构化访问。由于我已经在我的项目的其他地方使用了vtk,因此添加vtkDICOM比引入另一个开源库更简单。。。
reader->SetFileName(tempFile.c_str());