[vtkusers] [vtkUsers] Mapping the real x, y, z points to the volume indices i, j, k using vtkImageData

bcombes benoit.combes at inria.fr
Fri Jan 20 04:57:02 EST 2017


Hi vtkUsers,

I have a hard time with ComputeStructuredCoordinates.

* Goal:
  I have a vtk file and a nii file. I want to recover some scalar values 
from the volume to assign it to the surface scalar. So, essentially, I 
want to find the mapping from the real x,y,z points to the volume 
indices i,j,k.


* Observations:
1) When displaying the surface and the volume in the real frame they fit 
perferctly, so data looks not to be the problem.
2) When making the (x,y,z)_Real to (i,j,k)_Volume correspondances using  
ComputeStructuredCoordinates or FindPoint, I do not have the expected 
results.
In particular, the coordinates given by ComputeStructuredCoordinates 
indicates that the points are outside the volume or have wrong scalar 
values. In other words, it does not seem to do the job I expect.

* Code:

```

// img is a vtkSmartPointer<vtkImageData> loaded from 
vtkSmartPointer<vtkNIFTIImageReader>
// surf is a vtkSmartPointer<vtkPolyData> loaded from 
vtkSmartPointer<vtkPolyDataReader>

for(int i=0;i<surf->GetNumberOfPoints();++i)
{
     std::cout<<i<<","<<std::flush;
     double *v=surf->GetPoint(i);

     int ijk[] = { -1,-1,-1};
     double *foopcoords;
     int isOk=img->ComputeStructuredCoordinates(v,ijk,foopcoords) ;

      if(isOk && (ijk[0]>0 && ijk[1]>0 && ijk[2]>0))
         {float v=img->GetScalarComponentAsFloat(ijk[0],ijk[1],ijk[2],0);
          scal->InsertValue(i,v);
         }
     else
         {scal->InsertValue(i,-1);}
}
```

I also try to use FindPoint instead:
```
   int id = img->FindPoint(v);
   if(id>-1)
       {
scal->InsertValue(i,img->GetPointData()->GetScalars()->GetTuple(id)[0]);
     }
       else
       {scal->InsertValue(i,-1);}

```
  but have the same issue.

* Question

I don't understand how to fix this. Am I wrongly understand the purpose 
of ComputeStructuredCoordinates ? Are there any voxels to real frames 
that are not accounted for when using this function (or extra used ones) ?



More information about the vtkusers mailing list