VTK - Как читать Тензор / Матрицу на ячейку из NIFTI Image?

Я пытаюсь реализовать в реальном времени инструмент визуализации волоконно-оптического отслеживания MRT-DTI на базе VTK. Поэтому нам нужно читать тензоры/ матрицы DTI на ячейку, хранящиеся в изображении NIFTI (.nii), и я действительно не могу понять, как это сделать.

Не проблема получить одно скалярное значение из файла 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- неправильный выбор? Пожалуйста помоги:)

1 ответ

Ответ Дэвида Гобби, действительно большое ему спасибо!

Нет, метод GetPoint() не будет возвращать значение тензора. Он вернет координаты вокселя. Так что vtkImageExtractComponents здесь тоже не нужен.

VtkImageData всегда сохраняет значения вокселей в виде массива "Скаляры", даже если значения вокселей не являются скалярными величинами.

Простой (но неэффективный способ) получить скалярные значения - это метод:

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

Для каждого вокселя этот метод вызывается 9 раз с компонентом = [0..8].

Гораздо более эффективный способ получения тензоров - получить скалярный массив из данных, а затем найти тензоры с помощью pointId:

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

Это на несколько порядков эффективнее, чем GetScalarComponentAsDouble().

Другие вопросы по тегам