[Insight-users] Attempt to rotate image resulting in black image.

Michael Jackson mike.jackson at bluequartz.net
Wed Jun 3 17:50:53 EDT 2009


I am trying to rotate an image about the "upper left" corner. I had to  
write my own ImageSource derived class to read the data from and HDF5  
file. I am pretty sure the "Hdf5 reader" works as I can create the  
ImageReader instance from it, read an image and write the image to  
disk as a tiff file.

   Where my code seems to be failing is in the application of an  
AffineTransformFilter. I am basically taking the code straight from  
one of the examples adapting it to use my ImageSource derived reader  
and running it. And I get the dreaded "black image". Here is the code  
and the output from the program. Oddly, if I switch the reader back to  
the usual ImageFileReader and read up a tiff image I get the correct  
result, so maybe my custom reader class is not quite correct?


#define USE_MXA_FILE 1
int main(int argc, char **argv) {
   int exampleAction =0;
   const     unsigned int   Dimension = 2;
   typedef   unsigned char  InputPixelType;
   typedef   unsigned char  OutputPixelType;

   typedef itk::Image< InputPixelType,  Dimension >   InputImageType;
   typedef itk::Image< OutputPixelType, Dimension >   OutputImageType;

#if USE_MXA_FILE
   typedef itkR3DImageIO  ReaderType;
#else
   typedef itk::ImageFileReader< InputImageType >  ReaderType;
#endif
   typedef itk::ImageFileWriter< OutputImageType >  WriterType;

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

   reader->SetFileName( argv[1] );
#if USE_MXA_FILE
   reader->SetDatasetPath(argv[2]);
#endif
   reader->Update();
   writer->SetFileName( argv[3]);
   typedef itk::ResampleImageFilter<InputImageType, OutputImageType >   
FilterType;
   FilterType::Pointer filter = FilterType::New();
   typedef itk::AffineTransform< double, Dimension >  TransformType;
   TransformType::Pointer transform = TransformType::New();

   typedef  
itk::NearestNeighborInterpolateImageFunction<InputImageType, double >   
InterpolatorType;
   InterpolatorType::Pointer interpolator = InterpolatorType::New();
   filter->SetInterpolator( interpolator );
   filter->SetDefaultPixelValue( 0 );
   const InputImageType::SpacingType& spacing = reader->GetOutput()- 
 >GetSpacing();
   const InputImageType::PointType& origin = reader->GetOutput()- 
 >GetOrigin();
   InputImageType::SizeType size = reader->GetOutput()- 
 >GetLargestPossibleRegion().GetSize();
   filter->SetOutputOrigin( origin );
   filter->SetOutputSpacing( spacing );
   filter->SetSize( size );

   filter->SetInput( reader->GetOutput() );
   writer->SetInput( filter->GetOutput() );

   std::cout << "Input Size: " << size[0] << "," << size[1] <<  
std::endl;
   std::cout << "Input Origin: " << origin[0] << "," << origin[1] <<  
std::endl;
   std::cout << "Input Spacing: " << spacing[0] << "," << spacing[1]  
<< std::endl;

   TransformType::OutputVectorType translation1;
   translation1[0] =   -origin[0];
   translation1[1] =   -origin[1];
   transform->Translate( translation1 );

   const double degreesToRadians = atan(1.0) / 45.0;
   transform->Rotate2D( -10.0 * degreesToRadians, false );

   TransformType::OutputVectorType translation2;
   translation2[0] =   origin[0];
   translation2[1] =   origin[1];
   transform->Translate( translation2, false );
   filter->SetTransform( transform );
   try
     {
     writer->Update();
     }
   catch( itk::ExceptionObject & excep )
     {
     std::cerr << "Exception caught !" << std::endl;
     std::cerr << excep << std::endl;
     }

   return EXIT_SUCCESS;
}


output:
  GenerateData()
GenerateData()
Input Size: 1292,968
Input Origin: 46978.9,48347.8
Input Spacing: 0.207987,0.207987
GenerateData()

Any help would be great.
_________________________________________________________
Mike Jackson                  mike.jackson at bluequartz.net
BlueQuartz Software                    www.bluequartz.net
Principal Software Engineer                  Dayton, Ohio





More information about the Insight-users mailing list