VTK - 如何从NIFTI图像中读取每个单元的张量/矩阵?

时间:2015-08-21 10:08:08

标签: matrix cell vtk nifti

我正在尝试实施基于 VTK 的MRT-DTI实时光纤跟踪可视化工具。 因此,我们需要读取在NIFTI图像(.nii)中存储的DTI 张量 /矩阵每个单元格我真的无法弄清楚如何做到这一点。

从NIFTI文件中检索单个标量值不是问题,但我不知道如何获得张量(3x3 / 4x4矩阵)。 我们非常感谢任何帮助!

由于NIFTIImageReader应该将张量NIFTI图像作为多组件vtkImage读取,我们尝试了这个:

  vtkSmartPointer<vtkImageExtractComponents> extractTupel1 = vtkSmartPointer<vtkImageExtractComponents>::New();
  extractTupel1->SetInputConnection(reader->GetOutputPort());
  extractTupel1->SetComponents(0,1,2);
  extractTupel1->Update();

  vtkSmartPointer<vtkImageExtractComponents> extractTupel2 = vtkSmartPointer<vtkImageExtractComponents>::New();
  extractTupel2->SetInputConnection(reader->GetOutputPort());
  extractTupel2->SetComponents(3, 4, 5);
  extractTupel2->Update();

  vtkSmartPointer<vtkImageExtractComponents> extractTupel3 = vtkSmartPointer<vtkImageExtractComponents>::New();
  extractTupel3->SetInputConnection(reader->GetOutputPort());
  extractTupel3->SetComponents(6, 7, 8);
  extractTupel3->Update();


  extractTupel1->GetOutput()->GetPoint(pointId, tupel1);
  extractTupel2->GetOutput()->GetPoint(pointId, tupel2);
  extractTupel3->GetOutput()->GetPoint(pointId, tupel3);

但它不起作用。也许GetPoint-Method是错误的选择? 请帮助:)

1 个答案:

答案 0 :(得分:0)

David Gobbi回答,非常感谢他!:

不,GetPoint()方法不会返回张量值。它将返回体素的坐标。所以这里也没有必要使用vtkImageExtractComponents。

vtkImageData始终将体素值存储为“Scalars”数组,即使体素值不是标量数量。

获取标量值的一种简单(但效率低下的方法)是这种方法:

GetScalarComponentAsDouble (int x, int y, int z, int component)

对于每个体素,您可以使用component = [0..8]调用此方法9次。

获得张量的一种更有效的方法是从数据中获取标量数组,然后通过pointId查找张量:

reader->Update(); vtkDataArray *tensors = reader->GetOutput()->GetPointData()->GetScalars(); double tensor[9]; tensors->GetTuple(pointId, tensor);

这比GetScalarComponentAsDouble()更有效。