//Scaling a 3D object #include #include "itkImage.h" #include "itkImageFileReader.h" #include "itkImageFileWriter.h" #include "itkRegionOfInterestImageFilter.h" #include "itkResampleImageFilter.h" #include "itkAffineTransform.h" #include "itkIdentityTransform.h" #include "itkNearestNeighborInterpolateImageFunction.h" #include "itkLinearInterpolateImageFunction.h" using namespace std; int main(void) { typedef unsigned char InputPixelType; typedef unsigned char OutputPixelType; const unsigned int Dimension = 3; typedef itk::Image< InputPixelType, Dimension > InputImageType; typedef itk::Image< OutputPixelType, Dimension > OutputImageType; typedef itk::ImageFileReader< InputImageType > ReaderType; typedef itk::ImageFileWriter< OutputImageType > WriterType; typedef itk::NearestNeighborInterpolateImageFunction< InputImageType, double > InterpolatorType; typedef itk::AffineTransform< double, Dimension > TransformType; // typedef itk::IdentityTransform< double, Dimension > TransformType; typedef itk::ResampleImageFilter FilterTypeResample; ReaderType::Pointer reader = ReaderType::New(); WriterType::Pointer writer = WriterType::New(); InterpolatorType::Pointer interpolator = InterpolatorType::New(); TransformType::Pointer transform = TransformType::New(); FilterTypeResample::Pointer filterResample = FilterTypeResample::New(); // working //reader->SetFileName("C:/Images/brainweb165a10f17.mha"); //writer->SetFileName("C:/Images/AffineTransform_brainweb165a10f17.hdr"); //not working reader->SetFileName("C:/Images/ConfiConnect_brainweb165a10f17_whiteMatter.mha"); writer->SetFileName("C:/Images/AffineTransform_ConfiConnect_brainweb165a10f17_whiteMatter.hdr"); reader->Update(); InputImageType::RegionType region = reader->GetOutput()->GetLargestPossibleRegion(); InputImageType::SizeType size = region.GetSize(); InputImageType::IndexType start = region.GetIndex(); //----- set the spacing of the filter double spacing[ Dimension ]; const InputImageType::SpacingType& sp = reader->GetOutput()->GetSpacing(); //spacing[0] = sp[0]; // pixel spacing in millimeters along X //spacing[1] = sp[1]; // pixel spacing in millimeters along Y //spacing[2] = sp[2]; // pixel spacing in millimeters along Y spacing[0] = 2.82; // pixel spacing in millimeters along X spacing[1] = 3.39; // pixel spacing in millimeters along Y spacing[2] = 2.81; // pixel spacing in millimeters along Y filterResample->SetOutputSpacing( spacing ); cout << "Spacing = "; cout << sp[0] << ", " << sp[1] << ", " << sp[2] << std::endl; //----- set the origin of the filter double origin[ Dimension ]; const InputImageType::PointType& orgn = reader->GetOutput()->GetOrigin(); // instead of filter origin[0] = orgn[0]; // X space coordinate of origin origin[1] = orgn[1]; // Y space coordinate of origin origin[2] = orgn[2]; // Y space coordinate of origin filterResample->SetOutputOrigin( origin ); cout << "Origin = "; cout << orgn[0] << ", " << orgn[1] << ", " << orgn[2] << std::endl; //----- set the size of the filter InputImageType::SizeType size2, imageSize =reader->GetOutput()->GetLargestPossibleRegion().GetSize(); //size2[0] =imageSize[0]; // number of pixels along X //size2[1] =imageSize[1]; // number of pixels along Y //size2[2] =imageSize[2]; // number of pixels along Y size2[0] =64; // number of pixels along X size2[1] =64; // number of pixels along Y size2[2] =64; // number of pixels along Y filterResample->SetSize( size2 ); cout << "ImageSize= "; cout << imageSize[0] << ", " << imageSize[1] << ", " << imageSize[2]<< std::endl; // Image Scaling TransformType::OutputVectorType scale; scale[0] = 1; // X translation in millimeters scale[1] = 1; // Y translation in millimeters scale[2] = 1; // Y translation in millimeters //transform->Scale( scale ); transform->SetIdentity(); //filterResample->SetDefaultPixelValue( 100 ); filterResample->SetOutputStartIndex( start ); filterResample->SetTransform( transform ); filterResample->SetInterpolator( interpolator ); filterResample->SetInput( reader->GetOutput() ); writer->SetInput( filterResample->GetOutput() ); writer->Update(); transform->Print( std::cout ); cout << "Code end !" << std::endl; cin.get(); return EXIT_SUCCESS; }