[Rtk-users] coordinates of 3D volume

Yang Kyun Park theday79 at gmail.com
Wed Sep 10 10:56:28 EDT 2014


Hi Simon,

 

Thanks for the good tip. Let me try out your approach too!

 

YangKyun

 

From: simon.rit at gmail.com [mailto:simon.rit at gmail.com] On Behalf Of Simon Rit
Sent: Wednesday, September 10, 2014 10:50 AM
To: Yang Kyun Park
Cc: Chao Wu; rtk-users at openrtk.org
Subject: Re: [Rtk-users] coordinates of 3D volume

 

This option works but there is a risk of an additional interpolation by the resampler and it costs some computing time. The other option I suggested requires to modify the transform parameter of the source (in this example, add

constantImageSource->SetDirection(transform->GetMatrix());

where transform is that of Yang's example, then use itk::ChangeImageInformation <http://www.itk.org/Doxygen/html/classitk_1_1ChangeInformationImageFilter.html>  to reset the transform to identity.

 

On Wed, Sep 10, 2014 at 3:47 PM, Yang Kyun Park <theday79 at gmail.com <mailto:theday79 at gmail.com> > wrote:

Hi Chao,

 

I had the same issue on my work and I’ve managed to fix it by the following codes.

I’m not sure this is the optimal way to do it but at least it worked in my case.

 

(Or you can transform it in 3D Slicer.

In transform menu, you need to apply the following matrix:

0 0 -1 0

1 0 0 0

0 1 0 0

0 0 0 1

to the target image, harden the transform then export the image.)

 

Best,

YangKyun

 

 

// OutputImageType = <float, 3>

// streamerBP->GetOutput(): resultant 3D image from rtkfdk reconstruction

 

//Same image type from original image -3D & float

       OutputImageType::IndexType start_trans;

       start_trans[0] = 0;

       start_trans[1] = 0;

       start_trans[2] = 0;

 

       OutputImageType::SizeType size_trans;

       size_trans[0] = sizeOutput[0]; // X //410

       size_trans[1] = sizeOutput[2]; //Y  // 410

       size_trans[2] = sizeOutput[1]; //Z // 120?

 

       OutputImageType::SpacingType spacing_trans;

       spacing_trans[0] = spacing[0];

       spacing_trans[1] = spacing[2];

       spacing_trans[2] = spacing[1];

 

       OutputImageType::PointType Origin_trans;

       Origin_trans[0] = -0.5* size_trans[0]*spacing_trans[0];

       Origin_trans[1] = -0.5* size_trans[1]*spacing_trans[1];

       Origin_trans[2] = -0.5* size_trans[2]*spacing_trans[2];       

 

       OutputImageType::RegionType region_trans;

       region_trans.SetSize(size_trans);

       region_trans.SetIndex(start_trans);

 

       /* 2) Prepare Target image */

       OutputImageType::Pointer targetImg = streamerBP->GetOutput();

 

       /* 3) Configure transform */  

       typedef itk::Euler3DTransform< double > TransformType;

       TransformType::Pointer transform = TransformType::New();

 

       TransformType::ParametersType param;

       param.SetSize(6);

       //MAXIMUM PARAM NUMBER: 6!!!

       param.put(0, 0.0); //rot X // 0.5 = PI/2

       param.put(1,  itk::Math::pi/2.0);//rot Y

       param.put(2,  itk::Math::pi/-2.0);//rot Z

       param.put(3, 0.0); // Trans X mm

       param.put(4, 0.0); // Trans Y mm

       param.put(5, 0.0); // Trans Z mm

 

       TransformType::ParametersType fixedParam(3); //rotation center

       fixedParam.put(0,0);

       fixedParam.put(1,0);

       fixedParam.put(2,0);

 

       transform->SetParameters(param);

       transform->SetFixedParameters(fixedParam); //Center of the Transform

 

       cout << "Transform matrix:" << "  " << endl;

       cout << transform->GetMatrix() << std::endl;

 

       typedef itk::ResampleImageFilter<OutputImageType, OutputImageType> ResampleFilterType;   

       ResampleFilterType::Pointer resampler = ResampleFilterType::New(); 

       //OutputImageType::RegionType fixedImg_Region = fixedImg->GetLargestPossibleRegion().GetSize();

 

       resampler->SetInput(targetImg);

       resampler->SetSize(size_trans);

       resampler->SetOutputOrigin( Origin_trans); //Lt Top Inf of Large Canvas

       resampler->SetOutputSpacing( spacing_trans ); // 1 1 1 

       resampler->SetOutputDirection( targetImg->GetDirection() ); //image normal?

       resampler->SetTransform(transform);

 

       //LR flip

 

       cout << "LR flip filter is being applied" << endl;

 

       typedef itk::FlipImageFilter< OutputImageType >  FilterType;

 

       FilterType::Pointer flipFilter = FilterType::New();

       typedef FilterType::FlipAxesArrayType FlipAxesArrayType;

 

       FlipAxesArrayType arrFlipAxes;

       arrFlipAxes[0] = 1;

       arrFlipAxes[1] = 0;

       arrFlipAxes[2] = 0;

 

       flipFilter->SetFlipAxes(arrFlipAxes);

       flipFilter->SetInput(resampler->GetOutput());

flipFilter->Update();

 

//Use flipFilter->GetOutput() for further process

 

 

 

From: Rtk-users [mailto:rtk-users-bounces at public.kitware.com <mailto:rtk-users-bounces at public.kitware.com> ] On Behalf Of Simon Rit
Sent: Wednesday, September 10, 2014 8:39 AM
To: Chao Wu
Cc: rtk-users at openrtk.org <mailto:rtk-users at openrtk.org> 
Subject: Re: [Rtk-users] coordinates of 3D volume

 

Hi,

I wish there was a single industrial standard... You have the DICOM standard in mind and I used an IEC standard (see wiki). You can play with the --direction option to orientate the voxel axes of your image (see itk::Image documentation) and then reset the direction of your output image to identity, I think that will do what you want.

Simon

 

On Wed, Sep 10, 2014 at 1:35 PM, Chao Wu <wuchao04 at gmail.com <mailto:wuchao04 at gmail.com> > wrote:

Hi all,

 

I see that rtk use certain industrial standard for the coordinates of 2D projections and 3D volumes. However in medical imaging, the xy planes of a volume are usually transaxial slices while the 3rd dimension is aligned with the axis of rotation. I would like to switch to this coordinates in my own code. Is there anyone who can give me some comments and suggestions about where to start? Thanks.

 

Regards,

Chao


_______________________________________________
Rtk-users mailing list
Rtk-users at public.kitware.com <mailto:Rtk-users at public.kitware.com> 
http://public.kitware.com/mailman/listinfo/rtk-users

 

 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/rtk-users/attachments/20140910/04875757/attachment-0009.html>


More information about the Rtk-users mailing list