[Insight-users] Black Output
    Maria Cira Avvinto 
    millarkaa at gmail.com
       
    Thu Feb 22 08:24:01 EST 2007
    
    
  
Hi,
i have used GradientAnisotropicDiffusionImageFilter+ConnectedThresholdImageFilter
in this code:
#if defined(_MSC_VER)
#pragma warning ( disable : 4786 )
#endif
#ifdef __BORLANDC__
#define ITK_LEAN_AND_MEAN
#endif
#include "itkGDCMImageIO.h"
#include "itkGDCMSeriesFileNames.h"
#include "itkImageSeriesReader.h"
#include "itkImageSeriesWriter.h"
#include <vector>
#include <itksys/SystemTools.hxx>
#include "itkCastImageFilter.h"
#include "itkConnectedThresholdImageFilter.h"
#include "itkGradientAnisotropicDiffusionImageFilter.h"
//#include "itkCurvatureFlowImageFilter.h"
int main( int argc, char *argv[])
{
	if( argc < 8 )
	{
		std::cerr << "Missing Parameters " << std::endl;
		std::cerr << "Usage: " << argv[0];
		std::cerr << " inputDirectory  outputDirectory seedX seedY
lowerThreshold upperThreshold VolumeID" << std::endl;
		return 1;
	}
	/***Codice per la lettura di immagini DICOM 3D***/
	/***Inizio Codice***/
	typedef signed short InputPixelType;
	const unsigned int Dimension = 3;
	typedef itk::Image< InputPixelType, Dimension > InputImageType;
	//definizione del reader della serie DICOM
	typedef itk::ImageSeriesReader< InputImageType > ReaderType;
	ReaderType::Pointer readerDICOM = ReaderType::New();
	//definizione del tipo per le immagini di input e output che è DICOM
	typedef itk::GDCMImageIO ImageIOType;
	ImageIOType::Pointer dicomIO = ImageIOType::New();
	readerDICOM->SetImageIO( dicomIO );
	//con queste istruzioni posso identificare i nomi dei file che
appartengono allo stesso volume
	typedef itk::GDCMSeriesFileNames NamesGeneratorType;
	NamesGeneratorType::Pointer nameGenerator = NamesGeneratorType::New();
	nameGenerator->SetUseSeriesDetails( true );
	nameGenerator->SetInputDirectory( argv[1] );
	//Visualizzo i numeri seriali dei diversi volumi all'interno della directory
	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++;
	}
	//fine visualizzazione
	//identifico le serie nella directory
	typedef std::vector< std::string > FileNamesContainer;
	FileNamesContainer fileNames;
	fileNames = nameGenerator->GetFileNames( argv[7] );
	//associo al reader delle slice che appartengono allo stesso volume
	readerDICOM->SetFileNames( fileNames );
	std::cerr << " Leggo immagine DICOM " << std::endl;
	/***Fine Codice***/
	/*** Inizio Codice per Connected Threshold ***/
	
	typedef   float           CTPixelType;
	typedef itk::Image< CTPixelType, 3 > CTImageType;
	std::cerr << " Definisco immagine floatfloat " << std::endl;
	typedef unsigned char OutputCTPixelType;
	typedef itk::Image< OutputCTPixelType, Dimension > OutputCTImageType;
	
	typedef itk::CastImageFilter< InputImageType, CTImageType > CastingFilterType1;
	CastingFilterType1::Pointer caster1 = CastingFilterType1::New();
	std::cerr << " Definisco filtro di cast 1 per casting da signed short
a float " << std::endl;
	typedef itk::CastImageFilter< CTImageType, OutputCTImageType  >
CastingFilterType2;
	CastingFilterType2::Pointer caster2 = CastingFilterType2::New();
	std::cerr << " Definisco filtro di cast 2 per casting da float a
unsigned char " << std::endl;
	typedef itk::CastImageFilter< OutputCTImageType, InputImageType  >
CastingFilterType3;
	CastingFilterType3::Pointer caster3 = CastingFilterType3::New();
	std::cerr << " Definisco filtro di cast 3 per casting da float a
signed short " << std::endl;
	typedef itk::GradientAnisotropicDiffusionImageFilter< CTImageType,
CTImageType > AnisotropicDiffusionImageFilterType;
	AnisotropicDiffusionImageFilterType::Pointer smoothing =
AnisotropicDiffusionImageFilterType::New();
	std::cerr << " Definisco Anisotropic Diffusion Filter " << std::endl;
	typedef itk::ConnectedThresholdImageFilter< CTImageType, CTImageType
> ConnectedFilterType;
	ConnectedFilterType::Pointer connectedThreshold = ConnectedFilterType::New();
	std::cerr << " Definisco Connected Threshold Filter " << std::endl;
	std::cerr << " Comincia la cascata di filtri" << std::endl;
	caster1->SetInput( readerDICOM->GetOutput() );
	smoothing->SetInput( caster1->GetOutput() );
	connectedThreshold->SetInput( smoothing->GetOutput() );
	caster2->SetInput( connectedThreshold->GetOutput() );
	caster3->SetInput( caster2->GetOutput() );
	smoothing->SetNumberOfIterations( 10 );
	smoothing->SetTimeStep( 0.0625);
	smoothing->SetConductanceParameter( 3 );
	smoothing->Update();
	const CTPixelType lowerThreshold = atof( argv[5] );
	const CTPixelType upperThreshold = atof( argv[6] );
	connectedThreshold->SetLower(  lowerThreshold  );
	connectedThreshold->SetUpper(  upperThreshold  );
	connectedThreshold->SetReplaceValue( 255 );
	CTImageType::IndexType  index;
	index[0] = atoi( argv[3] );
	index[1] = atoi( argv[4] );
	connectedThreshold->SetSeed( index );
	try
	{
		connectedThreshold->Update();
	}
	catch( itk::ExceptionObject & excep )
	{
		std::cerr << "Exception caught !" << std::endl;
		std::cerr << excep << std::endl;
	}
	
	/*** Inizio Codice per il writer DICOM ***/
	std::cerr << " Comincia scrittura slice DICOM " << std::endl;
	typedef signed short OutputPixelType;
	const unsigned int OutputDimension = 2;
	const char * outputDirectory = argv[2];
	itksys::SystemTools::MakeDirectory( outputDirectory );
	typedef itk::Image< OutputPixelType, OutputDimension > Image2DType;
	typedef itk::ImageSeriesWriter< InputImageType, Image2DType > SeriesWriterType;
	SeriesWriterType::Pointer seriesWriter = SeriesWriterType::New();
	seriesWriter->SetInput( caster3->GetOutput() );
	seriesWriter->SetImageIO( dicomIO );
	nameGenerator->SetOutputDirectory( outputDirectory );
	seriesWriter->SetFileNames( nameGenerator->GetOutputFileNames() );
	seriesWriter->SetMetaDataDictionaryArray(readerDICOM->GetMetaDataDictionaryArray()
);
	try
	{
		seriesWriter->Update();
	}
	catch( itk::ExceptionObject & excp )
	{
		std::cerr << "Exception thrown while writing the series " << std::endl;
		std::cerr << excp << std::endl;
		return EXIT_FAILURE;
	}
	std::cerr << "Fine" << std::endl;
	return 0;
}
The problem is the output because the image are all black.
Please, can anyone tell me why?
Thanks,
Maria
    
    
More information about the Insight-users
mailing list