[ITK-users] [ITK] 4D Image to Matrix inside mask

Timothee Evain tevain at telecom-paristech.fr
Mon May 9 05:47:35 EDT 2016


Hello Javier,

About the question on pixel type, both are possible, it just depends on how you see it. But since it is for a temporal evolution of MRI image I would choose a 4D image. A 3D vector image is used to represent thing like displacement field or gradient of 3D images.

One way to do it is to iterate over your mask image and get the value where the spatial coordinates match your perfusion image:

itk::ImageRegionConstIteratorWithIndex<itk::Image<ValueType,3>> MyIterator(MaskImage,MaskImage->GetLargestPossibleRegion());
MyIterator.GoToBegin();

std::vector<std::vector<ValueType>> MyMatrix(N);//N number of ON pixels of the mask

for(int NbPix=0;NbPix<MyMatrix.size();NbPix++)//Initialize the matrix
{
  std::vector<ValueType> tmp_vect(34);
  MyMatrix.pushback(tmp_vect);
}
int count=0;
while(!MyIterator.IsAtEnd())
{
  if (MyIterator.Get()==1)//Mask Pixel is ON
  {
    itk::Index<3> SpatialIndex=MyIterator.GetIndex();
    for (int i=0;i<34;i++)
    {
      itk::Index<4> FullIndex;
      FullIndex[0]=SpatialIndex[0];
      FullIndex[1]=SpatialIndex[1];
      FullIndex[2]=SpatialIndex[2];
      FullIndex[3]=i;
      MyMatrix[count][i]=PerfusionImage->GetPixel(FullIndex);
    }
    count++;
  }
  ++MyIterator;
}

I've taken std::vector to do the matrix here, but you could change for the eigen matrix pretty easily if I remember well.

HTH,

Tim

----- Mail original -----
De: "Javier Juan Albarracín" <javij1 at gmail.com>
À: insight-users at itk.org
Envoyé: Jeudi 5 Mai 2016 11:48:24
Objet: [ITK] [ITK-users] 4D Image to Matrix inside mask

Hello, 

I have a 4D image, which is a DSC Perfusion weighted MRI. Supose the image has the dimenisions 270x270x171x34. I want to convert this image into a Matrix of size Nx34, where N are the number of voxels inside the intracraneal mask. The Matrix class comes from Eigen library. In a classic "for loop" scheme the code would be 

for (int x = 0; x < image.width(); x++) 
{ 
for (int y = 0; y < image.height(); y++) 
{ 
for (int z = 0; z < image.depth(); z++) 
{ 
if (!mask(x, y, z)) 
continue; 

for (int c = 0; c < image.spectrum(); c++) 
Matrix(i, c) = image(x, y, z, c); 
i++; 
} 
} 
} 


How can I do this in ITK?? I have read several ImageRegionIterator examples, but I do not find a clean and correct way to do what I want. 

Thank you very much. 
Regards. 

Javier. 

_____________________________________
Powered by www.kitware.com

Visit other Kitware open-source projects at
http://www.kitware.com/opensource/opensource.html

Kitware offers ITK Training Courses, for more information visit:
http://www.kitware.com/products/protraining.php

Please keep messages on-topic and check the ITK FAQ at:
http://www.itk.org/Wiki/ITK_FAQ

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/insight-users

_______________________________________________
Community mailing list
Community at itk.org
http://public.kitware.com/mailman/listinfo/community


More information about the Insight-users mailing list