ITK/Examples/Broken/Statistics/ImageToHistogramFilter: Difference between revisions
From KitwarePublic
Jump to navigationJump to search
Daviddoria (talk | contribs) mNo edit summary |
Daviddoria (talk | contribs) mNo edit summary |
||
Line 1: | Line 1: | ||
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::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] = | histogramSize[1] = 256; // number of bins for the Green channel | ||
histogramSize[2] = | 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); // | 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:: | HistogramType::ConstIterator histogramItr = histogram->Begin(); | ||
std::string filename = "/home/doriad/histogram.txt"; | |||
std::ofstream fout(filename.c_str()); | |||
while( histogramItr != histogram->End() ) | |||
{ | { | ||
std::cout << histogram->GetFrequency( | //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::SizeType size; | RGBImageType::SizeType size; | ||
size[0] = 3; | |||
size[1] = 3; | |||
RGBImageType::IndexType start; | RGBImageType::IndexType start; | ||
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 | 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(! | 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> | </source> |
Revision as of 20:27, 15 November 2010
Iterator not increasing over the second two components?
ImageToHistogramFilter.cxx
<source lang="cpp">
- include "itkImageToHistogramFilter.h"
- include "itkImage.h"
- include "itkRGBPixel.h"
- include "itkImageRegionIteratorWithIndex.h"
- 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>