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

时间:2018-01-18 19:39:37

标签: 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解释目录。这里陈述:根据DICOM数据,有一些关于what VTK is capable of managing(详细描述,警告)的细节。 (我不确定我目前的数据是否违反此规范)

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

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

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

A:检测我所在的切片系列(系列标签)

,也不

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

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

任何关于我在代码方面做错了什么的信息,甚至我对DICOM结构的不了解都会非常感激!

ps:我在c ++工作,但相当确定Python的用法类似

3 个答案:

答案 0 :(得分:3)

不幸的是,Dicom非常复杂,根据公司扫描数据的来源和系统的年龄,实施情况略有不同。在你的第一个例子中,听起来你有一个带有单独切片文件的简单格式化目录,没有额外的侦察图像,因此VTK能够读入并渲染切片,看起来很好。

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

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

如果你打算使用这样复杂的多系列数据,你可能需要使用另一个库来提取你想要的信息。我强烈推荐DCMTK。它是一个很棒的开源C ++库,可以与Dicom合作,但不要期望它非常简单。

答案 1 :(得分:1)

您不应该通过目录结构中的名称或位置来假设DICOM文件的内容。

相反,DICOM文件夹的根目录应包含DICOMDIR文件,该文件包含文件列表及其关系(例如,患者对象包含包含系列和图像的研究对象)。

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

披露:我是Imebra的作者

答案 2 :(得分:0)

正如我在评论中所说,在这种情况下,vtk-dicom更适合您的需求。以下是一些有用的链接: