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

rama rama at robots.ox.ac.uk
Tue Sep 20 09:19:36 EDT 2005


Hi Marius,

sorry, there is a small correction to my previous mail.

The second paragraph should read as,
***
TransformType::InputpointType centerPoint;
centerPoint[0]=(xNumPixels/2) * PixelXWidth;
cenerPoint[1]=(yNumPixels/2) * PixelYWidth;
centerPoint[2]=(zNumPixels/2) * PixelZWidth;
So, if I say transform->SetCenter(centerPoint) will it work.
***


rama wrote:

> Hi Marius,
>
> you mean resampler->SetCenter(...) instead of 
> resampler->SetOrigin(...)? Then what about SetOrigin(...) in 
> itk::ImportImageFilter class. What does it do? Is it not necessary.
>
> Also by world coordinates, you mean the same values that I used for 
> SetOrigin(...) before.
> So, if I say resampler->SetOrigin((xNumPixels/2) * PixelXWidth, 
> (yNumPixels/2) * PixelYWidth, (zNumPixels/2) * PixelZWidth) will it work.
>
> Still the doubt that I have is, which point to consider as the origin 
> while specifying the center point in world coordinates. If the center 
> point of image in world coordinates is (0,0,0) then what is the extra 
> need to specify a center point. This is bit confusing. Can you 
> elucidate it please?
>
> So, in world coordinates what will the center point of the 3D cube 
> considered as by the AffineTransform class. With respect to which 
> point should I specify the world coordinates of the center point.
>
> Can you please explain it a bit more.
>
> thank you,
> Rama Aravind.
>
> Marius Staring wrote:
>
>> Hi Rama,
>>
>> you have to use SetCenter(centerpoint) and not SetOrigin(). Make sure 
>> to give centerpoint in world coordinates.
>>
>> Regards,
>>
>> Marius Staring
>>
>> rama wrote:
>>
>>> 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.
>>>
>>> _______________________________________________
>>> Insight-users mailing list
>>> Insight-users at itk.org
>>> http://www.itk.org/mailman/listinfo/insight-users
>>>
>>
>
> _______________________________________________
> Insight-users mailing list
> Insight-users at itk.org
> http://www.itk.org/mailman/listinfo/insight-users




More information about the Insight-users mailing list