[Insight-users] confusion with specifying origin for 3D affine
transformations - itkAffineTransform
Marius Staring
marius at isi.uu.nl
Tue Sep 20 10:46:17 EDT 2005
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
>>>>>
>>>>
>>>
>>>
>>
>
>
--
Marius Staring
Image Sciences Institute
University Medical Centre Utrecht
Heidelberglaan 100, 3584 CX Utrecht, The Netherlands
phone: +31 (0)30 250 3186, fax: +31 (0)30 251 3399
marius at isi.uu.nl, http://www.isi.uu.nl/People/Marius
More information about the Insight-users
mailing list