ITK/Examples/Broken/Statistics/ImageToHistogramFilter: Difference between revisions

From KitwarePublic
< ITK‎ | Examples
Jump to navigationJump to search
mNo edit summary
mNo edit summary
Line 1: Line 1:
The last entry of the red histogram should contain several values, but it is 0?
Iterator not increasing over the second two components?


==ImageToHistogramFilter.cxx==
==ImageToHistogramFilter.cxx==
Line 7: Line 7:
#include "itkRGBPixel.h"
#include "itkRGBPixel.h"
#include "itkImageRegionIteratorWithIndex.h"
#include "itkImageRegionIteratorWithIndex.h"
#include <fstream>


typedef itk::RGBPixel<unsigned char> RGBPixelType;
typedef itk::RGBPixel<unsigned char> RGBPixelType;
Line 22: Line 24:
   typedef itk::Statistics::ImageToHistogramFilter< RGBImageType >        HistogramFilterType;
   typedef itk::Statistics::ImageToHistogramFilter< RGBImageType >        HistogramFilterType;
   typedef HistogramFilterType::HistogramMeasurementVectorType            HistogramMeasurementVectorType;
   typedef HistogramFilterType::HistogramMeasurementVectorType            HistogramMeasurementVectorType;
  typedef HistogramFilterType::InputHistogramMeasurementVectorObjectType  InputHistogramMeasurementVectorObjectType;
  typedef HistogramFilterType::InputBooleanObjectType                    InputBooleanObjectType;
   typedef HistogramFilterType::HistogramSizeType                          HistogramSizeType;
   typedef HistogramFilterType::HistogramSizeType                          HistogramSizeType;
   typedef HistogramFilterType::HistogramType                              HistogramType;
   typedef HistogramFilterType::HistogramType                              HistogramType;
Line 34: Line 34:


   histogramSize[0] = 256;  // number of bins for the Red  channel
   histogramSize[0] = 256;  // number of bins for the Red  channel
   histogramSize[1] =   1;  // number of bins for the Green channel
   histogramSize[1] = 256;  // number of bins for the Green channel
   histogramSize[2] =   1;  // number of bins for the Blue  channel
   histogramSize[2] = 256;  // number of bins for the Blue  channel


   // Compute the bounds of the histrogram automatically
   // Compute the bounds of the histrogram automatically
   filter->SetHistogramSize(histogramSize);
   filter->SetHistogramSize(histogramSize);
   filter->SetMarginalScale(10); // What is this?
   filter->SetMarginalScale(10); // Required (could this be set in the filter?)
   filter->Update();
   filter->Update();


   const HistogramType * histogram = filter->GetOutput();
   const HistogramType * histogram = filter->GetOutput();


   std::cout << "Histogram of the red component" << std::endl;
  HistogramType::ConstIterator histogramItr = histogram->Begin();
   for(unsigned int i = 0; i < histogramSize[0]; i++)
 
   std::string filename = "/home/doriad/histogram.txt";
  std::ofstream fout(filename.c_str());
 
   while( histogramItr != histogram->End() )
     {
     {
     std::cout << histogram->GetFrequency(i, 0) << " "; // Red channel
     //std::cout << "Index = " << histogram->GetIndex(histogramItr.GetMeasurementVector()) << "Frequency = " << histogramItr.GetFrequency() << std::endl;
    fout << "Index = " << histogram->GetIndex(histogramItr.GetMeasurementVector()) << "Frequency = " << histogramItr.GetFrequency() << std::endl;
    ++histogramItr;
     }
     }
   std::cout << std::endl;
  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;
   return EXIT_SUCCESS;
}
}
Line 57: Line 69:
   // Create a black image with a red square and a green square.
   // Create a black image with a red square and a green square.
   // This should produce a histogram with very strong spikes.
   // This should produce a histogram with very strong spikes.
  RGBImageType::RegionType region;
   RGBImageType::SizeType  size;
   RGBImageType::SizeType  size;
  size[0] = 3;
  size[1] = 3;
   RGBImageType::IndexType  start;
   RGBImageType::IndexType  start;
  size[0] = 127;
  size[1] = 127;
   start[0] = 0;
   start[0] = 0;
   start[1] = 0;
   start[1] = 0;


  RGBImageType::RegionType region;
   region.SetIndex(start);
   region.SetIndex(start);
   region.SetSize(size);
   region.SetSize(size);
Line 76: Line 87:
   iterator.GoToBegin();
   iterator.GoToBegin();


   RGBPixelType pixel;
   RGBPixelType redPixel;
   RGBImageType::IndexType index;
   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(!iterator.IsAtEnd())
   while(!imageIterator.IsAtEnd())
     {
     {
     index = iterator.GetIndex();
     imageIterator.Set(blackPixel);
    if(index[0] < 70 && index[0] > 50 && index[1] > 50 && index[1] < 70)
     ++imageIterator;
      {
     }
      pixel.SetRed(255);
      pixel.SetGreen(0);
      pixel.SetBlue(0);
      iterator.Set(pixel);
      }
     else if(index[0] < 110 && index[0] > 100 && index[1] > 100 && index[1] < 110)
      {
      pixel.SetRed(0);
      pixel.SetGreen(255);
      pixel.SetBlue(0);
      iterator.Set(pixel);
      }
     else
      {
      pixel.SetRed(0);
      pixel.SetGreen(0);
      pixel.SetBlue(0);
      iterator.Set(pixel);
      }


    ++iterator;
  RGBImageType::IndexType index;
    }
  index[0] = 0; index[1] = 0;
  image->SetPixel(index, redPixel);
 
  index[0] = 1; index[1] = 0;
  image->SetPixel(index, redPixel); 
}
}
</source>
</source>

Revision as of 20:27, 15 November 2010

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>