0

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 は間違った選択でしょうか? 助けてください :)

4

1 に答える 1

0

David Gobbi による回答、本当にありがとう!:

いいえ、GetPoint() メソッドはテンソル値を返しません。ボクセルの座標を返します。したがって、ここでも vtkImageExtractComponents は必要ありません。

vtkImageData は、ボクセル値がスカラー量でなくても、常にボクセル値を「スカラー」配列として保存します。

スカラー値を取得する簡単な (しかし非効率的な) 方法は、次の方法です。

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

ボクセルごとに、コンポーネント = [0..8] でこのメソッドを 9 回呼び出します。

テンソルを取得するより効率的な方法は、データからスカラー配列を取得し、pointId を介してテンソルを検索することです。

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

これは、GetScalarComponentAsDouble() よりも桁違いに効率的です。

于 2015-08-23T12:51:15.700 に答える