[Insight-users] apply a transform to 3D image problem with image spacing

a.bongers at mediri.com a.bongers at mediri.com
Fri Nov 28 11:00:09 EST 2008


Hi,

I'm having a problem with registration and transformation of an image with different spacings.
What I would like to do is the following:

Using the affine itk registration I have registered a 3D moving image with spacing (4,4,4) to a fixed image with spacing (1,1,4) and have saved the transformation to a file. This works well so far. The registerd images seem to fit well.

In later stage I would like to apply the saved transform to the moving image but KEEPING THE SPACING OF THE MOVING IMAGE. (In effect I would like to apply a transform determined previously to another image, i.e. e.g. a mask image which I cannot register directly because it is lacking sufficient structures)
-->
So I simply tried to use the resample image filter but with the spacing from the moving image (4,4,4).
When I do this, the resulting image after the application of the transform does not fit the fixed image but seems to be shifted by some amount.

Since I do not really know how this comes about I hope anybody can help me... 
Does the Transform depend on image spacing somehow ??? Am I thinking wrongly ??? Is this a bug ??? How can I achieve a transform of the image without being dependent on the fixed image ?


To illustrate what I am doing : Here is the code of the resampling function I wrote.
The Problem is highlited in the source comments:


my func is templated over the image type and trafo type and takes the trafo I previously read in from the itk transform file saved in the registration stage.


template <class ImageType, class TrafoType>
//typename ImageType::Pointer ResampleImage(typename ImageType::Pointer sourceImage, typename TrafoType::Pointer transform)
typename ImageType::Pointer ResampleImage(typename ImageType::Pointer sourceImage, typename ImageType::Pointer targetImage, 
										  typename TrafoType::Pointer transform)
{

	typedef itk::LinearInterpolateImageFunction<ImageType,double>  InterpolatorType;
	InterpolatorType::Pointer interp = InterpolatorType::New();
	interp->SetInputImage(sourceImage);	

	typedef itk::ResampleImageFilter<ImageType,ImageType> ResampleImageFilter;
	ResampleImageFilter::Pointer resample = ResampleImageFilter::New();
	resample->SetInput(sourceImage);

	resample->SetTransform(transform);
	resample->SetInterpolator(interp);
	
	ImageType::IndexType index = {{0,0,0}};
	resample->SetOutputStartIndex(index);
	
	// here I get a problem when I try to use the source images spacing 
	// if I use the target's (i.e. fixed) image spacing everything works fine: 
	ImageType::SizeType size = targetImage->GetLargestPossibleRegion().GetSize();
	resample->SetSize(size);
	resample->SetOutputSpacing(targetImage->GetSpacing());
	cout << targetImage->GetSpacing() << "spacing from target image !!!!!!!!!!!!!";
	// this works ok


	// but if I use the source's (moving) image spacing it does not work --> the resuling transforemd image is then shifted
		//ImageType::SizeType size = sourceImage->GetLargestPossibleRegion().GetSize();
		//resample->SetSize(size);
		//resample->SetOutputSpacing(sourceImage->GetSpacing());
		//cout << sourceImage->GetSpacing() << "spacing from source image !!!!!!!!!!!!!";
	// this works ok

	resample->SetOutputOrigin(sourceImage->GetOrigin());
	
	resample->Update();
	ImageType::Pointer outImage = resample->GetOutput();
	outImage->SetDirection(sourceImage->GetDirection());

	return outImage;

}




THAKS A LOT!

Andre


More information about the Insight-users mailing list