Hi,<br><br>I`m  trying to read set of dicom files, extract one slice
and write it in jpeg file. But the jpeg file is very strange, it
appears in low resolution (or something like that).<br>Could anybody help me? Sorry for my english<br>
<br>My code<br><br><br>typedef itk::Image    &lt; unsigned char, 2 &gt;           WriteImageType;<br><br>typedef itk::Image    &lt; float, 3&gt;            ImageType;<br>typedef itk::Image    &lt; float, 2&gt;            ImageType2D;<br>


<br>typedef itk::ImageToVTKImageFilter    &lt;ImageType&gt;    ConnectorType;<br>typedef itk::ImageToVTKImageFilter    &lt;ImageType2D&gt;    ConnectorType2D;<br><br>typedef itk::ImageSeriesReader&lt; ImageType &gt;         ReaderType;<br>


<br>typedef itk::ExtractImageFilter&lt; ImageType, ImageType2D &gt; ExtractFilterType;<br><br>typedef itk::<div>RescaleIntensityImageFilter&lt; ImageType2D, WriteImageType &gt; RescalerType;<br><br>
typedef itk::ImageFileWriter&lt; WriteImageType &gt;  WriterType;<br>
<br><br>//-----------------------------------------------------------------------------<br>void ExtractSlice(ReaderType *reader, ExtractFilterType *extractFilter, int slice, int axis )<br>{<br><br>  ImageType::RegionType inputRegion = reader-&gt;GetOutput()-&gt;GetLargestPossibleRegion();<br>


  ImageType::SizeType size = inputRegion.GetSize();<br>  <br>  ImageType::IndexType start = inputRegion.GetIndex();<br>  const unsigned int sliceNumber = slice;  <br><br>  if((axis &gt; 2) || (axis &lt; 0))<br>    {<br>   
cout &lt;&lt; &quot;In file imAbstractFilter.cxx at method ExtractSlice().
Variable axis must be between 2 and 0.\n&quot; &lt;&lt;endl;<br>
    }<br>  <br>  if( (sliceNumber &gt; size[axis]) || (sliceNumber &lt; start[axis]) )<br>    {<br>    cout &lt;&lt; &quot;In file imAbstractFilter.cxx at method ExtractSlice(). Variable slice must be between &quot;<br>         &lt;&lt; size[axis] &lt;&lt; &quot; and &quot; &lt;&lt; start[axis] &lt;&lt; &quot;.\n&quot; &lt;&lt;endl;<br>


    }<br><br>  size[axis] = 0; // Setando e armazenado o eixo de interesse.<br>  start[axis] = sliceNumber; // Setando e armazenando o slice de interesse.<br>  <br>  ImageType::RegionType desiredRegion;<br>  desiredRegion.SetSize(  size  );<br>


  desiredRegion.SetIndex( start );<br>      <br>  extractFilter-&gt;SetExtractionRegion( desiredRegion );<br>  extractFilter-&gt;SetInput( reader-&gt;GetOutput() );<br>      <br>  try<br>  {<br>  extractFilter-&gt;Update();<br>


  }<br>  catch( itk::ExceptionObject &amp; excp )<br>  {<br>  cout &lt;&lt; &quot;In file imAbstractFilter.cxx at method ExtractSlice()\n&quot; &lt;&lt; endl;<br>  }<br>}<br><br><br>//-----------------------------------------------------------------------------<br>


void DICOMReader_Reslice(ConnectorType *connector, bool x, bool y, bool z)<br>{<br>    vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();        <br>        <br>  vtkImageViewer2 * viewer = vtkImageViewer2::New();<br>


      viewer-&gt;SetupInteractor( iren );<br>      viewer-&gt;SetInput( connector-&gt;GetOutput() );<br>      viewer-&gt;SetColorWindow( 256 );<br>      viewer-&gt;SetColorLevel( 144 );<br>      viewer-&gt;SetSlice(200);<br>


  <br>  if(x)<br>      {<br>      viewer-&gt;SetSliceOrientationToXY(); // orientação em X<br>      }<br>  else if(y)<br>      {<br>    viewer-&gt;SetSliceOrientationToYZ(); // orientação em Y<br>      }<br>  else if(z)<br>


      {<br>      viewer-&gt;SetSliceOrientationToXZ(); // orientação em Z<br>      }<br> <br>  viewer-&gt;GetRenderer()-&gt;ResetCamera();<br>  viewer-&gt;Render();<br>    iren-&gt;Start();<br>    <br>    iren-&gt;Delete();<br>


    viewer-&gt;Delete();<br>}<br><br><br><br>//-----------------------------------------------------------------------------<br>int main( int argc, char **argv )<br>{<br>  cout &lt;&lt; &quot;Lendo DICOM...&quot; &lt;&lt; endl;<br>


  char inputDirectory[256] = {&quot;/home/workspace2/ImageLab/data/Ricardo&quot;};<br><br>  ReaderType::Pointer reader = ReaderType::New();<br><br>  typedef itk::GDCMImageIO       ImageIOType;<br>  ImageIOType::Pointer dicomIO = ImageIOType::New();<br>


  reader-&gt;SetImageIO( dicomIO );<br><br>  typedef itk::GDCMSeriesFileNames NamesGeneratorType;<br>  NamesGeneratorType::Pointer nameGenerator = NamesGeneratorType::New();<br>  nameGenerator-&gt;SetUseSeriesDetails( true );<br>


  nameGenerator-&gt;SetDirectory( inputDirectory );<br><br>  typedef std::vector&lt; std::string &gt;    SeriesIdContainer;<br>  const SeriesIdContainer &amp; seriesUID = nameGenerator-&gt;GetSeriesUIDs();<br><br>  SeriesIdContainer::const_iterator seriesItr = seriesUID.begin();<br>


  SeriesIdContainer::const_iterator seriesEnd = seriesUID.end();<br>  while( seriesItr != seriesEnd )<br>    {<br>    seriesItr++;<br>    }<br><br>  std::string seriesIdentifier;<br>  seriesIdentifier = seriesUID.begin()-&gt;c_str();<br>


<br>  typedef std::vector&lt; std::string &gt;   FileNamesContainer;<br>  FileNamesContainer fileNames;<br>  fileNames = nameGenerator-&gt;GetFileNames( seriesIdentifier );<br><br>  reader-&gt;SetFileNames( fileNames );<br>


  reader-&gt;Update();<br><br>  //######################## Filtro<br>  cout &lt;&lt; &quot;Escrevendo JPG...&quot; &lt;&lt; endl;<br><br>  ExtractFilterType::Pointer ExtractFilter =  ExtractFilterType::New();<br>  ExtractSlice(reader, ExtractFilter, 200, 0 );<br>


<br>  RescalerType::Pointer rescaleFilter = RescalerType::New();<br>  rescaleFilter-&gt;SetOutputMinimum(0);<br>  rescaleFilter-&gt;SetOutputMaximum(255);<br>  rescaleFilter-&gt;SetInput( ExtractFilter-&gt;GetOutput() );<br>


<br>  char outputFileName[256] = {&quot;/home/workspace2/ImageLab/data/Ricardo.png&quot;};<br><br>  WriterType::Pointer writer = WriterType::New();<br>  writer-&gt;SetFileName( outputFileName );<br>  writer-&gt;SetInput( rescaleFilter-&gt;GetOutput() );<br>


  writer-&gt;Update();<br><br><br>  //######################## Conector para o Pipeline ITK =&gt; VTK    <br>  cout &lt;&lt; &quot;Conectando ITK ao VTK...&quot; &lt;&lt;endl;<br>  ConnectorType::Pointer connector = ConnectorType::New();<br>


  connector-&gt;SetInput( reader-&gt;GetOutput() );<br><br>  DICOMReader_Reslice(connector, false, true, false);<br>    <br>  return 0;<br>}</div><br clear="all"><br>-- <br>Atenciosamente,<br><br>Eduardo Camargo<br>Analista de Sistemas<br>

HeMoLab - <a href="http://hemolab.lncc.br/equipe/desenv/eduardo.htm" target="_blank">http://hemolab.lncc.br/equipe/desenv/eduardo.htm</a><br>Laboratório Nacional de Computação Científica - LNCC<br>