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

rama rama at robots.ox.ac.uk
Tue Sep 20 11:36:14 EDT 2005


Hi Marius,

I want to clraify one thing that you said. You are suggesting me to get 
the center point from Image like this,
image->TransformIndexToPhysicalPoint( centerInIndices ) ;   //I 
understood that centerInIndices is a itk::point

But I don't have an Image class. I have only itk::ImportImageFilter 
class which imports data from a C++ array.
I gave this in my code. This ImportImageFilter gives data to the 
ResampleImageFilter class.

Now, how can I access the center point of this array in world 
coordinates. This class does not have the 
TransformIndexToPhysicalPoint(...) function.
How can I get the center point in world coordinates from this class.

Also, I tried itk::VersorTransform and itk::Versor3DRigidTransform. in vain.

itk::VersorTransform does not have SetCenter(...) function in it. 
Versor3DRigidTransform has that function, but it is not giving me the 
desired result when I specified the center point in this way,
TransformType::InputPointType centerPoint;
centerPoint[0] = (xNumPixels/2) * PixelXWidth;
centerPoint[1] = - (yNumPixels/2) * PixelYWidth;
centerPoint[2] = (zNumPixels/2) * PixelZWidth;
transform->SetCenter(centerPoint);

When I make this center point to (0.0, 0.0, 0.0) then, just I am getting 
the previous result. The image is rotating about the corner of the image.

What else can I do.

I just want to rotate the 3D cube around a point and I can't do it in 
all the three ways I tried.

For the last time I will try the SetParameters(...) function from the 
VersorRigid3DTransform class. But I am not understanding how to get the 
center point of the array in world coordinates.

Can you please suggest me a way how to do it.

Thank you,
Rama.

Marius Staring wrote:

> Hi Rama,
>
> from the definition of Rotate3D:
>
>    http://www.itk.org/Doxygen/html/classitk_1_1AffineTransform.html#a3
>
> I understand that this function does not use the center of rotation. 
> (I don't know why that is) You could try something like
>
>    affinetransform->SetCenter( image->TransformIndexToPhysicalPoint( 
> centerInIndices ) );
>    ParametersType parameters;
>    parameters[ 0 ] = ..... etc, where the first 9 parameters are your 
> matrix and the last 3 the translation
>    affinetransform->SetParameters( parameters );
>
> The SetParameters() function does take into account the center.
>
> Hope this helps,
>
> Marius
>
> rama wrote:
>
>> Hi,
>>
>> I tried the SetCenter(...) method that you suggestd, but I am still 
>> not getting rotations about that point.
>>
>> So, I have a cube of 160 X 144 X 208 pixels and I want to rotate it 
>> by the point (80, 72, 104) around X-Axis.
>>
>> Here is the code that I wrote for setting the CenterPoint,
>>
>> TransformType::InputPointType centerPoint;
>> centerPoint[0] = (xNumPixels/2) * PixelXWidth;
>> centerPoint[1] = - (yNumPixels/2) * PixelYWidth;
>> centerPoint[2] = (zNumPixels/2) * PixelZWidth;
>> transform->SetCenter(centerPoint);
>>
>> I did this before I set the rotation values. Also, here I don't have 
>> two images, like one fixed and other moving. I only have one single 
>> cube and just I want to rotate it.
>>
>> But with the addition of above lines of code before setting the 
>> rotation values (transform->SetRotation3D(rotation, angle, false)) 
>> doesn't make any difference. Still the image is rotating about one of 
>> the corners of the image. Not about its center point.
>>
>> Please see the images before and after rotations. 
>> http://www.funnotes.net/img-before-rot.JPG    
>> http://www.funnotes.net/img-after-rot.JPG  . This image is a Left 
>> side view of the 3D cube (middle slice).
>>
>> You can see that image rotation is done about the Top-Left corner of 
>> the image and not about the center point of the image (the center 
>> point of cross).
>>
>> Can you please suggest what to do here.
>>
>> thank you,
>> Rama.
>>
>> Marius Staring wrote:
>>
>>> No I mean
>>>
>>>    affinetransform->SetCenter( 
>>> fixedImage->TransformIndexToPhysicalPoint( centerInIndices ) );
>>>
>>> See also
>>>
>>>    
>>> http://www.itk.org/Doxygen/html/classitk_1_1MatrixOffsetTransformBase.html#z1307_0 
>>>
>>>
>>> for what the SetCenter() does
>>>
>>> Regards,
>>>
>>> Marius
>>>
>>> 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
>>>>>>
>>>>>
>>>>
>>>>
>>>
>>
>>
>



More information about the Insight-users mailing list