File: itkHistogramToImageFilter.h

package info (click to toggle)
insighttoolkit 3.18.0-5
  • links: PTS, VCS
  • area: main
  • in suites: squeeze
  • size: 110,432 kB
  • ctags: 74,559
  • sloc: cpp: 412,627; ansic: 196,210; fortran: 28,000; python: 3,852; tcl: 2,005; sh: 1,186; java: 583; makefile: 458; csh: 220; perl: 193; xml: 20
file content (182 lines) | stat: -rw-r--r-- 6,571 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
/*=========================================================================

  Program:   Insight Segmentation & Registration Toolkit
  Module:    $RCSfile: itkHistogramToImageFilter.h,v $
  Language:  C++
  Date:      $Date: 2009-04-06 11:51:06 $
  Version:   $Revision: 1.10 $

  Copyright (c) Insight Software Consortium. All rights reserved.
  See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details.

     This software is distributed WITHOUT ANY WARRANTY; without even 
     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
     PURPOSE.  See the above copyright notices for more information.

=========================================================================*/
#ifndef __itkHistogramToImageFilter_h
#define __itkHistogramToImageFilter_h

#include "itkImageSource.h"
#include "itkConceptChecking.h"
#include "itkHistogram.h"
#include "itkImage.h"
#include "itkImageRegionIteratorWithIndex.h"
#include "itkSimpleDataObjectDecorator.h"


namespace itk
{

/** \class HistogramToImageFilter
 *  \brief This class takes a histogram as an input and returns an image of
 *  type specified by the functor. 
 *
 *  The dimension of the image is equal to the size of each measurement
 *  vector of the histogram. The size in the image along each dimension will be 
 *  equal to the number of bins along each dimension of the histogram.
 *
 *  The filter may be used in registration methods to plot the joint histogram
 *  after every iteration. A functor is used since it is customary to plot
 *  p log p    where p is the probability of each measurement vector 
 *  p is given by Number of occurances of the measurement vector / total number 
 *  of occurances of all measurement vectors.
 *
 *  \sa HistogramToProbabilityImageFilter, HistogramToLogProbabilityImageFilter,
 *  HistogramToIntensityImageFilter, HistogramToEntropyImageFilter
 *
 */

template <class THistogram, class TFunction>
class ITK_EXPORT HistogramToImageFilter :
  public ImageSource<Image< typename TFunction::OutputPixelType , 
  ::itk::Statistics::GetHistogramDimension<THistogram>::HistogramDimension> >
{
public:

  /** Standard class typedefs. */
  typedef TFunction                             FunctorType;
  typedef typename FunctorType::OutputPixelType OutputPixelType;
  typedef HistogramToImageFilter                Self;
  typedef ImageSource< Image<OutputPixelType, 
    ::itk::Statistics::GetHistogramDimension<THistogram>::HistogramDimension> >
    Superclass;
  typedef SmartPointer<Self>                   Pointer;
  typedef SmartPointer<const Self>             ConstPointer;
  
  typedef Image<OutputPixelType, 
    ::itk::Statistics::GetHistogramDimension<THistogram>::HistogramDimension >
    OutputImageType; 
  typedef typename Superclass::Pointer    OutputImagePointer;
  typedef typename OutputImageType::SpacingType SpacingType;
  typedef typename OutputImageType::PointType   PointType;

  
  // Define an iterator to iterate through the image
  typedef itk::ImageRegionIteratorWithIndex< Image<OutputPixelType, 
    ::itk::Statistics::GetHistogramDimension<THistogram>::HistogramDimension> >
                                                             ImageIteratorType;

  /** Method for creation through the object factory. */
  itkNewMacro(Self);
  
  /** Run-time type information (and related methods). */
  itkTypeMacro(HistogramToImageFilter,ImageSource);

  /** Superclass typedefs. */
  typedef typename Superclass::OutputImageRegionType OutputImageRegionType;

  /** Some convenient typedefs. */
  typedef THistogram                                     HistogramType;
  typedef typename HistogramType::MeasurementVectorType  MeasurementVectorType;
  typedef typename HistogramType::SizeType               HistogramSizeType;
  typedef typename HistogramType::SizeType               SizeType;

  /** Since histograms are not dataobjects, we use the decorator to push
   *  them down the pipeline */ 
  typedef SimpleDataObjectDecorator< HistogramType* > InputHistogramObjectType;
  
  /** Determine the image dimension. */
  itkStaticConstMacro(ImageDimension, unsigned int,
    ::itk::Statistics::GetHistogramDimension<THistogram>::HistogramDimension );
  
  /** Set/Get the input of this process object.  */
  virtual void SetInput( const HistogramType *histogram);
  virtual void SetInput( const InputHistogramObjectType *inputObject);
  const InputHistogramObjectType* GetInput(void);

                      
  /** Set the spacing (size of a pixel) of the image. 
   *  \sa GetSpacing() */
  itkSetMacro(Spacing,SpacingType);
  virtual void SetSpacing(const double* values);


  /** Get the spacing (size of a pixel) of the image. 
   * For ImageBase and Image, the default data spacing is unity. */
  itkGetConstReferenceMacro(Spacing,SpacingType);

  /** Set the origin of the image. 
   * \sa GetOrigin() */
  itkSetMacro(Origin,PointType);
  virtual void SetOrigin(const double* values);
 
 /** Get the origin of the image.  */
  itkGetConstReferenceMacro(Origin,PointType);

  /** Get the size of the histogram. */
  itkGetMacro(Size,HistogramSizeType);


  /** Set the functor object.  This replaces the current Functor with a
   * copy of the specified Functor. This allows the user to specify a
   * functor that has ivars set differently than the default functor.
   * This method requires an operator!=() be defined on the functor
   * (or the compiler's default implementation of operator!=() being
   * appropriate). */
  void SetFunctor(const FunctorType& functor)
    {
    m_Functor = functor;
    this->Modified();
    }
  /** Get the functor object.  The functor is returned by reference.
   * (Functors do not have to derive from itk::LightObject, so they do
   * not necessarily have a reference count. So we cannot return a
   * SmartPointer.) */
  FunctorType& GetFunctor() { return m_Functor; }
  const FunctorType& GetFunctor() const { return m_Functor; }
  
  void SetTotalFrequency( unsigned long n );
  

  
protected:
  HistogramToImageFilter();
  ~HistogramToImageFilter();

  virtual void GenerateOutputInformation();
  virtual void GenerateData();
  
  FunctorType m_Functor;
  
  SizeType        m_Size;
  SpacingType     m_Spacing;
  PointType       m_Origin;

  
  virtual void PrintSelf(std::ostream& os, Indent indent) const;

private:
  HistogramToImageFilter(const Self&); //purposely not implemented
  void operator=(const Self&); //purposely not implemented


};

} // end namespace itk

#ifndef ITK_MANUAL_INSTANTIATION
#include "itkHistogramToImageFilter.txx"
#endif

#endif