Difference between revisions of "ITK/Examples/WishList/Statistics/MaskedImageToHistogramFilter"

From KitwarePublic
< ITK‎ | Examples
Jump to: navigation, search
(Deprecated content that is moved to sphinx)
 
Line 1: Line 1:
The regular (non-masked) ImageToHistogramFilter has some problems, so no sense in trying this until those are resolved.
+
{{warning|1=The media wiki content on this page is no longer maintainedThe examples presented on the https://itk.org/Wiki/* pages likely require ITK version 4.13 or earlier releasesIn many cases, the examples on this page no longer conform to the best practices for modern ITK versions.}}
 
 
==MaskedImageToHistogramFilter.cxx==
 
<source lang="cpp">
 
#include "itkMaskedImageToHistogramFilter.h"
 
#include "itkImage.h"
 
#include "itkImageFileWriter.h"
 
#include "itkRGBPixel.h"
 
#include "itkImageRegionIteratorWithIndex.h"
 
#include "itkImageRegionIterator.h"
 
#include "itkRescaleIntensityImageFilter.h"
 
 
 
typedef itk::RGBPixel<unsigned char> RGBPixelType;
 
typedef itk::Image< RGBPixelType, 2> RGBImageType;
 
 
 
typedef itk::Image< unsigned char, 2> UnsignedCharImageType;
 
 
 
static void CreateImage(RGBImageType::Pointer image);
 
static void CreateHalfMask(itk::ImageRegion<2>, UnsignedCharImageType::Pointer mask);
 
 
 
int main(int, char *[])
 
{
 
  const unsigned int MeasurementVectorSize = 3; // RGB
 
 
 
  RGBImageType::Pointer image = RGBImageType::New();
 
  CreateImage(image);
 
 
 
  UnsignedCharImageType::Pointer mask = UnsignedCharImageType::New();
 
  CreateHalfMask(image->GetLargestPossibleRegion(), mask);
 
 
 
  typedef itk::Statistics::MaskedImageToHistogramFilter< RGBImageType, UnsignedCharImageType >  HistogramFilterType;
 
  typedef HistogramFilterType::HistogramMeasurementVectorType            HistogramMeasurementVectorType;
 
  typedef HistogramFilterType::HistogramSizeType                          HistogramSizeType;
 
  typedef HistogramFilterType::HistogramType                              HistogramType;
 
 
 
  HistogramFilterType::Pointer histogramFilter = HistogramFilterType::New();
 
  histogramFilter->SetInput(image);
 
  histogramFilter->SetMaskImage(mask);
 
  histogramFilter->SetAutoMinimumMaximum(true);
 
 
 
  HistogramSizeType histogramSize( MeasurementVectorSize );
 
 
 
  histogramSize[0] = 4;  // number of bins for the Red  channel
 
  histogramSize[1] = 4;  // number of bins for the Green channel
 
  histogramSize[2] = 4;  // number of bins for the Blue  channel
 
 
 
  histogramFilter->SetHistogramSize(histogramSize);
 
  histogramFilter->SetMarginalScale(10); // Required (could this be set in the filter?)
 
  histogramFilter->Update();
 
 
 
  const HistogramType * histogram = histogramFilter->GetOutput();
 
 
 
  HistogramType::ConstIterator histogramIterator = histogram->Begin();
 
 
 
  //std::string filename = "/home/doriad/histogram.txt";
 
  //std::ofstream fout(filename.c_str());
 
 
 
  while( histogramIterator != histogram->End() )
 
    {
 
    //std::cout << "Index = " << histogramIterator.GetMeasurementVector() << "Frequency = " << histogramIterator.GetFrequency() << std::endl;
 
    //std::cout << "Index = " << histogramIterator.GetIndex() << "Frequency = " << histogramIterator.GetFrequency() << std::endl;
 
    //fout << "Index = " << histogram->GetIndex(histogramItr.GetMeasurementVector()) << "Frequency = " << histogramItr.GetFrequency() << std::endl;
 
    ++histogramIterator ;
 
    }
 
  //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);
 
}
 
 
 
void CreateHalfMask(itk::ImageRegion<2> region, UnsignedCharImageType::Pointer mask)
 
{
 
  mask->SetRegions(region);
 
  mask->Allocate();
 
  mask->FillBuffer(0);
 
 
  itk::Size<2> regionSize = region.GetSize();
 
 
  itk::ImageRegionIterator<UnsignedCharImageType> imageIterator(mask,region);
 
 
  // Make the left half of the mask white and the right half black
 
  while(!imageIterator.IsAtEnd())
 
  {
 
    if(imageIterator.GetIndex()[0] > regionSize[0] / 2)
 
        {
 
        imageIterator.Set(0);
 
        }
 
      else
 
        {
 
        imageIterator.Set(1);
 
        }
 
 
    ++imageIterator;
 
  }
 
 
  typedef itk::RescaleIntensityImageFilter< UnsignedCharImageType, UnsignedCharImageType > RescaleFilterType;
 
  RescaleFilterType::Pointer rescaleFilter = RescaleFilterType::New();
 
  rescaleFilter->SetInput(mask);
 
  rescaleFilter->Update();
 
 
  typedef  itk::ImageFileWriter< UnsignedCharImageType  > WriterType;
 
  WriterType::Pointer writer = WriterType::New();
 
  writer->SetFileName("mask.png");
 
  writer->SetInput(rescaleFilter->GetOutput());
 
  writer->Update();
 
 
}
 
 
 
 
 
</source>
 
 
 
{{ITKCMakeLists|{{SUBPAGENAME}}}}
 

Latest revision as of 17:42, 7 June 2019

Warning: The media wiki content on this page is no longer maintained. The examples presented on the https://itk.org/Wiki/* pages likely require ITK version 4.13 or earlier releases. In many cases, the examples on this page no longer conform to the best practices for modern ITK versions.