[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