[Insight-users] Re: Writing 3D image from text file?

Ekta Amar amar.3 at osu.edu
Sun Dec 31 14:30:51 EST 2006


Hello Luis,

I changed the format to .tiff which supports 3D images. Hence, I'm able to 
write 3D image but unfortunalty there is nothing in the image. Its just 
creating a blank image ..

I think I'm not able to provide correctly the input to Image writer. I'm 
able to read text file but not able provide that information to write on 
image. I went through chapter Image read and write but unable to find any 
solution to write it. I used "TransformPhysicalPointToIndex " to convert the 
points to pixel but still not able to write that point and create a 3D 
image.

Please let me know where I'm doing wrong.

Thanks,
Ekta

Following is my code,
#include "itkImage.h"
#include "itkPoint.h"

#include "itkImageFileWriter.h"

#include "itkPNGImageIO.h"

#include "itkPointSet.h"

int main(int argc, char * argv[])

{

const unsigned int Dimension = 3;

typedef itk::PointSet< float, Dimension > PointSetType;

PointSetType::Pointer ptPointSet = PointSetType::New ();

typedef PointSetType::PointType PointType;

typedef PointSetType::PointsContainer PointsContainer;

PointsContainer::Pointer ptPointContainer = PointsContainer::New();

PointType ptPoint;

argv[1] = "pointFile.txt";

std::ifstream pointFile;

pointFile.open( argv[1] );

if (pointFile.fail() )

{

std::cerr << "Error opening points file : " << std::endl;

std::cerr << argv[1] << std::endl;

return 2;

}

unsigned int pointId = 0;

pointFile >> ptPoint ;

while ( !pointFile.eof() )

{

ptPointContainer -> InsertElement ( pointId, ptPoint );

pointFile >> ptPoint;

pointId++;

}

ptPointSet -> SetPoints ( ptPointContainer );

std:: cout << "Number of points =" << ptPointSet -> GetNumberOfPoints() << 
std::endl;

// To write image

typedef itk::Image< unsigned short, 3 > ImageType;

ImageType::Pointer image = ImageType::New();

ImageType::IndexType start;

ImageType::SizeType size;

size[0] = 111; // size along X

size[1] = 112; // size along Y

size[2] = 10.63; // size along Z

start[0] = 0; // first index on X

start[1] = 0; // first index on Y

start[2] = 0; // first index on Z

ImageType::RegionType region;

region.SetSize( size );

region.SetIndex( start );


image->SetRegions( region );

image->Allocate();

image->FillBuffer( 0 );


ImageType::SpacingType spacing;

spacing[0]= 8.0;

spacing[1]= 8.0;

spacing[2]= 8.0;

image ->SetSpacing( spacing );

const ImageType::SpacingType& sp = image ->GetSpacing();

std::cout <<" Spacing = ";

std::cout <<sp[0] <<" , "<< sp[1] <<" , "<< sp[2] << std::endl;

ImageType::PointType origin;


origin[0] = 494553;

origin[1] = 4249578;

origin[2] = -38.676;

image -> SetOrigin (origin);

const ImageType::PointType& orgn = image-> GetOrigin();

std::cout<<" Origin = ";

std::cout<< orgn[0] << ", "<< orgn[1] <<" , " <<orgn[2] << std::endl;

typedef itk::Point< float, ImageType::ImageDimension > PointType;

ImageType::IndexType pixelIndex;

//Tried to read the points sequentially

typedef PointSetType::PointDataContainer PointDataContainer;

PointsContainer::Pointer point2 = ptPointSet ->GetPoints();

typedef PointsContainer::Iterator PointsIterator;

PointsIterator pointIterator = point2 ->Begin();

PointsIterator end = point2 -> End();

PointType pointValue;

while (pointIterator != end)

{

bool isInside = image -> TransformPhysicalPointToIndex ( ptPoint, 
pixelIndex );


if (isInside)

{

pointValue = pointIterator.Value();

std::cout<<pointValue<<std::endl;

++pointIterator;


}

}

typedef itk::ImageFileWriter< ImageType > WriterType;

WriterType::Pointer writer = WriterType::New();

char pic[200] = "try.tiff";

const char * outputFilename = pic;

writer->SetFileName( outputFilename );

writer ->SetInput(image );

try

{

writer->Update();

std::cerr << "Success" << std::endl;

}

catch( itk::ExceptionObject & err )

{

std::cerr << "ExceptionObject caught !" << std::endl;

std::cerr << err << std::endl;

return EXIT_FAILURE;

}


return 0;

}

----- Original Message ----- 
From: "Luis Ibanez" <luis.ibanez at kitware.com>
To: "ekta amar" <ektaamar at gmail.com>
Cc: <amar.3 at osu.edu>; "Insight Users" <insight-users at itk.org>
Sent: Friday, December 29, 2006 5:40 PM
Subject: Re: Writing 3D image from text file?


>
> Hi Ekta,
>
> What is the message that the exception give you ?
>
>
> You are probably having trouble because you are using a
> PNG fileformat in order to save a 3D image.
>
>
>          PNG only supports 2D images.
>
>
> You may want to use a different file format, such as
> VTK, MetaImage or Analyze, for saving your image.
>
> You will find a list of the file format supported
> in the ITK Software Guide:
>
>
>    http://www.itk.org/ItkSoftwareGuide.pdf
>
> in the Chapter "Reading and Writing Images"
>
>
>
>    Regards,
>
>
>
>       Luis
>
>
>
> ------------------
> ekta amar wrote:
>> Dear Luis,
>>
>> The answers to all of your questions is Yes..I want to see points (text 
>> file) which are in space as pixels in 3D image.
>>
>> As per told by you I tried to write an image (/just one single point for 
>> try/) but unable to write it...
>> I used the command *writer -> SetInput(image)* where /*image*/ is 
>> variable where my pixel index and pixel value is stored.
>>
>> I'm not able to write the image. Everytime I'm getting error Exception 
>> object caught.
>>
>> Following is my code I used to write.
>>
>> Please go through it and let me know where I'm doing wrong.
>>
>> In case I've to read points from file then I've to modify the pixelIndex? 
>> Is it right?  #include "itkImage.h"
>>
>> #include "itkPoint.h"
>>
>> #include " itkImageFileWriter.h"
>>
>>  int main()
>>
>> {
>>
>> typedef itk::Image< unsigned short, 3 > ImageType;
>>
>> ImageType::Pointer image = ImageType::New();
>>
>> ImageType::IndexType start;
>>
>> ImageType::SizeType size;
>>
>> size[0] = 200; // size along X
>>
>> size[1] = 200; // size along Y
>>
>> size[2] = 200; // size along Z
>>
>> start[0] = 0; // first index on X
>>
>> start[1] = 0; // first index on Y
>>
>> start[2] = 0; // first index on Z
>>
>> ImageType::RegionType region;
>>
>> region.SetSize( size );
>>
>> region.SetIndex( start );
>>
>>
>>
>> image->SetRegions( region );
>>
>> image->Allocate();
>>
>> image->FillBuffer( 0 );
>>
>>
>>
>> ImageType::SpacingType spacing;
>>
>> spacing[0]= 0.33;
>>
>> spacing[1]= 0.33;
>>
>> spacing[2]= 1.20;
>>
>> image ->SetSpacing( spacing );
>>
>> ImageType::PointType origin;
>>
>> origin[0] = 0;
>>
>> origin[1] = 0;
>>
>> origin[2] = 0;
>>
>> image -> SetOrigin (origin);
>>
>> typedef itk::Point< float, ImageType::ImageDimension > PointType;
>>
>> PointType point;
>>
>> point[0] = 1.45;
>>
>> point[1] = 7.21;
>>
>> point[2] = 9.28;
>>
>> ImageType::IndexType pixelIndex;
>>
>> bool isInside = image -> TransformPhysicalPointToIndex ( point, 
>> pixelIndex );
>>
>> if (isInside)
>>
>> {
>>
>> ImageType::PixelType pixelValue = image ->GetPixel(pixelIndex);
>>
>> pixelValue += 5;
>>
>> image -> SetPixel( pixelIndex, pixelValue );
>>
>> }
>>
>> typedef itk::ImageFileWriter< ImageType > WriterType;
>>
>> WriterType::Pointer writer = WriterType::New();
>>
>> char pic[200] = " try12.png";
>>
>> const char * outputFilename = pic;
>>
>> writer->SetFileName( outputFilename );
>>
>> *writer ->SetInput(image ); //Not able to write image..
>> *
>> try
>>
>> {
>>
>> writer->Update();
>>
>> std::cerr << "Success" << std::endl;
>>
>> }
>>
>> catch( itk::ExceptionObject & err )
>>
>> {
>>
>> std::cerr << "ExceptionObject caught !" << std::endl;
>>
>> std::cerr << err << std::endl;
>>
>> return EXIT_FAILURE;
>>
>> }
>>
>>
>>
>> return 0;
>>
>> }
>>  Please tell how can I modify this writer command to write the image 
>> properly.
>>  Thanks,
>> Ekta
>>  ----- Original Message -----
>> From: "Luis Ibanez" <luis.ibanez at kitware.com 
>> <mailto:luis.ibanez at kitware.com>>
>> To: "Ekta Amar" <amar.3 at osu.edu <mailto:amar.3 at osu.edu>>
>> Cc: "ITK" <Insight-users at itk.org <mailto:Insight-users at itk.org>>
>> Sent: Friday, December 29, 2006 11:14 AM
>> Subject: Re: Writing 3D image from text file?
>>
>>  >
>>  > Hi Ekta,
>>  >
>>  > What are the x,y,z coordinates representing ?
>>  >
>>  > Points in space ?
>>  >
>>  > Would you like to see them as pixels turned on in a 3D image ?
>>  >
>>  > You could do
>>  >
>>  > 1) Create an image whose physical extent covers all the points.
>>  > 2) Initialize the image pixels to zero
>>  > 3) Do a for loop over all the points and invoke the image method
>>  >    PhysicalPointToIndex(), then take that index and invoke the
>>  >    image method SetPixe(index,value) in order to set the pixel to
>>  >    a high value.
>>  > 4) Write the image to a file using the ImageFileWriter
>>  >
>>  >
>>  >
>>  > Regards,
>>  >
>>  >
>>  >    Luis
>>  >
>>  >
>>  >
>>  > ---------------
>>  > Ekta Amar wrote:
>>  >> Hello Luis,
>>  >> >> Is there any way I can read a text file having x, y, and z 
>> co-ordinates
>>  >> and write it as a 3D image?
>>  >> >> I'm able to read a text file but I'm not getting how can I 
>> make/write  a
>>  >> 3D image from that text file.
>>  >> >> I tried using Image2.cxx example which explains reading from a 
>> file but
>>  >> when I'm using .txt file to read it is giving me error, which I can
>>  >> understand is not correct format.
>>  >> >> Is there a way I can read text file and create a 3D image from 
>> that.
>>  >> >> Please help me,
>>  >> >> Thanks,
>>  >> Ekta
>>  >>
>> 



More information about the Insight-users mailing list