[Insight-users] Problem with volume rendering using ITK, VTK and DICOM files

Luis Ibanez luis.ibanez at kitware.com
Sat May 21 14:57:55 EDT 2011


Thanks for posting the screenshot of the volume rendering.

Your image seems to be a CT scan, and you are accordingly
setting the pixel types as RBG< signed short >./

However, in your code

> colorTransferFunction->AddRGBPoint(0,    0.0, 0.0, 0.0);
> colorTransferFunction->AddRGBPoint(500,  1.0, 0.5, 0.3);
> colorTransferFunction->AddRGBPoint(1000, 1.0, 0.5, 0.3);
> colorTransferFunction->AddRGBPoint(1150, 1.0, 1.0, 0.9);


you don't seem to be considering the negative range
of  the Hounsfield values
http://www.itk.org/Wiki/ITK_Hounsfield_Units

That will correspond to air outside of he body.

You may want to include a first color transfer point at

> colorTransferFunction->AddRGBPoint(-1000,    0.0, 0.0, 0.0);


at the beginning of your set.


    Luis


------------------------------------------------------------
On Thu, May 19, 2011 at 6:21 PM, Phrenology for Bipolarity
<enxeltheeagle151 at msn.com> wrote:
> Hi all,
>
> I'm trying to visualize a DICOM series of files with VTK but when the volume
> is rendered everything is wrapped within a big black box.
>
> This is what I get: http://img64.imageshack.us/img64/3506/visualize.png
>
> And the volume I should be getting is inside it.
>
> Can someone tell me what I'm doing wrong please? Or give some advice to fix
> this problem?
>
>
> Below is my code, which is a combination of
> "InsightToolkit\Examples\IO\DicomSeriesReadImageWrite2.cxx" and
> "InsightApplications\Auxiliary\vtk\itkReadITKImageShowVTK.cxx" with some
> adjustments.
>
> -------------------------------------------------------------------------
>
> #include "itkOrientedImage.h"
> #include "itkGDCMImageIO.h"
> #include "itkGDCMSeriesFileNames.h"
> #include "itkImageSeriesReader.h"
> #include "itkImageFileWriter.h"
>
> #include "itkCommand.h"
> #include "itkImage.h"
> #include "itkVTKImageExport.h"
> #include "itkVTKImageImport.h"
> #include "itkCurvatureFlowImageFilter.h"
> #include "itkCastImageFilter.h"
> #include "itkRGBPixel.h"
> #include "itkImageFileReader.h"
> #include "itkImageFileWriter.h"
> #include "vtkImageData.h"
>
> #include "vtkImageImport.h"
> #include "vtkImageExport.h"
> #include "vtkImageActor.h"
> #include "vtkRenderer.h"
> #include "vtkRenderWindow.h"
> #include "vtkRenderWindowInteractor.h"
> #include "vtkInteractorStyleImage.h"
> #include "vtkPiecewiseFunction.h"
> #include "vtkColorTransferFunction.h"
> #include "vtkVolumeProperty.h"
> #include "vtkVolumeTextureMapper3D.h"
> #include "vtkFixedPointVolumeRayCastMapper.h"
> #include "vtkSmartPointer.h"
>
> template <typename ITK_Exporter, typename VTK_Importer>
> void ConnectPipelines(ITK_Exporter exporter, VTK_Importer* importer)
> {
>
> importer->SetUpdateInformationCallback(exporter->GetUpdateInformationCallback());
>
> importer->SetPipelineModifiedCallback(exporter->GetPipelineModifiedCallback());
>   importer->SetWholeExtentCallback(exporter->GetWholeExtentCallback());
>   importer->SetSpacingCallback(exporter->GetSpacingCallback());
>   importer->SetOriginCallback(exporter->GetOriginCallback());
>   importer->SetScalarTypeCallback(exporter->GetScalarTypeCallback());
>
> importer->SetNumberOfComponentsCallback(exporter->GetNumberOfComponentsCallback());
>
> importer->SetPropagateUpdateExtentCallback(exporter->GetPropagateUpdateExtentCallback());
>   importer->SetUpdateDataCallback(exporter->GetUpdateDataCallback());
>   importer->SetDataExtentCallback(exporter->GetDataExtentCallback());
>   importer->SetBufferPointerCallback(exporter->GetBufferPointerCallback());
>   importer->SetCallbackUserData(exporter->GetCallbackUserData());
> }
>
> template <typename VTK_Exporter, typename ITK_Importer>
> void ConnectPipelines(VTK_Exporter* exporter, ITK_Importer importer)
> {
>
> importer->SetUpdateInformationCallback(exporter->GetUpdateInformationCallback());
>
> importer->SetPipelineModifiedCallback(exporter->GetPipelineModifiedCallback());
>   importer->SetWholeExtentCallback(exporter->GetWholeExtentCallback());
>   importer->SetSpacingCallback(exporter->GetSpacingCallback());
>   importer->SetOriginCallback(exporter->GetOriginCallback());
>   importer->SetScalarTypeCallback(exporter->GetScalarTypeCallback());
>
> importer->SetNumberOfComponentsCallback(exporter->GetNumberOfComponentsCallback());
>
> importer->SetPropagateUpdateExtentCallback(exporter->GetPropagateUpdateExtentCallback());
>   importer->SetUpdateDataCallback(exporter->GetUpdateDataCallback());
>   importer->SetDataExtentCallback(exporter->GetDataExtentCallback());
>   importer->SetBufferPointerCallback(exporter->GetBufferPointerCallback());
>   importer->SetCallbackUserData(exporter->GetCallbackUserData());
> }
>
> void visualize(std::string dcm)
> {
>
>  typedef itk::RGBPixel< signed short > PixelType;
>  const unsigned int      Dimension = 3;
>
>  typedef itk::OrientedImage< PixelType, 3 > ImageType;
>
>  typedef itk::ImageSeriesReader< ImageType > ReaderType;
>  ReaderType::Pointer reader = ReaderType::New();
>
>  typedef itk::GDCMImageIO       ImageIOType;
>  ImageIOType::Pointer dicomIO = ImageIOType::New();
>
>  reader->SetImageIO( dicomIO );
>
>  typedef itk::GDCMSeriesFileNames NamesGeneratorType;
>  NamesGeneratorType::Pointer nameGenerator = NamesGeneratorType::New();
>
>  nameGenerator->SetUseSeriesDetails( true );
>  nameGenerator->AddSeriesRestriction("0008|0021" );
>
>  nameGenerator->SetDirectory(directoryPath);
>
>  try{
>      std::cout << std::endl << "The directory: " << std::endl;
>      std::cout << std::endl << directoryPath << std::endl << std::endl;
>      std::cout << "Contains the following DICOM Series: ";
>      std::cout << std::endl << std::endl;
>
>      typedef std::vector< std::string >    SeriesIdContainer;
>
>      const SeriesIdContainer & seriesUID = nameGenerator->GetSeriesUIDs();
>
>      SeriesIdContainer::const_iterator seriesItr = seriesUID.begin();
>      SeriesIdContainer::const_iterator seriesEnd = seriesUID.end();
>      while( seriesItr != seriesEnd ) {
>           std::cout << seriesItr->c_str() << std::endl;
>           seriesItr++;
>      }
>
>     std::string seriesIdentifier;
>     seriesIdentifier = seriesUID.begin()->c_str();
>
>     std::cout << std::endl << std::endl;
>     std::cout << "Now reading series: " << std::endl << std::endl;
>     std::cout << seriesIdentifier << std::endl;
>     std::cout << std::endl << std::endl;
>
>     typedef std::vector< std::string >   FileNamesContainer;
>     FileNamesContainer fileNames;
>
>     fileNames = nameGenerator->GetFileNames( seriesIdentifier );
>
>     FileNamesContainer::const_iterator iterator = fileNames.begin();
>     FileNamesContainer::const_iterator final = fileNames.end();
>     while( iterator != final )
>       {
>       std::cout << iterator->c_str() << std::endl;
>       iterator++;
>       }
>
> reader->SetFileNames( fileNames );
>
>  try
>       {
>       reader->Update();
>       }
>     catch (itk::ExceptionObject &ex)
>       {
>       std::cout << ex << std::endl;
>       return EXIT_FAILURE;
>       }
>
>  }
> catch (itk::ExceptionObject &ex)
>     {
>     std::cout << ex << std::endl;
>     return EXIT_FAILURE;
>     }
>
>
> typedef itk::VTKImageExport< ImageType > ExportFilterType;
> ExportFilterType::Pointer itkExporter = ExportFilterType::New();
>
> itkExporter->SetInput( reader->GetOutput() );
>
> vtkImageImport* vtkImporter = vtkImageImport::New();
> ConnectPipelines(itkExporter, vtkImporter);
>
> typedef itk::VTKImageImport< ImageType > ImportFilterType;
> ImportFilterType::Pointer itkImporter = ImportFilterType::New();
>
> vtkImageExport* vtkExporter = vtkImageExport::New();
> ConnectPipelines(vtkExporter, itkImporter);
>
> vtkExporter->SetInput( vtkImporter->GetOutput() );
>
>
> vtkPiecewiseFunction* opacityTransferFunction = vtkPiecewiseFunction::New();
> opacityTransferFunction->AddPoint(0,    0.00);
> opacityTransferFunction->AddPoint(500,  0.15);
> opacityTransferFunction->AddPoint(1000, 0.15);
> opacityTransferFunction->AddPoint(1150, 0.85);
>
> vtkColorTransferFunction* colorTransferFunction =
> vtkColorTransferFunction::New();
> colorTransferFunction->AddRGBPoint(0,    0.0, 0.0, 0.0);
> colorTransferFunction->AddRGBPoint(500,  1.0, 0.5, 0.3);
> colorTransferFunction->AddRGBPoint(1000, 1.0, 0.5, 0.3);
> colorTransferFunction->AddRGBPoint(1150, 1.0, 1.0, 0.9);
>
> vtkVolume* volume = vtkVolume::New();
> vtkVolumeProperty* volumeProperty = vtkVolumeProperty::New();
>     vtkFixedPointVolumeRayCastMapper* volumeMapperSoftware =
> vtkFixedPointVolumeRayCastMapper::New();
>
> volumeProperty->SetScalarOpacity(opacityTransferFunction);
> volumeProperty->SetColor(colorTransferFunction);
> volumeProperty->SetInterpolationTypeToLinear();
> volumeProperty->ShadeOff();
> volume->SetProperty(volumeProperty);
>
> volumeMapperSoftware->SetInput(vtkImporter->GetOutput());
> volumeMapperSoftware->SetSampleDistance(1.0);
> volume->SetMapper(volumeMapperSoftware);
>
> vtkInteractorStyleTrackballCamera * interactorStyle =
> vtkInteractorStyleTrackballCamera::New();
>
> vtkRenderer* renderer = vtkRenderer::New();
> vtkRenderWindow* renWin = vtkRenderWindow::New();
> vtkRenderWindowInteractor* iren = vtkRenderWindowInteractor::New();
>
>   renWin->SetSize(500, 500);
>   renWin->AddRenderer(renderer);
>   iren->SetRenderWindow(renWin);
>   iren->SetInteractorStyle(interactorStyle);
>
>   renderer->AddVolume(volume);
>
>   renderer->SetBackground(0.5, 0.5, 0.5);
>
>   renWin->Render();
>   iren->Start();
>
>   vtkImporter->Delete();
>   vtkExporter->Delete();
>   renWin->Delete();
>   renderer->Delete();
>   iren->Delete();
> }
>
> int main(int argc, char * argv [] )
> {
>     if( argc < 2 )
>     {
>     std::cerr << "Usage: " << argv[0] << " path to DICOM series" <<
> std::endl;
>     return 1;
>     }
>
>     visualize(argv[1]);
>
>     return 0;
> }
> _____________________________________
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
>
> Kitware offers ITK Training Courses, for more information visit:
> http://www.kitware.com/products/protraining.html
>
> Please keep messages on-topic and check the ITK FAQ at:
> http://www.itk.org/Wiki/ITK_FAQ
>
> Follow this link to subscribe/unsubscribe:
> http://www.itk.org/mailman/listinfo/insight-users
>
>


More information about the Insight-users mailing list