[Insight-users] Problem with ResampleImageFilter

Luis Ibanez luis.ibanez at kitware.com
Fri, 30 Jan 2004 15:19:59 -0500


Hi Rama,


This seems to be simply a problem of visualization
and interpretation of the visualization.

If you take an image of extent

          550mm X 550mm

and extract a region from it having size

          500mm X 500mm

with a commong origing in (0mm,0mm).


Then *scale* the output image in order to fit
in a window of the same size that you use for
displaying the original image, the scaling
that you do for visualization will produce
an apparent *displacement* of your mark.

You must think in physical coordinates, not
in pixels.

The important question is:

     If you compute the physical coordinate
     of the mark in the input image and in
     the output image.... do you get the
     same coordinates ?

If the answer is yes, then the resampling
is working fine and you simply have a
visualization problem. If you want to
overlap the output image to the input image
you *should not* scale it to the window size.

Same thing is valid if you are using a
validation technique like having linked
cursors between the two windows.

You should display your images in such a
way that a 1mm bar placed on every image
will have the same size on the screen.


Regards,


    Luis


------------------
CSPL wrote:

> Hello Luis,
> 
>  The origins of both input and the output images are the same, it is (0,0,0)
> but I have a doubt regarding the 50mm margin that will be cut off. Let me
> put forward my question graphically,
>               |
>               |     x                           x - is the mask in the input
> image.
>               |  X                            X - is the mask in the output
> image.
>  ------(0,0)-------
>               |
>               |
>               |
> 
>  If we resample a 550mm/550mm image into a 500mm/500mm image doesn't the
> mask appear at the same area of the output image as it is in the input
> image?
> 
>  Let us assume that in the above graph 'x' is at location 55,55 (10% of 550
> = 55).
>  I think that when we resample the input image to 500mm it must be
> approximately at the location 50,50 (10% of 500 = 50). Isn't it so?
>  Doesn't it mean that the shift should only be by 5mm?
>  Doesn't it also mean that the mask should appear to be shifted "down and
> left" as in the above graph rather than "down and right" as I have got.
> 
>  All the above questions appear to be fine when we display the images (input
> and output) on a window of fixed height and width without zooming the images
> to fit the window.
>  The error in output I got was when I am displaying the images after zooming
> them to fit the window in which they are displayed. Both images are
> displayed in separate windows of the same size.
> Since the dimensions of the input and output images are proportional (output
> img width and height are four times the input image width and height), the
> scale factors for zooming would also have been proportional.
> 
>  Considering all the above points, what should I do to get the correct
> output.
>  Do you think it is only the problem of displaying the image rather than in
> passing parameters to the ResampleImageFilter?
> 
>  Please clarify me on these issues sir.
>  Thank you,
> 
> Rama Krishna.
> 
> ----- Original Message -----
> From: "Luis Ibanez" <luis.ibanez at kitware.com>
> To: "CSPL" <hyd2_affable at sancharnet.in>
> Cc: <insight-users at itk.org>
> Sent: Thursday, January 29, 2004 7:44 PM
> Subject: Re: [Insight-users] Problem with ResampleImageFilter
> 
> 
> 
>>Hi Rama,
>>
>>What is the origin of the input image ?
>>
>>In your code I see the origin of the
>>output image what I didn't find any
>>reference to the origin of the input
>>image.  Can you please post its value
>>to the list ?
>>
>>
>>The physical extent of the input image
>>seems to be:
>>
>>     Ex = 550 mm
>>     EY = 550 mm
>>     Ez = 148 mm
>>
>>and the physical extent of the output
>>image seems to be:
>>
>>     Ex = 500 mm
>>     EY = 500 mm
>>     Ez = 148 mm
>>
>>If the two origins where coincident the
>>output image should have a subregion of
>>the input image.  Basically it should be
>>taking out a border of 50mm in the upper
>>coordinates on X and a border of 50mm
>>in the upper coordinates on Y.
>>
>>The description of shifting "down and right"
>>unfortunately doesn't tell us much since it
>>depends on what kind of viewer you are using
>>for visualizing your image. It may be using
>>any of the four flipng possibilities in 2D.
>>
>>The best way to understan the effects of
>>resampling is to draw in a piece of paper
>>the coordinate system of the input image,
>>draw a rectangle indicating the physical
>>region covered by the input image, then
>>locating where in this coordinate system
>>will be mapped the origin of the output
>>image as well as its other three corners.
>>By completing the rectangle of the region
>>corresponding to the output image is should
>>be very easy to visualize what piece of the
>>input image will appear on the output image.
>>
>>
>>Please check the origin of the input
>>image and let us know.
>>
>>
>>Regards,
>>
>>
>>    Luis
>>
>>
>>
>>-----------
>>CSPL wrote:
>>
>>>Hello Luis,
>>>
>>> I have been using the ResampleImageFilter of ITK to resample an image
>>>(source/input) with the following properties
>>>  Width = 128 VoxelWidth = 4.296875
>>>  Height = 128 VoxelHeight = 4.296875
>>>  Depth = 35 VoxelDepth = 4.25
>>>
>>> into an image (destination/output) with the following properties
>>>  Width = 512 VoxelWidth = 0.976562
>>>  Height = 512 VoxelHeight = 0.976562
>>>  Depth = 35 VoxelDepth = 4.25
>>>
>>> I have set the other values for the filter as follows:
>>>
>>> typedef itk::ResampleImageFilter<InputImageType,OutputImageType >
>>>ResampleFilterType;
>>> ResampleFilterType::Pointer resampler = ResampleFilterType::New();
>>>
>>> typedef itk::AffineTransform<double,3> TransformType;
>>> TransformType::Pointer transform = TransformType::New();
>>>
>>> transform->SetIdentity();
>>> resampler->SetTransform( transform );
>>> resampler->SetInput( Mask ); // Mask is InputImageType
>>>
>>> // Output image spacing : (0.976562, 0.976562, 4.25)
>>> double Spacing[ 3 ] = { voxelWidth, voxelHeight, voxelDepth };
>>>
>>> // Output image size : (512, 512, 35)
>>> int fSize[ 3 ] = { width, height, depth };
>>>
>>> double Origin[ 3 ] = { 0, 0, 0 };
>>>
>>> InputImageType::SizeType Size;
>>> Size[0] = fSize[0];
>>> Size[1] = fSize[1];
>>> Size[2] = fSize[2];
>>>
>>> typedef itk::NearestNeighborInterpolateImageFunction<
>>>                       InputImageType, double>  InterpolatorType;
>>> InterpolatorType::Pointer interpolator = InterpolatorType::New();
>>>
>>> resampler->SetSize( Size );
>>> resampler->SetOutputOrigin( Origin );
>>> resampler->SetDefaultPixelValue( 0 );
>>> resampler->SetOutputSpacing( Spacing );
>>> resampler->SetInterpolator(interpolator);
>>>
>>> After executing the above code, the mask appears to have shifted down
>>>and right.
>>> What could the reason be? Is it the pixel spacing?
>>>
>>> I tried giving the values 1 and 0.8 for the spacing values in the above
>>>code.
>>> When I did that the mask completely disappeared from the image. That is
>>>why I thought pixel spacing is the reason for the shift in the output.
>>>
>>> The same code has given an output of our satisfaction for the following
>>> Input Image:
>>>  Width = 128 VoxelWidth = 3.90625
>>>  Height = 128 VoxelHeight = 3.90625
>>>  Depth = 35 VoxelDepth = 4.25
>>>
>>> Output Image:
>>>  Width = 512 VoxelWidth = 0.976562
>>>  Height = 512 VoxelHeight = 0.976562
>>>  Depth = 35 VoxelDepth = 4.25
>>>
>>> In both the above cases the data type of input and output images is
>>>"short".
>>> Please help me out with this situation sir.
>>>
>>>bye,
>>> Rama Krishna.
>>
>>
>>
> 
> _______________________________________________
> Insight-users mailing list
> Insight-users at itk.org
> http://www.itk.org/mailman/listinfo/insight-users
>