Как преобразовать координаты DICOM в мировые координаты VTK - PullRequest
2 голосов
/ 26 апреля 2019

Я новичок в программировании на vtk, и у меня возникли некоторые проблемы. У меня есть изображения DICOM и координаты для каждого из изображений.Я хочу преобразовать эти координаты в координаты VTK.

Например;

Это в координатах DICOM.(0020,0032) Положение изображения (пациент):

-236.894000 \ -203.378900 \ -1219.400000

(0020,0037) Ориентация изображения (пациент): 1,000000 \ 0,000000 \ 0,000000 \ 0,000000 \1,000000 \ 0,000000 (0028,0030)

(0028,0030) Интервал между пикселями: 0,468749 \ 0,468756

(0020,1041) Расположение среза: 228,20

MyВопрос в следующем:

Есть ли способ включить любой из этих тегов и преобразовать значения (0020,0032) в мировую координату VTK, чтобы я мог установить преобразованное значение в vtkImageActor's SetPosition () или SetDisplayExtent () функция.

Возможно ли это?

Что я пробовал

void vtkInteractorObserver::ComputeDisplayToWorld(vtkRenderer *ren,
                                                  double x,
                                                  double y,
                                                  double z,
                                                  double worldPt[4])
{
  ren->SetDisplayPoint(x, y, z);//I gave the Image position patient values as x,y and z
  ren->DisplayToWorld();
  ren->GetWorldPoint(worldPt);
  if (worldPt[3])
  {
    worldPt[0] /= worldPt[3];
    worldPt[1] /= worldPt[3];
    worldPt[2] /= worldPt[3];
    worldPt[3] = 1.0;
  }
}


//----------------------------------------------------------------------------
// Description:
// Transform from world to display coordinates.
// displayPt has to be allocated as 3 vector
void vtkInteractorObserver::ComputeWorldToDisplay(vtkRenderer *ren,
                                                  double x,
                                                  double y,
                                                  double z,
                                                  double displayPt[3])
{
  ren->SetWorldPoint(x, y, z, 1.0);
  ren->WorldToDisplay();
  ren->GetDisplayPoint(displayPt);
}

РЕДАКТИРОВАТЬ

Если для этого есть какие-либо математические вычисления, это также более чем достаточно для меня. Я также сослался на эти две ссылки: https://www.slicer.org/wiki/Coordinate_systems и
http://vtk.1045678.n5.nabble.com/Correct-coordinate-transformations-for-DICOM-data-set-td5728309.html но я не получил ясного понимания.

...