[Insight-users] Gatens Label Object Representation and Manipulation

Christian Werner christian.werner at rwth-aachen.de
Mon Mar 1 15:17:36 EST 2010


Wonderful news, I have colored labeling now!

The trick was to update the itkLabelMapToRGBImageFilter.h and .txx by 
renaming the

virtual void ThreadedGenerateData( LabelObjectType * labelObject ); 

to

virtual void ThreadedProcessLabelObject( LabelObjectType * labelObject ); 

I found this after figuring out that the itkLabelMapToLabelImage (which 
worked) is actually part of the Review Code and is shipped with the ITK 
source, whereas the RGB variant comes from the package here:

http://www.insight-journal.org/browse/publication/176

Why isn't the RGB labeling part of the Review Source anyway?


Best regards,
Christian



Christian Werner wrote:
> Hi!
>
> I have implemented your suggestion. I now draw a white pixel into the 
> image that is produced by the LabelMapToRGBImageFilter. I also drawed 
> a black one next to the white one. Then I tried drawing all different 
> kinds of pixel. They are all visible and have the color they are set to.
>
> RGBImageType::Pointer debugImage = label2RGBImage->GetOutput();
> itk::Index<2> pixelIndex;
> pixelIndex[0] = 100; pixelIndex[1] = 100;
> RGBPixelType RGBValue;
> RGBValue[0] = RGBValue[1] = RGBValue[2] = 255;
> debugImage->SetPixel( pixelIndex, RGBValue );
>
> ...and the same way a black pixel next to the white
>
>
> Since LabelMapToLabelImage Filter yields an image where the labeling 
> is clearly visible in shades of grey, I do not know what to try 
> further, the RGBLabeler does not seem to produce anything, i.e. just 
> produces an empty image regardless of its input. No matter if I save 
> the image as .tif, .jpg or .bmp, the only thing I see now are my newly 
> generated test pixels or nothing, if I comment them out.
>
>
>
> Kishore Mosaliganti wrote:
>> Hi Christian,
>>
>> Before writing out the output image pointer, can you hard code to set
>> 1 pixel in the RGB image to [255, 255, 255] and another pixel to
>> [0,0,0] and see if the output is showing those pixels in different
>> colors.
>>
>> I am just wondering
>>
>> (i) if the thresholds you set are not giving you two different labels
>> and so everything is black.
>> (ii) The labels have low ranges in the RGB space.
>>
>>
>> Kishore
>>
>>
>> On Sun, Feb 28, 2010 at 5:56 PM, Christian Werner
>> <christian.werner at rwth-aachen.de> wrote:
>>  
>>> Yes, this RGBPixel Type makes sense... :)
>>>
>>> Unfortunately I am still fighting to get the 
>>> LabelMapToRGBImageFilter make
>>> its work. Now that I fiddled around with this without success I 
>>> tried the
>>> LabelMapToLabelImageFilter for a change and voila: that worked with 
>>> exactly
>>> the same style of code! I am getting a labeled image with my objects 
>>> painted
>>> in all shades of grey. But when using the RGB labeling I get black 
>>> void.
>>>
>>> I attached my code, maybe I am blind or still misunderstand 
>>> something, but I
>>> really don't know how to fix this.
>>>
>>> Best regards,
>>> Christian
>>>
>>>
>>>
>>>
>>> Gaëtan Lehmann wrote:
>>>    
>>>> Hi Christian,
>>>>
>>>> The output pixel type must be a RGBPixel. See an example at
>>>>
>>>>
>>>>  http://public.kitware.com/cgi-bin/viewcvs.cgi/Testing/Code/Review/itkLabelToRGBImageFilterTest.cxx?revision=1.3&root=Insight&view=markup 
>>>>
>>>>
>>>> Regards,
>>>>
>>>> Gaëtan
>>>>
>>>>
>>>> Le 28 févr. 10 à 15:38, Christian Werner a écrit :
>>>>
>>>>      
>>>>> Hello!
>>>>>
>>>>> Thanks for your reply. The itk:: prefix indeed helped me getting a 
>>>>> few
>>>>> lines further. Now I get errors when I want to instantiate a
>>>>> LabelToRGBImageType. I have attached my little program. Its simple 
>>>>> purpose
>>>>> is to do some thresholding and then display all ojects in color 
>>>>> and save the
>>>>> resulting file. It would be nice if you could help me here.
>>>>>
>>>>> The following errors all come from the very last line in the code 
>>>>> before
>>>>> everything else is commented out.
>>>>>
>>>>>
>>>>> /opt/InsightToolkit-3.16.0/Code/Review/itkLabelToRGBFunctor.h: In
>>>>> constructor ‘itk::Functor::LabelToRGBFunctor<TLabel,
>>>>> TRGBPixel>::LabelToRGBFunctor() [with TLabel = unsigned int, 
>>>>> TRGBPixel =
>>>>> unsigned char]’:
>>>>> /home/christian/programming/itk/labeling/itkLabelMapToRGBImageFilter.cxx:42: 
>>>>>
>>>>>   instantiated from ‘void itk::LabelMapToRGBImageFilter<TInputImage,
>>>>> TOutputImage>::BeforeThreadedGenerateData() [with TInputImage =
>>>>> itk::LabelMap<itk::ShapeLabelObject<unsigned int, 2u> >, 
>>>>> TOutputImage =
>>>>> itk::Image<unsigned char, 2u>]’
>>>>>  /home/christian/programming/itk/labeling/testITK.cxx:75:   
>>>>> instantiated
>>>>> from here
>>>>>  /opt/InsightToolkit-3.16.0/Code/Review/itkLabelToRGBFunctor.h:51: 
>>>>> error:
>>>>> ‘unsigned char’ is not a class, struct, or union type
>>>>>
>>>>> /home/christian/programming/itk/labeling/itkLabelMapToRGBImageFilter.cxx:42: 
>>>>>
>>>>>   instantiated from ‘void itk::LabelMapToRGBImageFilter<TInputImage,
>>>>> TOutputImage>::BeforeThreadedGenerateData() [with TInputImage =
>>>>> itk::LabelMap<itk::ShapeLabelObject<unsigned int, 2u> >, 
>>>>> TOutputImage =
>>>>> itk::Image<unsigned char, 2u>]’
>>>>> /home/christian/programming/itk/labeling/testITK.cxx:75:   
>>>>> instantiated
>>>>> from here
>>>>> /opt/InsightToolkit-3.16.0/Code/Review/itkLabelToRGBFunctor.h:98: 
>>>>> error:
>>>>> request for member ‘Fill’ in 
>>>>> ‘((itk::Functor::LabelToRGBFunctor<unsigned
>>>>> int, unsigned 
>>>>> char>*)this)->itk::Functor::LabelToRGBFunctor<unsigned int,
>>>>> unsigned char>::m_BackgroundColor’, which is of non-class type 
>>>>> ‘unsigned
>>>>> char’
>>>>> /opt/InsightToolkit-3.16.0/Code/Review/itkLabelToRGBFunctor.h:98: 
>>>>> error:
>>>>> ‘unsigned char’ is not a class, struct, or union type
>>>>> /opt/InsightToolkit-3.16.0/Code/Review/itkLabelToRGBFunctor.h:50:
>>>>> warning: unused variable ‘rgbPixel’
>>>>> /opt/InsightToolkit-3.16.0/Code/Review/itkLabelToRGBFunctor.h: In 
>>>>> member
>>>>> function ‘void itk::Functor::LabelToRGBFunctor<TLabel,
>>>>> TRGBPixel>::AddColor(unsigned char, unsigned char, unsigned char) 
>>>>> [with
>>>>> TLabel = unsigned int, TRGBPixel = unsigned char]’:
>>>>> /opt/InsightToolkit-3.16.0/Code/Review/itkLabelToRGBFunctor.h:65:
>>>>> instantiated from ‘itk::Functor::LabelToRGBFunctor<TLabel,
>>>>> TRGBPixel>::LabelToRGBFunctor() [with TLabel = unsigned int, 
>>>>> TRGBPixel =
>>>>> unsigned char]’
>>>>>
>>>>> /home/christian/programming/itk/labeling/itkLabelMapToRGBImageFilter.cxx:42: 
>>>>>
>>>>>   instantiated from ‘void itk::LabelMapToRGBImageFilter<TInputImage,
>>>>> TOutputImage>::BeforeThreadedGenerateData() [with TInputImage =
>>>>> itk::LabelMap<itk::ShapeLabelObject<unsigned int, 2u> >, 
>>>>> TOutputImage =
>>>>> itk::Image<unsigned char, 2u>]’
>>>>> /home/christian/programming/itk/labeling/testITK.cxx:75:   
>>>>> instantiated
>>>>> from here
>>>>> /opt/InsightToolkit-3.16.0/Code/Review/itkLabelToRGBFunctor.h:118: 
>>>>> error:
>>>>> ‘unsigned char’ is not a class, struct, or union type
>>>>> /opt/InsightToolkit-3.16.0/Code/Review/itkLabelToRGBFunctor.h:122: 
>>>>> error:
>>>>> request for member ‘Set’ in ‘rgbPixel’, which is of non-class type 
>>>>> ‘unsigned
>>>>> char’
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> Gaëtan Lehmann wrote:
>>>>>        
>>>>>> Le 27 févr. 10 à 22:59, Christian Werner a écrit :
>>>>>>
>>>>>>          
>>>>>>> Hi!
>>>>>>>
>>>>>>> Yes, USE_REVIEW is on I am sure about that since I already built 
>>>>>>> some
>>>>>>> libraries. I am using Debian Lenny and gcc 4.4.3. But maybe it 
>>>>>>> is only
>>>>>>> because I misunderstand something.
>>>>>>>
>>>>>>> I see that I need label objects anyway, so it does not harm if I
>>>>>>> include them in my own code. But I was really confused about 
>>>>>>> getting errors
>>>>>>> when just including a single header. Shouldn't this header take 
>>>>>>> care of his
>>>>>>> own dependencies?
>>>>>>>
>>>>>>> Anyway, these 3 lines are the very beginning of my labeling try and
>>>>>>> these already produce errors:
>>>>>>>
>>>>>>> typedef itk::Image< unsigned char,  2 >   InputImageType;
>>>>>>> ...
>>>>>>> 56  typedef ShapeLabelObject<unsigned char, 2> LabelObjectType;
>>>>>>> 57  typedef LabelMap< LabelObjectType >        LabelMapType;
>>>>>>>             
>>>>>> shouldn't you add the itk:: prefix to those typedefs?
>>>>>>
>>>>>> typedef itk::ShapeLabelObject<unsigned char, 2> LabelObjectType;
>>>>>> typedef LabelMap< LabelObjectType >        LabelMapType;
>>>>>>
>>>>>> a few other notes:
>>>>>>
>>>>>> * you may be careful about the type used to store the labels - 
>>>>>> unsigned
>>>>>> char is likely to become quickly unable to store all the labels 
>>>>>> in your
>>>>>> image
>>>>>> * when using ShapeLabelObject, it is convenient to use
>>>>>> BinaryImageToShapeLabelMapFilter instead of 
>>>>>> BinaryImageToLabelMapFilter: the
>>>>>> attribute values are computed with a single filter, and it can be 
>>>>>> declared
>>>>>> simply as
>>>>>>
>>>>>>  typedef itk::BinaryImageToLabelMapFilter<InputImageType>
>>>>>> ImageToLabelType;
>>>>>>
>>>>>> without much type declaration.
>>>>>>
>>>>>> Gaëtan
>>>>>>
>>>>>>          
>>>>>>> 58  typedef itk::BinaryImageToLabelMapFilter<InputImageType,
>>>>>>> LabelMapType> ImageToLabelType;
>>>>>>> 59  //2)
>>>>>>> 60  ImageToLabelType::Pointer image2LabelMap = 
>>>>>>> ImageToLabelType::New();
>>>>>>>
>>>>>>> Compiler Errors:
>>>>>>> /home/christian/programming/itk/labeling/testITK.cxx: In 
>>>>>>> function ‘int
>>>>>>> main(int, char**)’:
>>>>>>> /home/christian/programming/itk/labeling/testITK.cxx:56: error:
>>>>>>> expected initializer before ‘<’ token
>>>>>>> /home/christian/programming/itk/labeling/testITK.cxx:57: error:
>>>>>>> expected initializer before ‘<’ token
>>>>>>> /home/christian/programming/itk/labeling/testITK.cxx:58: error:
>>>>>>> ‘LabelMapType’ was not declared in this scope
>>>>>>> /home/christian/programming/itk/labeling/testITK.cxx:58: error:
>>>>>>> template argument 2 is invalid
>>>>>>> /home/christian/programming/itk/labeling/testITK.cxx:58: error: 
>>>>>>> invalid
>>>>>>> type in declaration before ‘;’ token
>>>>>>> /home/christian/programming/itk/labeling/testITK.cxx:60: error:
>>>>>>> expected initializer before ‘image2LabelMap’
>>>>>>>
>>>>>>> Maybe I don't get this labeling right... ?
>>>>>>>
>>>>>>> This is what I include now:
>>>>>>>
>>>>>>> #include "itkImageToImageFilter.h"
>>>>>>> #include "itkShapeLabelObject.h"
>>>>>>> #include "itkLabelMap.h"
>>>>>>> #include "itkBinaryImageToLabelMapFilter.h"
>>>>>>> #include "itkLabelMapToRGBImageFilter.h"
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> Bill Lorensen wrote:
>>>>>>>            
>>>>>>>> When you configured ITK did you build with USE_REVIEW ON?
>>>>>>>>
>>>>>>>> If so, what platform/compiler are you using?
>>>>>>>>
>>>>>>>> Bill
>>>>>>>>
>>>>>>>> On Sat, Feb 27, 2010 at 2:24 PM, Christian Werner
>>>>>>>> <christian.werner at rwth-aachen.de> wrote:
>>>>>>>>
>>>>>>>>              
>>>>>>>>> Hello!
>>>>>>>>>
>>>>>>>>> I am off to make some serious object labling and manipulation.
>>>>>>>>> Unfortunately
>>>>>>>>> some very basic code does not compile:
>>>>>>>>>
>>>>>>>>> #include "itkBinaryImageToLabelMapFilter.h"
>>>>>>>>> int main( int argc, char * argv[] )
>>>>>>>>> {
>>>>>>>>> }
>>>>>>>>>
>>>>>>>>> christian at trinity:~/programming/itk/labeling/bin$ make -j2
>>>>>>>>> Scanning dependencies of target testITK
>>>>>>>>> [100%] Building CXX object CMakeFiles/testITK.dir/testITK.o
>>>>>>>>> In file included from
>>>>>>>>> /home/christian/programming/itk/labeling/testITK.cxx:2:
>>>>>>>>>
>>>>>>>>> /opt/InsightToolkit-3.16.0/Code/Review/itkBinaryImageToLabelMapFilter.h:54: 
>>>>>>>>>
>>>>>>>>> error: expected type-specifier before ‘LabelMap’
>>>>>>>>>
>>>>>>>>> /opt/InsightToolkit-3.16.0/Code/Review/itkBinaryImageToLabelMapFilter.h:54: 
>>>>>>>>>
>>>>>>>>> error: expected ‘>’ before ‘LabelMap’
>>>>>>>>> make[2]: *** [CMakeFiles/testITK.dir/testITK.o] Error 1
>>>>>>>>> make[1]: *** [CMakeFiles/testITK.dir/all] Error 2
>>>>>>>>> make: *** [all] Error 2
>>>>>>>>>
>>>>>>>>> I can fix this, when I edit (and this already feels bad) the
>>>>>>>>> itkBinaryImageToLabelMapFilter.h by adding
>>>>>>>>>
>>>>>>>>> #include "itkLabelMap.h"
>>>>>>>>> #include "itkLabelObject.h"
>>>>>>>>>
>>>>>>>>> The above code compiles this way. However if I actually use some
>>>>>>>>> functions
>>>>>>>>> out of the itkBinaryImageToLabelMapFilter.h I get errors over 
>>>>>>>>> errors.
>>>>>>>>>
>>>>>>>>> My CMakeLists looks like this:
>>>>>>>>>
>>>>>>>>> cmake_minimum_required(VERSION 2.4)
>>>>>>>>>
>>>>>>>>> PROJECT(testITK)
>>>>>>>>>
>>>>>>>>> FIND_PACKAGE(ITK REQUIRED)
>>>>>>>>> IF(ITK_FOUND)
>>>>>>>>> INCLUDE(${ITK_USE_FILE})
>>>>>>>>> ENDIF(ITK_FOUND)
>>>>>>>>>
>>>>>>>>> ADD_EXECUTABLE(testITK testITK.cxx)
>>>>>>>>>
>>>>>>>>> TARGET_LINK_LIBRARIES(testITK ITKCommon ITKIO ITKBasicFilters
>>>>>>>>> ITKStatistics)
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> General ITK programming works without trouble. I must be doing
>>>>>>>>> something
>>>>>>>>> totally wrong, any suggestions?
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Best regards,
>>>>>>>>> Christian
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> _____________________________________
>>>>>>>>> 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
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>                 
>>>>>>> _____________________________________
>>>>>>> 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
>>>>>>>             
>>>>> #include "itkImage.h"
>>>>> #include "itkImageFileReader.h"
>>>>> #include "itkImageFileWriter.h"
>>>>>
>>>>> #include "itkBinaryThresholdImageFilter.h"
>>>>>
>>>>> #include "itkImageToImageFilter.h"
>>>>> #include "itkShapeLabelObject.h"
>>>>> #include "itkLabelMap.h"
>>>>> #include "itkBinaryImageToLabelMapFilter.h"
>>>>> #include "itkLabelMapToRGBImageFilter.h"
>>>>>
>>>>> int main( int argc, char * argv[] )
>>>>> {
>>>>>  if( argc < 5 )
>>>>>   {
>>>>>   std::cerr << "Usage: " << argv[0];
>>>>>   std::cerr << " inputImageFile outputImageFile ";
>>>>>   std::cerr << " lowerThreshold upperThreshold " << std::endl;
>>>>>   //std::cerr << " outsideValue insideValue   "  << std::endl;
>>>>>   return EXIT_FAILURE;
>>>>>   }
>>>>>
>>>>>  typedef  unsigned char  InputPixelType;
>>>>>  typedef  unsigned char  OutputPixelType;
>>>>>  typedef itk::Image< InputPixelType,  2 >   InputImageType;
>>>>>  typedef itk::Image< OutputPixelType, 2 >   OutputImageType;
>>>>>  typedef itk::BinaryThresholdImageFilter<
>>>>>              InputImageType, OutputImageType >  FilterType;
>>>>>  typedef itk::ImageFileReader< InputImageType >  ReaderType;
>>>>>  typedef itk::ImageFileWriter< OutputImageType >  WriterType;
>>>>>
>>>>>  ReaderType::Pointer reader = ReaderType::New();
>>>>>  FilterType::Pointer filter = FilterType::New();
>>>>>
>>>>>  reader->SetFileName( argv[1] );
>>>>>
>>>>>  /// filtering
>>>>>  filter->SetInput( reader->GetOutput() );
>>>>>  const OutputPixelType outsideValue = 0;
>>>>>  const OutputPixelType insideValue  = 255;
>>>>>  filter->SetOutsideValue( outsideValue );
>>>>>  filter->SetInsideValue(  insideValue  );
>>>>>  const InputPixelType lowerThreshold = atoi(argv[3]);
>>>>>  const InputPixelType upperThreshold = atoi(argv[4]);
>>>>>
>>>>>  filter->SetLowerThreshold( lowerThreshold );
>>>>>  filter->SetUpperThreshold( upperThreshold );
>>>>>  // Software Guide : EndCodeSnippet
>>>>>
>>>>>  filter->Update();
>>>>>
>>>>>  /// labeling
>>>>>  //1)
>>>>>  typedef itk::ShapeLabelObject<unsigned int, 2> LabelObjectType;
>>>>>  typedef itk::LabelMap< LabelObjectType >       LabelMapType;
>>>>>  typedef itk::BinaryImageToLabelMapFilter<InputImageType, 
>>>>> LabelMapType>
>>>>> ImageToLabelType;
>>>>>  typedef itk::LabelMapToRGBImageFilter<LabelMapType, OutputImageType>
>>>>> LabelToRGBImageType;
>>>>>  //2)
>>>>>  ImageToLabelType::Pointer image2LabelMap    = 
>>>>> ImageToLabelType::New();
>>>>>  LabelToRGBImageType::Pointer label2RGBImage =
>>>>> LabelToRGBImageType::New();
>>>>>  //image2LabelMap->SetInput( filter->getOutput() );
>>>>>  //label2RGBImage->SetInput( image2LabelMap->getOutput() );
>>>>>
>>>>>  ///save result image
>>>>>  //WriterType::Pointer writer = WriterType::New();
>>>>>  //writer->SetInput( label2RGBImage->GetOutput() );
>>>>>  //writer->SetFileName( argv[2] );
>>>>>  //writer->Update();
>>>>>
>>>>>  return EXIT_SUCCESS;
>>>>> }
>>>>> _____________________________________
>>>>> 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
>>>>>         
>>> _____________________________________
>>> 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
>>>
>>>
>>>     
>
> _____________________________________
> 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