<div dir="ltr">Hi all,<br><br>I did a little program to read a 3D Medical Image in Anaylze format and extract a slice, saving it in 2D, using the same format.<br><br>It works for almost all of the images I have here, but with one I had a bad result.<br>
<br>Here are 2 images that I have tested: <a href="http://www.vision.ime.usp.br/~luisrpp/analyze/">http://www.vision.ime.usp.br/~luisrpp/analyze/</a><br><br>With the 061b0105_anlz.hdr, it works fine. But with the s9.hdr, I have got an unaligned image.<br>
<br>When I tryied to write a 2D image slice from s9.hdr, the following message was displayed:<br><br>&quot;AnalyzeImageIO (0x8153950): ERROR: Analyze 7.5 File Format Only Allows RPI, PIR, and RIP Orientation&quot;<br><br>
Using an Medical Image Viwer program, I discovered that the image s9.hdr has an IRA Orientation. I used then an OrientImageFilter to fix this. But it didn&#39;t work. The following message was displayed:<br><br>&quot;terminate called after throwing an instance of &#39;itk::InvalidRequestedRegionError&#39;<br>
&nbsp; what():&nbsp; /home/luis/dev-tools/InsightToolkit-3.2.0/Code/Common/itkDataObject.cxx:397:<br>Requested region is (at least partially) outside the largest possible region.<br>Aborted&quot;<br><br>Does anybody knows how to solve this problem?<br>
<br>This is par of the code (without validations):<br><br>-------------------------------------------------------------------------------------------------------------------------------------------------------<br>#include &quot;itkImageFileReader.h&quot;<br>
#include &quot;itkImageFileWriter.h&quot;<br>#include &quot;itkExtractImageFilter.h&quot;<br>#include &quot;itkImage.h&quot;<br>#include &quot;itkAnalyzeImageIO.h&quot;<br>#include &quot;itkOrientImageFilter.h&quot;<br>#include&lt;sys/stat.h&gt;<br>
<br>typedef float&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InputPixelType4D;<br>typedef float&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OutputPixelType3D;<br><br>typedef itk::Image&lt; InputPixelType4D,&nbsp; 4 &gt;&nbsp;&nbsp;&nbsp; InputImageType4D;<br>typedef itk::Image&lt; OutputPixelType3D, 3 &gt;&nbsp;&nbsp;&nbsp; OutputImageType3D;<br>
<br>typedef itk::ImageFileReader&lt; InputImageType4D&nbsp; &gt;&nbsp; ReaderType4D;<br>typedef itk::ImageFileWriter&lt; OutputImageType3D &gt;&nbsp; WriterType3D;<br>typedef itk::ExtractImageFilter&lt; InputImageType4D, OutputImageType3D &gt; FilterType3D;<br>
<br>typedef float&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InputPixelType3D;<br>typedef float&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OutputPixelType2D;<br><br>typedef itk::Image&lt; InputPixelType3D,&nbsp; 3 &gt;&nbsp;&nbsp;&nbsp; InputImageType3D;<br>typedef itk::Image&lt; OutputPixelType2D, 2 &gt;&nbsp;&nbsp;&nbsp; OutputImageType2D;<br>
<br>typedef itk::ImageFileReader&lt; InputImageType3D&nbsp; &gt;&nbsp; ReaderType3D;<br>typedef itk::ImageFileWriter&lt; OutputImageType2D &gt;&nbsp; WriterType2D;<br>typedef itk::ExtractImageFilter&lt; InputImageType3D, OutputImageType2D &gt; FilterType2D;<br>
<br>typedef float&nbsp;&nbsp; PixelType;<br>typedef itk::Image&lt; PixelType, 2 &gt;&nbsp; InputImageType;<br>typedef itk::ImageFileReader&lt; InputImageType &gt; ReaderType;<br><br>InputImageType::Pointer extract2DImageSlice(InputImageType3D::Pointer reader, int plane, int slice) {<br>
&nbsp;&nbsp;&nbsp; FilterType2D::Pointer filter = FilterType2D::New();<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; InputImageType3D::RegionType inputRegion =<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; reader-&gt;GetLargestPossibleRegion();<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; InputImageType3D::SizeType size = inputRegion.GetSize();<br>
&nbsp;&nbsp;&nbsp; size[plane] = 0;<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; InputImageType3D::IndexType start = inputRegion.GetIndex();<br>&nbsp;&nbsp;&nbsp; const unsigned int sliceNumber = slice;<br>&nbsp;&nbsp;&nbsp; start[plane] = sliceNumber;<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; InputImageType3D::RegionType desiredRegion;<br>
&nbsp;&nbsp;&nbsp; desiredRegion.SetSize(&nbsp; size&nbsp; );<br>&nbsp;&nbsp;&nbsp; desiredRegion.SetIndex( start );<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; filter-&gt;SetExtractionRegion( desiredRegion );<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; filter-&gt;SetInput( reader );<br><br>&nbsp;&nbsp;&nbsp; InputImageType::Pointer img = filter-&gt;GetOutput();<br>
&nbsp;&nbsp;&nbsp; img-&gt;Update();<br><br>&nbsp;&nbsp;&nbsp; return img;<br>}<br><br>InputImageType3D::Pointer ReadAnalyzeFile(const char *path)<br>{<br>&nbsp;&nbsp;&nbsp; itk::AnalyzeImageIO::Pointer io = itk::AnalyzeImageIO::New();<br>&nbsp;&nbsp;&nbsp; ReaderType3D::Pointer fileReader = ReaderType3D::New();<br>
&nbsp;&nbsp;&nbsp; fileReader-&gt;SetImageIO(io);<br>&nbsp;&nbsp;&nbsp; fileReader-&gt;SetFileName(path);<br>&nbsp;&nbsp;&nbsp; fileReader-&gt;Update();<br>&nbsp;&nbsp;&nbsp; InputImageType3D::Pointer rval = fileReader-&gt;GetOutput();<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; itk::OrientImageFilter&lt;InputImageType3D,InputImageType3D&gt;::Pointer orienter =<br>
&nbsp;&nbsp;&nbsp; itk::OrientImageFilter&lt;InputImageType3D,InputImageType3D&gt;::New();<br>&nbsp;&nbsp;&nbsp; orienter-&gt;UseImageDirectionOn();<br>&nbsp;&nbsp;&nbsp; orienter-&gt;SetDesiredCoordinateOrientation(itk::SpatialOrientation::ITK_COORDINATE_ORIENTATION_IRA);<br>
&nbsp;&nbsp;&nbsp; orienter-&gt;SetInput(rval);<br>&nbsp;&nbsp;&nbsp; orienter-&gt;Update();<br>&nbsp;&nbsp;&nbsp; rval = orienter-&gt;GetOutput();<br><br>&nbsp;&nbsp;&nbsp; return rval;<br>&nbsp;}<br><br>int main( int argc, char ** argv )<br>{<br>&nbsp;&nbsp;&nbsp; if( argc &lt; 2 )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; &quot;Usage: &quot; &lt;&lt; std::endl;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; argv[0] &lt;&lt; &quot; input3DImageFile &quot; &lt;&lt; std::endl;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return EXIT_FAILURE;<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; char *inputFilename&nbsp; = argv[1];<br><br>&nbsp;&nbsp;&nbsp; InputImageType3D::Pointer image = ReadAnalyzeFile(inputFilename);<br>
&nbsp;&nbsp;&nbsp; InputImageType::Pointer image2D = extract2DImageSlice(image, 0, 50);<br><br>&nbsp;&nbsp;&nbsp; WriterType2D::Pointer writer = WriterType2D::New();<br>&nbsp;&nbsp;&nbsp; writer-&gt;SetFileName( &quot;teste.hdr&quot; );<br>&nbsp;&nbsp;&nbsp; writer-&gt;SetInput( image2D );<br>
<br>&nbsp;&nbsp;&nbsp; try<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; writer-&gt;Update();<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; catch( itk::ExceptionObject &amp; err )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; &quot;ExceptionObject caught !&quot; &lt;&lt; std::endl;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; err &lt;&lt; std::endl;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return EXIT_FAILURE;<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; return EXIT_SUCCESS;<br>}<br><br>-------------------------------------------------------------------------------------------------------------------------------------------------------<br>
<br>Thank&#39;s in advance,<br>Luis<br></div>