Hi guys,<br><br>I am confused by the behavior of itk::OrientImageFilter. <br><br>If I re-orient an image from RPI to LPI, the output image is visualized&nbsp; as same as the input file using Slicer3 as the visualization tool.<br>
<br>As I look closer, it appears to me that the filter do the thing below if the input and output both are meta format:<br><br>1. change the orientation of the data stored ( however the AnatomicalOrientation remains unchanged, is it a bug?).
<br>2. change the TransformMatrix.<br><br>To change the orientation of image, a filter may have to do either 1 or 2, preferably 1, because it means Anatomical Orientation. However, since the filter does both 1 and 2, so the visualization seems unchanged.
<br><br>Does somebody know if it is a bug or implemented in purpose? <br><br>The data can be downloaded at <a href="http://www.duke.edu/~kurtzhao/RPI_original.zip">http://www.duke.edu/~kurtzhao/RPI_original.zip</a> and the code is enclosed.
<br><br>Any input is highly appreciated.<br><br>-Kurt<br><br>#include &lt;metaCommand.h&gt;<br>#include &lt;itkImageFileWriter.h&gt;<br>#include &lt;itkImageFileReader.h&gt;<br>#include &lt;itkAnalyzeImageIO.h&gt;<br>#include &lt;
itkNiftiImageIO.h&gt;<br>#include &lt;itkOrientImageFilter.h&gt;<br>#include &lt;itkSpatialOrientation.h&gt;<br><br><br><br>int main(int argc, char **argv)<br>&nbsp; {<br><br>&nbsp; const unsigned int&nbsp;&nbsp;&nbsp; Dimension&nbsp; =&nbsp; 3;<br>&nbsp; typedef short PixelType;
<br><br>&nbsp; typedef itk::Image&lt; PixelType, Dimension &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ImageType;<br>&nbsp; typedef itk::ImageFileReader&lt; ImageType &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ReaderType;<br>&nbsp; typedef itk::ImageIOBase&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ImageIOBaseType;<br><br>
&nbsp; ReaderType::Pointer reader = ReaderType::New();<br><br>&nbsp; itk::AnalyzeImageIO::Pointer io = itk::AnalyzeImageIO::New();<br><br>&nbsp; std::string inputFileName; <br>&nbsp; inputFileName = &quot;C:/data/formatConversion/RPI_original.mha&quot;;
<br><br>&nbsp; reader-&gt;SetFileName( inputFileName.c_str() );<br><br><br>&nbsp; try <br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; reader -&gt; Update ( ) ;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp; catch( itk::ExceptionObject&nbsp; &amp;&nbsp; err&nbsp; )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; std::cerr&nbsp; &lt;&lt; &quot;ExceptionObject caught !&quot;&nbsp; &lt;&lt; std::endl;
<br>&nbsp;&nbsp;&nbsp; std::cerr&nbsp; &lt;&lt; err &lt;&lt;&nbsp; std::endl;<br>&nbsp;&nbsp;&nbsp; return EXIT_FAILURE;<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp; typedef itk::OrientImageFilter&lt;ImageType,ImageType&gt; OrienterType;<br>&nbsp; OrienterType::Pointer orienter =&nbsp; OrienterType::New();
<br>&nbsp; orienter-&gt;UseImageDirectionOn();<br>&nbsp;&nbsp; orienter-&gt;SetDesiredCoordinateOrientation(itk::SpatialOrientation::ITK_COORDINATE_ORIENTATION_LPI); <br>&nbsp; orienter-&gt;SetInput( reader -&gt; GetOutput ( ) );<br>&nbsp; try <br>
&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; orienter-&gt;Update();<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp; catch( itk::ExceptionObject&nbsp; &amp;&nbsp; err&nbsp; )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; std::cerr&nbsp; &lt;&lt; &quot;ExceptionObject caught !&quot;&nbsp; &lt;&lt; std::endl;<br>&nbsp;&nbsp;&nbsp; std::cerr&nbsp; &lt;&lt; err &lt;&lt;&nbsp; std::endl;
<br>&nbsp;&nbsp;&nbsp; return EXIT_FAILURE;<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp; typedef itk::ImageFileWriter &lt; ImageType &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WriterType;<br><br>&nbsp; WriterType::Pointer writer = WriterType::New();<br><br>&nbsp; itk::NiftiImageIO::Pointer niftIio = itk::NiftiImageIO::New();
<br><br><br>&nbsp; std::string outputFileName; <br><br>&nbsp; outputFileName = &quot;C:/data/formatConversion/LPI.mha&quot;;<br><br>&nbsp; writer -&gt;SetFileName( outputFileName.c_str() );<br><br>&nbsp; writer -&gt; SetInput ( orienter -&gt; GetOutput ( ) ) ;
<br><br>&nbsp; writer -&gt; UseCompressionOn ( ) ;<br><br>&nbsp; try <br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; writer -&gt; Update ( ) ;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp; catch( itk::ExceptionObject&nbsp; &amp;&nbsp; err&nbsp; )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; std::cerr&nbsp; &lt;&lt; &quot;ExceptionObject caught !&quot;&nbsp; &lt;&lt; std::endl;
<br>&nbsp;&nbsp;&nbsp; std::cerr&nbsp; &lt;&lt; err &lt;&lt;&nbsp; std::endl;<br>&nbsp;&nbsp;&nbsp; return EXIT_FAILURE;<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp; return EXIT_SUCCESS;<br>&nbsp; }<br>