[Insight-users] confusion with specifying origin for 3D affine transformations - itkAffineTransform

rama rama at robots.ox.ac.uk
Tue Sep 20 08:33:16 EDT 2005


Hi,

I have a problem rotating a 3D image about ITS OWN center point around X 
axis (take that Z axis is pointing into the screen).

I have a 3D image with dimensions as 160 X 144 X 208 pixels in X, Z and 
Y axis respectively.

I want to rotate this image around X axis about its own center point, 
that is, around the middle point of the image - (80, 72, 104).  That is, 
the image should rotate around itself about X-Axis.
But I am not getting that effect. The image is always rotating around 
the point (0, 0, 0) of the array index.

Here are the details.

I am importing data from a C++ array like this using 
itk::ImportImageFilter class.

typedef itk::ImportImageFilter<InputPixelType, Dimension> 
ImportImgFromArray;
ImportImgFromArray::Pointer importFilter = ImportImgFromArray::New();
ImportImgFromArray::SizeType size;
size[0]=xNumPixels;          //160
size[1]=yNumPixels;          //208
size[2]=zNumPixels;          //144
ImportImgFromArray::IndexType start;
start.Fill(0);
ImportImgFromArray::RegionType region;
region.SetIndex(start);
region.SetSize(size);
importFilter->SetRegion(region);
double origin[Dimension];
origin[0]=(xNumPixels/2) * PixelXWidth;
origin[1]=(yNumPixels/2) * PixelYWidth;
origin[2]=(zNumPixels/2) * PixelZWidth;
importFilter->SetOrigin(origin);
double spacing[Dimension];
spacing[0]=PixelXWidth;
spacing[1]=PixelYWidth;
spacing[2]=PixelZWidth;
importFilter->SetSpacing(spacing);
importFilter->SetImportPointer(tempBuffer, size[0]*size[1]*size[2], 
false);      //get data from a tempBuffer - a C++ array - there is no 
error here

I am setting the transformation like this,

typedef itk::AffineTransform<double, Dimension> TransformType;
TransformType::Pointer transform=TransformType::New();

resampler->SetDefaultPixelValue(0);      //resampler is a 
itk::ResampleImageFilter class
resampler->SetSize(size);
origin[0]=(xNumPixels/2) * PixelXWidth;
origin[1]=(yNumPixels/2) * PixelYWidth;
origin[2]=(zNumPixels/2) * PixelZWidth;
resampler->SetOutputOrigin(origin);
resampler->SetOutputSpacing(spacing);

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

TransformType::OutputVectorType rotation;
rotation[0]=1;   //rotate around X-Axis
rotation[1]=0;
rotation[2]=0;
transform->Rotate3D(rotation, 
m_cmnData->SagittalRotateZ(m_curDataSetListSel)*DegToRad, false);

TransformType::OutputVectorType translation2;
translation2[0]=origin[0];
translation2[1]=origin[1];
translation2[2]=origin[2];
transform->Translate(translation2);
resampler->SetTransform(transform);

resampler->SetInput(importFilter->GetOutput());
resampler->Update();

These are my transformation settings. But when I try to rotate it 
10degrees either CW or CCW, I am getting the rotations around the array 
index (0,0,0) not through the point that I specified in the image.

I was skeptical about the before and after translations of the rotation. 
So, when I disabled those two translations before and after it, the 
image just went out of bounds and I get only a blank 3D cube.
When I made the origin point to (0.0, 0.0, 0.0) even then the image is 
just rotating around the array index (0,0,0).

Can you please suggest me how can I get rotations for the 3D cube around 
its center point (that is, the center point of the cube). I want the 
whole cube rotate around itself about X-Axis. Can you please suggest me 
what to do for that.

thank you,
Rama Aravind.



More information about the Insight-users mailing list