[Insight-users] PadImageFilter Problem
Angela Lee
angela.lee at auckland.ac.nz
Wed Jul 23 22:58:46 EDT 2008
Hi All,
I would like to pad an image before putting it through a fast fourier
transform filter.
I have used the itk::ConstantPadImageFilter to pad my image with zeros.
I want to multiply this image with another, but I get an error message.
I think that it is because the ConstantPadImageFilter outputs a image
that has negative indices. Is there anyway to change the indices back to
[0,0]?
std::cout << " fixed Pad region = " <<
fixedPadFilter->GetOutput()->GetLargestPossibleRegion() << std::endl;
fixed Pad region = ImageRegion (0x84cf7c8)
Dimension: 2
Index: [-256, -256]
Size: [1024, 1024]
I tried to use the ChangeInformationImageFilter and created a reference
image to try to use that to set the index to [0, 0] but I get a error
message in my terminal.
terminate called after throwing an instance of
'itk::InvalidRequestedRegionError'
what():
/people/alee071/Desktop/PHD/itk/InsightToolkit-3.2.0/Code/Common/itkDataObject.cxx:397:
Requested region is (at least partially) outside the largest possible
region.
Abort (core dumped)
My code is as follows:
/*=========================================================================
Program: Insight Segmentation & Registration Toolkit
Module: FourierTransformOfImages.cxx
Language: C++
Date: 23/06/08
=========================================================================*/
#if defined(_MSC_VER)
#pragma warning ( disable : 4786 )
#endif
#ifdef __BORLANDC__
#define ITK_LEAN_AND_MEAN
#endif
#if !defined(USE_FFTWF)
//#error "This example only works when single precision FFTW is used
//Changing WorkPixeltype to double and changing this conditional to
USE_FFTWD
//will also work.
#endif
#include "itkImage.h"
#include "itkImageFileReader.h"
#include "itkImageFileWriter.h"
#include "itkRescaleIntensityImageFilter.h"
//Include to pad the images
#include "itkConstantPadImageFilter.h"
#include "itkChangeInformationImageFilter.h"
/****************************************************************************
* INPUTS: Read in image and set output filename
****************************************************************************/
int main( int argc, char * argv [] )
{
if( argc < 2 )
{
std::cerr << "Usage: " << argv[0] << " fixedImage " << std::endl;
return 1;
}
typedef float InputPixelType;
typedef unsigned char WritePixelType;
const unsigned int Dimension = 2;
typedef itk::Image< InputPixelType, Dimension > ImageType;
typedef itk::Image< WritePixelType, Dimension > WriteImageType;
typedef itk::ImageFileReader< ImageType > fixedReaderType;
typedef itk::ImageFileWriter< WriteImageType > WriterType;
typedef itk::RescaleIntensityImageFilter< ImageType,
WriteImageType > RescaleFilterType;
fixedReaderType::Pointer fixedReader = fixedReaderType::New();
fixedReader->SetFileName( argv[1] );
fixedReader->Update();
/****************************************************************************
* Set up the regions we want to look at
****************************************************************************/
ImageType::IndexType inputStart;
ImageType::IndexType regionIndex;
ImageType::SizeType size;
ImageType::SizeType regionSize;
ImageType::SizeType padRegionSize;
ImageType::RegionType inputRegion;
ImageType::RegionType outputRegion;
ImageType::RegionType padOutputRegion;
inputRegion = fixedReader->GetOutput()->GetLargestPossibleRegion();
inputStart[0]=0;
inputStart[1]=0;
size=inputRegion.GetSize();
regionSize[0]=size[0];
regionSize[1]=size[1];
padRegionSize[0]=2*size[0];
padRegionSize[1]=2*size[1];
inputRegion.SetSize( regionSize );
inputRegion.SetIndex( inputStart );
padOutputRegion.SetSize( padRegionSize );
padOutputRegion.SetIndex( inputStart );
const ImageType::SpacingType& spacing =
fixedReader->GetOutput()->GetSpacing();
const ImageType::PointType& inputOrigin =
fixedReader->GetOutput()->GetOrigin();
/****************************************************************************
* Pad the images
****************************************************************************/
typedef itk::ConstantPadImageFilter< ImageType, ImageType >
ConstantPadImageFilterType;
ConstantPadImageFilterType::Pointer fixedPadFilter =
ConstantPadImageFilterType::New();
fixedPadFilter->SetConstant(0);
fixedPadFilter->SetInput( fixedReader->GetOutput() );
const unsigned long Padding[Dimension] = { 256, 256 };
fixedPadFilter->SetPadLowerBound ( Padding );
fixedPadFilter->SetPadUpperBound ( Padding );
fixedPadFilter->Update();
std::cout << " fixed Pad region = " <<
fixedPadFilter->GetOutput()->GetLargestPossibleRegion() << std::endl;
////////////////////////////////////////////////////////////////////////////////
typedef itk::ChangeInformationImageFilter<ImageType> ChangeInfoFilterType;
ChangeInfoFilterType::Pointer fixedChangeInfoFilter =
ChangeInfoFilterType::New();
fixedChangeInfoFilter->SetInput( fixedPadFilter->GetOutput() );
fixedChangeInfoFilter->ChangeRegionOn();
ImageType::Pointer ReferenceImage = ImageType::New();
ReferenceImage->SetRegions( padOutputRegion );
ReferenceImage->SetSpacing( spacing );
ReferenceImage->SetOrigin( inputOrigin );
ReferenceImage->Allocate();
std::cout << " reference region = " <<
ReferenceImage->GetLargestPossibleRegion() << std::endl;
fixedChangeInfoFilter->SetReferenceImage( ReferenceImage );
fixedChangeInfoFilter->Update();
std::cout << " ChangeInfo region = " <<
fixedChangeInfoFilter->GetOutput()->GetLargestPossibleRegion() << std::endl;
return 0;
}
Thank you in advance,
Angela
More information about the Insight-users
mailing list