<div dir="ltr"><div><div><div><div><div><div>Hi Matt<br><br></div>Sorry to labour this point but I'm still confused as to what is going on; my misunderstanding may well be to do with how the pipelines work.<br><br></div>
As an example:<br><span style="font-family:courier new,monospace"><br>import itk<br></span><br><span style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">fileNameIn = '/route/to/input.nii'<br>
fileNameOut = '/route/to/output.nii'</span><br>image_type = itk.Image[itk.F, 3]<br>reader = itk.ImageFileReader[image_type].New()<br>reader.SetFileName(fileNameIn)<br>reader.Update()<br><br>image = reader.GetOutput()<br>
#image.GetOrigin() gives [-148, -153,  55]<br>#image.GetDirection().GetVnlMatrix().get(0,0)....(2,2)<br>#gives matrix:  1.0     0       0<br>#               0       0.95    0.3<br>#               0       -0.3    0.95<br><br>
image.GetOrigin().Fill(0)<br>image.GetDirection().SetIdentity()<br>#image.GetOrigin() gives [0, 0, 0]<br>#image.GetDirection().GetVnlMatrix().get(0,0)....(2,2)<br>#gives matrix:  1.0     0       0<br>#               0       1.0     0<br>
#               0       0       1.0<br><br>writer = itk.ImageFileWriter[image_type].New()<br>writer.SetFileName(fileNameOut)<br>writer.SetInput(image)<br>writer.Update()<br><b>#output image volume is unchanged when viewed in (e.g.) ImageJ<br>
</b><br>resampler = itk.ResampleImageFilter[image_type, image_type].New()<br>resampler.SetInput(image)<br>resampler.SetSize(image.GetLargestPossibleRegion().GetSize())<br>resampler.SetOutputOrigin(image.GetOrigin())<br>resampler.SetOutputSpacing(image.GetSpacing())<br>
resampler.SetOutputDirection(image.GetDirection())<br>resampler.Update()<br><br>writer.SetInput(resampler.GetOutput())<br>writer.Update()<br><b>#now output is translated and rotated by the (inverse) values of the original<br>
#origin vector and direction matrix<br>#<br>#However, resampler.GetInput().GetOrigin() gives [0,0,0]<br>#and similarly the direction of the input is a 3x3 identity matrix</b><br></span><br></div>I don't understand why the resampler changes the image volume since it should not be 'aware' of the original origin/direction.<br>
<br></div>From your previous reply you suggest that the call to resampler.Update() might cause the reader to re-import the file from disk.  Is this the case even when the reader and resampler are not connected in a pipeline (as here).  Further, if the reader does re-import the original image and origin/direction parameters why does resampler.GetInput().GetOrigin() report [0, 0, 0] and  the input direction matrix is an identity?<br>
<br></div><div>I want to understand why this is happening as it is clearly important for ensuring I set up more complex pipelines correctly.<br></div><br></div>Many thanks<br>Mathew<br></div><div class="gmail_extra"><br><br>
<div class="gmail_quote">On 30 June 2014 03:28, Matt McCormick <span dir="ltr"><<a href="mailto:matt.mccormick@kitware.com" target="_blank">matt.mccormick@kitware.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hi Mathew,<br>
<br>
The image does not retain the original parameters somewhere.  However,<br>
can must be take, because if the image is generated by a filter in a<br>
pipeline, that filter will reset the original value when the pipeline<br>
is re-run. ChangeInformationImageFilter will ensure this reset does<br>
not happen during a pipeline update.<br>
<br>
The Set methods doo reorient/reposition the whole image volume in<br>
world space.  The resampling filter does not select a subregion or<br>
rotates the images -- to get the same out, the  sampling locations of<br>
the output image for the ResampleImageFilter must be set as desired.<br>
Set SetOutputOrigin [1], SetOutputDirection [2], etc.<br>
<br>
Hope this helps to clarify.<br>
<br>
I checked by wrapped install, and I have ChangeInformationImageFilter<br>
instantiations for float images.<br>
<br>
Hope this helps,<br>
Matt<br>
<br>
[1] <a href="http://www.itk.org/Doxygen/html/classitk_1_1ResampleImageFilter.html#ac4b197ddefd3b3344bd9c9471acd5b00" target="_blank">http://www.itk.org/Doxygen/html/classitk_1_1ResampleImageFilter.html#ac4b197ddefd3b3344bd9c9471acd5b00</a><br>

<br>
[2] <a href="http://www.itk.org/Doxygen/html/classitk_1_1ResampleImageFilter.html#a9fdd6b862ab6cbaa03702da393bd0474" target="_blank">http://www.itk.org/Doxygen/html/classitk_1_1ResampleImageFilter.html#a9fdd6b862ab6cbaa03702da393bd0474</a><br>

<br>
<br>
On Sun, Jun 29, 2014 at 10:01 PM, Mathew Guilfoyle<br>
<div class="HOEnZb"><div class="h5"><<a href="mailto:mrguilfoyle@gmail.com">mrguilfoyle@gmail.com</a>> wrote:<br>
> Matt, thanks for the reply.<br>
><br>
> I would be grateful if you could you explain why this is the desired<br>
> behaviour.  If I use the SetDirection() or SetOrigin() methods does the<br>
> image object retain the original parameters somewhere?  Subsequently calling<br>
> GetDirection() or GetOrigin() reports the changed parameters.<br>
><br>
> Intuitively you would expect both Set methods to reorient/reposition the<br>
> whole image volume in world space, and on the face of it that is what they<br>
> seem to do.  However, on passing the image to a resampling filter they act<br>
> to select a subregion or to rotate the image. I would have thought that<br>
> rotations and region selections should be options passed to the filter and<br>
> not set in the image itself?<br>
><br>
> How does the ChangeInformationImageFilter do it differently?  Incidentally I<br>
> have wrapped for float but don't get this as an option for this filter.<br>
><br>
> Thanks<br>
> Mathew<br>
><br>
><br>
><br>
> On 30 June 2014 01:45, Matt McCormick <<a href="mailto:matt.mccormick@kitware.com">matt.mccormick@kitware.com</a>> wrote:<br>
>><br>
>> Hi Mathew,<br>
>><br>
>> Yes, that is the correct and expected behavior. I do not know if<br>
>> ImageJ is using the actual location in world space.<br>
>><br>
>> It sounds like ChangeInformationImageFilter is what you are looking<br>
>> for.  It will be wrapped for float images if wrapped for float images<br>
>> is enabled in you CMake configuration (ITK_WRAP_float).<br>
>><br>
>> Hope this helps,<br>
>> Matt<br>
>><br>
>><br>
>> On Sat, Jun 28, 2014 at 9:55 PM, Mathew Guilfoyle <<a href="mailto:mrguilfoyle@gmail.com">mrguilfoyle@gmail.com</a>><br>
>> wrote:<br>
>> > If I change an image's direction and origin using SetDirection() and<br>
>> > SetOrigin() methods and then write the image back to a file, the volume<br>
>> > stack viewed in (e.g.) ImageJ is unchanged.  This is the behaviour I<br>
>> > would<br>
>> > expect as changing the direction and origin shouldn't alter the array of<br>
>> > image pixels, just its location and orientation in 'world space'?<br>
>> ><br>
>> > However, if I take the same image, adjust the origin and direction as<br>
>> > before, and then input it to ResampleImageFilter with an identity<br>
>> > transform<br>
>> > (and set spacing, origin, direction, and size to those of the input<br>
>> > image)<br>
>> > the output is a translated and rotated image.<br>
>> ><br>
>> > It seems the difference between the original and adjusted origin and<br>
>> > direction are applied as a translation and rotation during resampling,<br>
>> > even<br>
>> > though GetOrigin() and GetDirection() on the input image to the<br>
>> > resampler<br>
>> > return the adjusted parameters.<br>
>> ><br>
>> > Is this the expected behaviour? Is there another image parameter that<br>
>> > needs<br>
>> > to be changed to correctly alter origin and direction?<br>
>> ><br>
>> > (ChangeInformationImageFilter is not wrapped for float images so I can't<br>
>> > use<br>
>> > it for my application)<br>
>> ><br>
>> > Thanks<br>
>> ><br>
>> > _____________________________________<br>
>> > Powered by <a href="http://www.kitware.com" target="_blank">www.kitware.com</a><br>
>> ><br>
>> > Visit other Kitware open-source projects at<br>
>> > <a href="http://www.kitware.com/opensource/opensource.html" target="_blank">http://www.kitware.com/opensource/opensource.html</a><br>
>> ><br>
>> > Kitware offers ITK Training Courses, for more information visit:<br>
>> > <a href="http://www.kitware.com/products/protraining.php" target="_blank">http://www.kitware.com/products/protraining.php</a><br>
>> ><br>
>> > Please keep messages on-topic and check the ITK FAQ at:<br>
>> > <a href="http://www.itk.org/Wiki/ITK_FAQ" target="_blank">http://www.itk.org/Wiki/ITK_FAQ</a><br>
>> ><br>
>> > Follow this link to subscribe/unsubscribe:<br>
>> > <a href="http://public.kitware.com/mailman/listinfo/insight-users" target="_blank">http://public.kitware.com/mailman/listinfo/insight-users</a><br>
>> ><br>
>> > _______________________________________________<br>
>> > Community mailing list<br>
>> > <a href="mailto:Community@itk.org">Community@itk.org</a><br>
>> > <a href="http://public.kitware.com/mailman/listinfo/community" target="_blank">http://public.kitware.com/mailman/listinfo/community</a><br>
>> ><br>
><br>
><br>
</div></div></blockquote></div><br></div>