<div dir="ltr"><div><div><div><div><div>Dear vtk users,<br><br></div>I need help with vtkImageReslice.<br></div>I'm performing image registration between US and MRI images (.nii) )with itk. The first step is to roughly align the two images in the same anatomical space in order to apply here the registration pipeline. In particular I've a .mat file which is supposed to transform US into MR space. <br><br></div></div>Here is my code <br><br>#include <vtkSmartPointer.h><br>#include <vtkImageReslice.h><br>#include <vtkMatrix4x4.h><br>#include <vtkTransform.h><br>#include <vtkNIFTIImageReader.h><br>#include <vtkNIFTIImageWriter.h><br>#include <stdio.h><br>#include <vtkImageData.h><br><br>using namespace std;<br><br>int main(int argc, char*argv[])<br>{<br>  //Check input<br>  if (argc<3)<br>  {<br>    std:cout<<"Usage:" << argv[0]<br>    <<" img.nii transform.mat [reference.nii] [output.nii] "<<std::endl;<br>    return EXIT_FAILURE;<br>  }<br><br>  std::string inputFilename = argv[1];<br>  std::string matrix=argv[2];<br><br>  static double mat[4][4];<br>  ifstream dataInput(matrix.c_str());<br>  int r=0;<br>  while(r<4)<br>  {<br>    dataInput >> mat[r][0] >> mat[r][1] >> mat[r][2] >> mat[r][3];<br>    r++;<br>  }<br>  dataInput.close();<br><br>  //Matrix transform<br>  static double t[16] = {<br>    mat[0][0],  mat[0][1],  mat[0][2], mat[0][3],<br>    mat[1][0],  mat[1][1],  mat[1][2], mat[1][3],<br>    mat[2][0],  mat[2][1],  mat[2][2], mat[2][3],<br>    mat[3][0],  mat[3][1],  mat[3][2], mat[3][3],};<br><br>    vtkSmartPointer<vtkMatrix4x4> m = vtkSmartPointer<vtkMatrix4x4>::New();<br>    m->DeepCopy(t);<br>  <br>    cout << endl << "Applied 4x4 matrix:" << endl;<br>    for (int i=0;i<4;i++){<br>      cout << m->GetElement(i,0) << ' ' << m->GetElement(i,1) << ' ' << m->GetElement(i,2) << ' ' << m->GetElement(i,3) << endl;<br>    }<br><br></div>    //Reader<br><div>    vtkSmartPointer<vtkNIFTIImageReader> reader=vtkSmartPointer<vtkNIFTIImageReader>::New();<br>    reader->SetFileName(inputFilename.c_str());<br>    reader->Update();<br><br>    //Reslicing<br>    vtkSmartPointer<vtkImageReslice> reslice = vtkSmartPointer<vtkImageReslice>::New();<br>    reslice->SetInputConnection(reader->GetOutputPort());<br><br>    if (argc > 3) {<br>      vtkSmartPointer<vtkNIFTIImageReader> reader1=vtkSmartPointer<vtkNIFTIImageReader>::New();<br><br>      cout << "Applied reference image information" << endl;<br><br>      reader1->SetFileName(argv[3]);<br>      reader1->Update();<br><br>      vtkSmartPointer<vtkImageData> imgReference = vtkSmartPointer<vtkImageData>::New();<br>      imgReference->ShallowCopy(reader1->GetOutput());<br><br>      reslice->SetInformationInput(imgReference);<br>    }<br><br>    vtkSmartPointer<vtkTransform> transform = vtkSmartPointer<vtkTransform>::New();<br>    transform->SetMatrix(m);<br>    transform->PreMultiply();<br><br>    reslice->SetResliceTransform(transform);<br>    reslice->AutoCropOutputOn();<br>    reslice->SetInterpolationModeToNearestNeighbor();<br>    reslice->Update();<br><br>    //Save<br>    vtkSmartPointer<vtkNIFTIImageWriter> out = vtkSmartPointer<vtkNIFTIImageWriter>::New();<br>    if (argc < 5) {<br>      out->SetFileName("Resliced.nii");<br>    }<br>    else{<br>      out->SetFileName(argv[4]);<br>    }<br>    out->SetInputConnection(reslice->GetOutputPort());<br>    out->Write();<br><br>    return EXIT_SUCCESS;<br><br>  }<br clear="all"><div><div><div><div><div><br></div><div>Here is the transformation matrix <br><br>-0.963857 -0.250682 0.090209 121.954769<br>-0.155085 0.803248 0.575101 47.195941<br>-0.216627 0.540326 -0.813093 102.646109<br>0 0 0 1<br><br></div><div>The results of the reslice step are not consistent: images don't look aligned using paraview.<br></div><div><br></div><div>If I've well understood the problem, since I have two images obtained from different devices, I need firstly to trasform each of them in the corresponding scanner space (which is in mm) and the to transform the US image, now rapresented in US scanner space, into the MRI scanner space.<br><br></div><div>My question is: can I apply directly this trasformation (with SetMatrix() method) or do I need to keep in consideration some other aspects (such as qform and sform)? And how to keep thme in consideration?<br><br></div><div><br><br>-- <br><div class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr">Francesco Ponzio</div></div>
</div></div></div></div></div></div></div>