ITK/Examples/Broken/Statistics/ImageToHistogramFilter

From KitwarePublic
< ITK‎ | Examples
Revision as of 20:27, 15 November 2010 by Daviddoria (talk | contribs)
Jump to navigationJump to search

Iterator not increasing over the second two components?

ImageToHistogramFilter.cxx

<source lang="cpp">

  1. include "itkImageToHistogramFilter.h"
  2. include "itkImage.h"
  3. include "itkRGBPixel.h"
  4. include "itkImageRegionIteratorWithIndex.h"
  1. include <fstream>

typedef itk::RGBPixel<unsigned char> RGBPixelType; typedef itk::Image< RGBPixelType, 2> RGBImageType;

void CreateImage(RGBImageType::Pointer image);

int main(int, char *[]) {

 const unsigned int MeasurementVectorSize = 3; // RGB
 RGBImageType::Pointer image = RGBImageType::New();
 CreateImage(image);
 typedef itk::Statistics::ImageToHistogramFilter< RGBImageType >         HistogramFilterType;
 typedef HistogramFilterType::HistogramMeasurementVectorType             HistogramMeasurementVectorType;
 typedef HistogramFilterType::HistogramSizeType                          HistogramSizeType;
 typedef HistogramFilterType::HistogramType                              HistogramType;
 HistogramFilterType::Pointer filter = HistogramFilterType::New();
 filter->SetInput(image);
 filter->SetAutoMinimumMaximum(true);
 HistogramSizeType histogramSize( MeasurementVectorSize );
 histogramSize[0] = 256;  // number of bins for the Red   channel
 histogramSize[1] = 256;  // number of bins for the Green channel
 histogramSize[2] = 256;  // number of bins for the Blue  channel
 // Compute the bounds of the histrogram automatically
 filter->SetHistogramSize(histogramSize);
 filter->SetMarginalScale(10); // Required (could this be set in the filter?)
 filter->Update();
 const HistogramType * histogram = filter->GetOutput();
 HistogramType::ConstIterator histogramItr = histogram->Begin();
 std::string filename = "/home/doriad/histogram.txt";
 std::ofstream fout(filename.c_str());
 while( histogramItr != histogram->End() )
   {
   //std::cout << "Index = " << histogram->GetIndex(histogramItr.GetMeasurementVector()) << "Frequency = " << histogramItr.GetFrequency() << std::endl;
   fout << "Index = " << histogram->GetIndex(histogramItr.GetMeasurementVector()) << "Frequency = " << histogramItr.GetFrequency() << std::endl;
   ++histogramItr;
   }
 fout.close();
 
 HistogramType::MeasurementVectorType mv(3);
 mv[0] = 255;
 mv[1] = 0;
 mv[2] = 0;
 std::cout << "Frequency = " << histogram->GetFrequency(histogram->GetIndex(mv)) << std::endl;
 return EXIT_SUCCESS;

}

void CreateImage(RGBImageType::Pointer image) {

 // Create a black image with a red square and a green square.
 // This should produce a histogram with very strong spikes.
 RGBImageType::SizeType   size;
 size[0] = 3;
 size[1] = 3;
 RGBImageType::IndexType  start;
 start[0] = 0;
 start[1] = 0;
 RGBImageType::RegionType region;
 region.SetIndex(start);
 region.SetSize(size);
 image->SetRegions(region);
 image->Allocate();
 itk::ImageRegionIteratorWithIndex< RGBImageType > iterator( image, image->GetLargestPossibleRegion() );
 iterator.GoToBegin();
 RGBPixelType redPixel;
 redPixel.SetRed(255);
 redPixel.SetGreen(0);
 redPixel.SetBlue(0);
 RGBPixelType blackPixel;
 blackPixel.SetRed(0);
 blackPixel.SetGreen(0);
 blackPixel.SetBlue(0);
 itk::ImageRegionIterator<RGBImageType> imageIterator(image,region);
 while(!imageIterator.IsAtEnd())
   {
   imageIterator.Set(blackPixel);
   ++imageIterator;
   }
 RGBImageType::IndexType index;
 index[0] = 0; index[1] = 0;
 image->SetPixel(index, redPixel);
 index[0] = 1; index[1] = 0;
 image->SetPixel(index, redPixel);  

} </source>

CMakeLists.txt

<source lang="cmake"> cmake_minimum_required(VERSION 2.6)

PROJECT(ImageToHistogramFilter)

FIND_PACKAGE(ITK REQUIRED) INCLUDE(${ITK_USE_FILE})

ADD_EXECUTABLE(ImageToHistogramFilter ImageToHistogramFilter.cxx) TARGET_LINK_LIBRARIES(ImageToHistogramFilter ITKBasicFilters ITKCommon ITKIO ITKStatistics)

</source>