[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
>