[Insight-users] itkMergeLabelMapFilter.h

John Drozd john.drozd at gmail.com
Thu Dec 17 13:43:53 EST 2009


Hi Gaetan,

Thank you very much !

The example code you referred me to showed me how to perform the merge.

I just had to add the lines:

//added code per itkMergeLabelMapFilterTest1.cxx

  convertermerge->SetInput( labelMap );

  convertermerge->SetInput( 1, labelMap2 );

  //end of added code

Thanks again,
john

On Thu, Dec 17, 2009 at 1:12 PM, John Drozd <john.drozd at gmail.com> wrote:

> Hi Gaetan,
>
> My particular brain subject had the left and right brain ventricle as
> separate regions, so I inputed a seed for the left ventricle and a seed for
> the right ventricle, and created a separate label map for each ventricle.
> (I could not figure out how to create a label map with two labelled
> segmentations, so I am trying to merge these two label maps into a combined
> label map.)
>
> Below is my code and thank you:
>
> /*
> to run type:
>
> ./ConnectedThresholdImagechangedtoFuzzyConnectednessImageFilter
> "/trumpet/downloads/ReadAtlasDicomSeriesAndReadSubjectDicomSeries_Plugin/ReadAtlasDicomSeriesAndReadSubjectDicomSeries/ReadAtlasDicomSeriesAndReadSubjectDicomSeries3DSlicerDec22009/normal002_S_0295.dcm"
> outsubjectnormal4final.dcm outfuzzymapnormal.mhd 100 151 95 86 152 76 2.5 10
>
> */
>
> #if defined(_MSC_VER)
> #pragma warning ( disable : 4786 )
> #endif
>
> #ifdef __BORLANDC__
> #define ITK_LEAN_AND_MEAN
> #endif
>
>
> #include "itkConnectedThresholdImageFilter.h"
>
> #include "itkImage.h"
> #include "itkCastImageFilter.h"
>
> #include "itkCurvatureFlowImageFilter.h"
>
> #include "itkImageFileReader.h"
> #include "itkImageFileWriter.h"
>
> #include "itkGDCMImageIO.h"
>
> #include "itkVersion.h"
>
> #include "itkOrientedImage.h"
> #include "itkMinimumMaximumImageFilter.h"
>
> #include "itkGDCMImageIO.h"
> #include "itkGDCMSeriesFileNames.h"
> #include "itkNumericSeriesFileNames.h"
>
> #include "itkImageSeriesReader.h"
> #include "itkImageSeriesWriter.h"
>
> #include "itkResampleImageFilter.h"
> #include "itkShiftScaleImageFilter.h"
>
> #include "itkIdentityTransform.h"
> #include "itkLinearInterpolateImageFunction.h"
>
> #include <itksys/SystemTools.hxx>
>
> #include "gdcm/src/gdcmFile.h"
> #include "gdcm/src/gdcmUtil.h"
>
> #include <string>
>
> //added per attribute_values.cxx
> #include "itkImageFileReader.h"
>
> #include "itkShapeLabelObject.h"
>
> #include "itkLabelMap.h"
>
> #include "itkBinaryImageToShapeLabelMapFilter.h"
> //end of added code
>
> //added per label.cxx
> #include "itkLabelObject.h"
> #include "itkLabelMap.h"
> #include "itkBinaryImageToLabelMapFilter.h"
> #include "itkLabelMapToLabelImageFilter.h"
> //end of added code
>
> #include "itkSimpleFilterWatcher.h"
>
> //added per FuzzyConnectednessImageFilter.cxx
> #include "itkSimpleFuzzyConnectednessScalarImageFilter.h"
> #include "itkConfidenceConnectedImageFilter.h"
> //end of added code
>
> #include "itkMergeLabelMapFilter.h"
>
> int main( int argc, char *argv[])
> {
>   if( argc < 7 )
>     {
>     std::cerr << "Missing Parameters " << std::endl;
>     std::cerr << "Usage: " << argv[0];
>
>     std::cerr << " inputImage  outputImage outputAffinityMap seedX seedY
> seedZ seedX seedY seedZ multiplier tolerancedivisor" << std::endl;
>
>
>     return 1;
>     }
>
>   typedef   unsigned char          BinaryPixelType;
>
>   const     unsigned int    Dimension = 3;
>
>   typedef itk::Image< BinaryPixelType, Dimension >  BinaryImageType;
>
>
>   typedef signed short InputPixelType;
>
>   typedef itk::Image< InputPixelType, Dimension > InputImageType;
>   typedef unsigned char LabelType;
>   const unsigned int dim = 3;
>   typedef itk::ShapeLabelObject< LabelType, dim > LabelObjectType;
>   typedef itk::LabelMap< LabelObjectType > LabelMapType;
>
>   typedef itk::LabelMap< LabelObjectType > LabelMapType2;
>
>   typedef itk::BinaryImageToShapeLabelMapFilter< BinaryImageType,
> LabelMapType> ConverterType;
>
>   ConverterType::Pointer converter = ConverterType::New();
>
>    typedef itk::BinaryImageToShapeLabelMapFilter< BinaryImageType,
> LabelMapType> ConverterType2;
>   ConverterType2::Pointer converter2 = ConverterType2::New();
>
>   typedef  itk::ImageFileReader< InputImageType > ReaderType;
>   typedef  itk::ImageFileWriter<  BinaryImageType  > WriterType;
>
>   ReaderType::Pointer reader = ReaderType::New();
>   WriterType::Pointer writer = WriterType::New();
>
>   typedef itk::GDCMImageIO           ImageIOTypefixed;
>   ImageIOTypefixed::Pointer gdcmImageIOfixed = ImageIOTypefixed::New();
>   reader->SetImageIO( gdcmImageIOfixed );
>
>   typedef itk::GDCMImageIO           ImageIOTypefixed2;
>   ImageIOTypefixed2::Pointer gdcmImageIOfixed2 = ImageIOTypefixed2::New();
>
>   reader->SetFileName( argv[1] );
>
>   reader->Update();
>
>   typedef itk::ConfidenceConnectedImageFilter<
>                                                   InputImageType,
>                                                   BinaryImageType
>                                                     >
> ConfidenceConnectedFilterType;
>
>   ConfidenceConnectedFilterType::Pointer confidenceConnectedFilter =
>
> ConfidenceConnectedFilterType::New();
>
>   typedef itk::SimpleFuzzyConnectednessScalarImageFilter<
>                                                   InputImageType,
>                                                   BinaryImageType
>                                                     >
> FuzzySegmentationFilterType;
>
>    FuzzySegmentationFilterType::Pointer fuzzysegmenter =
>
> FuzzySegmentationFilterType::New();
>
>    typedef FuzzySegmentationFilterType::FuzzySceneType  FuzzySceneType;
>
>    typedef  itk::ImageFileWriter< FuzzySceneType  >    FuzzyWriterType;
>
>    FuzzyWriterType::Pointer fwriter = FuzzyWriterType::New();
>
>    fwriter->SetFileName( argv[3] );
>
>    BinaryImageType::IndexType  index;
>
>   index[0] = atoi( argv[4] );
>   index[1] = atoi( argv[5] );
>   index[2] = atoi( argv[6] );
>
>   const double varianceMultiplier = atof( argv[10] );
>
>   confidenceConnectedFilter->SetInput( reader->GetOutput()  );
>   confidenceConnectedFilter->SetMultiplier( varianceMultiplier );
>   confidenceConnectedFilter->SetNumberOfIterations( 12 );
>
>   fuzzysegmenter->SetInput( reader->GetOutput() );
>
>   double varianceEstimation = 0;
>
>   double  meanEstimation = 0;
>
>   confidenceConnectedFilter->SetSeed( index );
>   confidenceConnectedFilter->Update();
>
>   meanEstimation      = confidenceConnectedFilter->GetMean();
>   varianceEstimation  = confidenceConnectedFilter->GetVariance();
>
>   std::cout << "Mean     estimation = " << meanEstimation     << std::endl;
>   std::cout << "Variance estimation = " << varianceEstimation << std::endl;
>
>   if( varianceEstimation > meanEstimation/atoi( argv[11] ) )
>     {
>
>       index[0] = index[0]-10;
>       index[1] = index[1]-10;
>       index[2] = index[2]-10;
>
>       confidenceConnectedFilter->SetSeed( index );
>       confidenceConnectedFilter->Update();
>
>       meanEstimation      = confidenceConnectedFilter->GetMean();
>       varianceEstimation  = confidenceConnectedFilter->GetVariance();
>
>     }
>
>   while( varianceEstimation > meanEstimation/atoi( argv[11] )  )
>     {
>
>       index[0] = index[0] + 1;
>
>       confidenceConnectedFilter->SetSeed( index );
>       confidenceConnectedFilter->Update();
>
>       meanEstimation      = confidenceConnectedFilter->GetMean();
>       varianceEstimation  = confidenceConnectedFilter->GetVariance();
>
>       std::cout << "Mean     estimation = " << meanEstimation     <<
> std::endl;
>       std::cout << "Variance estimation = " << varianceEstimation <<
> std::endl;
>
>       if ( varianceEstimation > meanEstimation/atoi( argv[11] ))
>     {
>       index[1] = index[1] + 1;
>
>       confidenceConnectedFilter->SetSeed( index );
>       confidenceConnectedFilter->Update();
>
>       meanEstimation      = confidenceConnectedFilter->GetMean();
>       varianceEstimation  = confidenceConnectedFilter->GetVariance();
>
>       std::cout << "Mean     estimation = " << meanEstimation     <<
> std::endl;
>       std::cout << "Variance estimation = " << varianceEstimation <<
> std::endl;
>     }
>
>       if ( varianceEstimation >  meanEstimation/atoi( argv[11] ))
>     {
>       index[2] = index[2] + 1;
>
>       confidenceConnectedFilter->SetSeed( index );
>       confidenceConnectedFilter->Update();
>
>       meanEstimation      = confidenceConnectedFilter->GetMean();
>       varianceEstimation  = confidenceConnectedFilter->GetVariance();
>
>       std::cout << "Mean     estimation = " << meanEstimation     <<
> std::endl;
>       std::cout << "Variance estimation = " << varianceEstimation <<
> std::endl;
>     }
>
>     }
>
>   std::cout << index << std::endl;
>
>   std::cout << "Mean     estimation = " << meanEstimation     << std::endl;
>   std::cout << "Variance estimation = " << varianceEstimation << std::endl;
>
>   fuzzysegmenter->SetObjectSeed( index );
>
>   fuzzysegmenter->SetMean( meanEstimation );
>   fuzzysegmenter->SetVariance( varianceEstimation );
>   fuzzysegmenter->SetThreshold( 0.5 );
>
>   fuzzysegmenter->Update();
>
>   //begin second label
>
>   FuzzySegmentationFilterType::Pointer fuzzysegmenter2 =
>
> FuzzySegmentationFilterType::New();
>   index[0] = atoi( argv[7] );
>   index[1] = atoi( argv[8] );
>   index[2] = atoi( argv[9] );
>
>   confidenceConnectedFilter->SetInput( reader->GetOutput()  );
>   confidenceConnectedFilter->SetMultiplier( varianceMultiplier );
>   confidenceConnectedFilter->SetNumberOfIterations( 12 );
>
>   fuzzysegmenter2->SetInput( reader->GetOutput() );
>
>   varianceEstimation = 0;
>
>   meanEstimation = 0;
>
>   confidenceConnectedFilter->SetSeed( index );
>   confidenceConnectedFilter->Update();
>
>   meanEstimation      = confidenceConnectedFilter->GetMean();
>   varianceEstimation  = confidenceConnectedFilter->GetVariance();
>
>   std::cout << "Mean     estimation = " << meanEstimation     << std::endl;
>   std::cout << "Variance estimation = " << varianceEstimation << std::endl;
>
>   if( varianceEstimation > meanEstimation/atoi( argv[11] ) )
>     {
>
>       index[0] = index[0]-10;
>       index[1] = index[1]-10;
>       index[2] = index[2]-10;
>
>       confidenceConnectedFilter->SetSeed( index );
>       confidenceConnectedFilter->Update();
>
>       meanEstimation      = confidenceConnectedFilter->GetMean();
>       varianceEstimation  = confidenceConnectedFilter->GetVariance();
>
>     }
>
>   while( varianceEstimation > meanEstimation/atoi( argv[11] )  )
>     {
>
>       index[0] = index[0] + 1;
>
>       confidenceConnectedFilter->SetSeed( index );
>       confidenceConnectedFilter->Update();
>
>       meanEstimation      = confidenceConnectedFilter->GetMean();
>       varianceEstimation  = confidenceConnectedFilter->GetVariance();
>
>       std::cout << "Mean     estimation = " << meanEstimation     <<
> std::endl;
>       std::cout << "Variance estimation = " << varianceEstimation <<
> std::endl;
>
>       if ( varianceEstimation > meanEstimation/atoi( argv[11] ))
>     {
>       index[1] = index[1] + 1;
>
>       confidenceConnectedFilter->SetSeed( index );
>       confidenceConnectedFilter->Update();
>
>       meanEstimation      = confidenceConnectedFilter->GetMean();
>       varianceEstimation  = confidenceConnectedFilter->GetVariance();
>
>       std::cout << "Mean     estimation = " << meanEstimation     <<
> std::endl;
>       std::cout << "Variance estimation = " << varianceEstimation <<
> std::endl;
>     }
>
>       if ( varianceEstimation >  meanEstimation/atoi( argv[11] ))
>     {
>       index[2] = index[2] + 1;
>
>       confidenceConnectedFilter->SetSeed( index );
>       confidenceConnectedFilter->Update();
>
>       meanEstimation      = confidenceConnectedFilter->GetMean();
>       varianceEstimation  = confidenceConnectedFilter->GetVariance();
>
>       std::cout << "Mean     estimation = " << meanEstimation     <<
> std::endl;
>       std::cout << "Variance estimation = " << varianceEstimation <<
> std::endl;
>     }
>
>     }
>
>   std::cout << index << std::endl;
>
>   std::cout << "Mean     estimation = " << meanEstimation     << std::endl;
>   std::cout << "Variance estimation = " << varianceEstimation << std::endl;
>
>   fuzzysegmenter2->SetObjectSeed( index );
>
>   fuzzysegmenter2->SetMean( meanEstimation );
>   fuzzysegmenter2->SetVariance( varianceEstimation );
>   fuzzysegmenter2->SetThreshold( 0.5 );
>
>   fuzzysegmenter2->Update();
>
>   //end second label
>
>   typedef itk::MetaDataDictionary DictionaryType;
>
>   DictionaryType inputdict = reader->GetMetaDataDictionary();
>
>   writer->SetMetaDataDictionary( inputdict );
>
>   writer->SetFileName( argv[2] );
>
>   converter->SetInput( fuzzysegmenter->GetOutput() );
>
>   converter->SetFullyConnected( true );
>
>   converter->SetInputForegroundValue( 255 );
>
>   converter->SetOutputBackgroundValue( 0 );
>
>   converter->Update();
>
>   converter2->SetInput( fuzzysegmenter2->GetOutput() );
>
>   converter2->SetFullyConnected( true );
>
>   converter2->SetInputForegroundValue( 255 );
>
>   converter2->SetOutputBackgroundValue( 0 );
>
>   converter2->Update();
>
>   LabelMapType::Pointer labelMap = converter->GetOutput();
>
>   LabelMapType2::Pointer labelMap2 = converter2->GetOutput();
>
>   std::cout.precision(20);
>
>   std::cout << "labelMap->GetNumberOfLabelObjects() = " <<
> labelMap->GetNumberOfLabelObjects() << std::endl;
>
>   std::cout << "labelMap2->GetNumberOfLabelObjects() = " <<
> labelMap2->GetNumberOfLabelObjects() << std::endl;
>
>   for( unsigned int label=1; label<=labelMap->GetNumberOfLabelObjects();
> label++ )
>     {
>     // we don't need a SmartPointer of the label object here, because the
> reference is kept in
>     // in the label map.
>     const LabelObjectType * labelObject = labelMap->GetLabelObject( label
> );
>     std::cout << label << "\t" << labelObject->GetSize() << "\t" <<
> labelObject->GetPhysicalSize() << "\t" << labelObject->GetCentroid() <<
> std::endl;
>     }
>
>   for( unsigned int label=1; label<=labelMap2->GetNumberOfLabelObjects();
> label++ )
>     {
>     // we don't need a SmartPointer of the label object here, because the
> reference is kept in
>     // in the label map.
>     const LabelObjectType * labelObject2 = labelMap2->GetLabelObject( label
> );
>     std::cout << label << "\t" << labelObject2->GetSize() << "\t" <<
> labelObject2->GetPhysicalSize() << "\t" << labelObject2->GetCentroid() <<
> std::endl;
>     }
>
>   //added to merge the two label maps
>
>   typedef itk::MergeLabelMapFilter< LabelMapType > ConverterMergeType;
>
>   ConverterMergeType::Pointer convertermerge = ConverterMergeType::New();
>
>   /*******************************
>
>   how do I merge labelMap and LabelMap2 ?
>
>   ********************************/
>
>    //end
>
>   typedef itk::LabelMapToLabelImageFilter< LabelMapType, BinaryImageType >
> L2IType;
>
>   L2IType::Pointer l2i = L2IType::New();
>
>   l2i->SetInput( converter->GetOutput() );
>
>   writer->SetInput( l2i->GetOutput() );
>
>   try
>     {
>     writer->Update();
>     }
>   catch( itk::ExceptionObject & excep )
>     {
>     std::cerr << "Exception caught !" << std::endl;
>     std::cerr << excep << std::endl;
>     }
>
>   fwriter->SetInput( fuzzysegmenter->GetFuzzyScene() );
>   fwriter->Update();
>
>   return 0;
> }
>
>
> 2009/12/17 Gaëtan Lehmann <gaetan.lehmann at jouy.inra.fr>
>
>
>> Le 17 déc. 09 à 18:22, John Drozd a écrit :
>>
>>
>>  Hi,
>>>
>>> Can anyone show me how to use the MergeLabelMapFilter to merge two label
>>> maps?
>>>
>>
>>
>> Hi John,
>>
>> You can look at Testing/Code/Review/itkMergeLabelMapFilterTest1.cxx, as an
>> example.
>>
>> Can you be more specific on what you want to do?
>>
>> Regards,
>>
>> Gaëtan
>>
>>
>> --
>> Gaëtan Lehmann
>> Biologie du Développement et de la Reproduction
>> INRA de Jouy-en-Josas (France)
>> tel: +33 1 34 65 29 66    fax: 01 34 65 29 09
>> http://voxel.jouy.inra.fr  http://www.itk.org
>> http://www.mandriva.org  http://www.bepo.fr
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.itk.org/pipermail/insight-users/attachments/20091217/1bc089a2/attachment-0001.htm>


More information about the Insight-users mailing list