00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef __itkHistogramMatchingImageFilter_h
00018 #define __itkHistogramMatchingImageFilter_h
00019
00020 #include "itkImageToImageFilter.h"
00021 #include "itkHistogram.h"
00022 #include "vnl/vnl_matrix.h"
00023
00024 namespace itk
00025 {
00026
00059 template <class TInputImage, class TOutputImage>
00060 class ITK_EXPORT HistogramMatchingImageFilter:
00061 public ImageToImageFilter<TInputImage,TOutputImage>
00062 {
00063 public:
00065 typedef HistogramMatchingImageFilter Self;
00066 typedef ImageToImageFilter<TInputImage,TOutputImage> Superclass;
00067 typedef SmartPointer<Self> Pointer;
00068 typedef SmartPointer<const Self> ConstPointer;
00069
00071 itkNewMacro(Self);
00072
00074 itkTypeMacro(HistogramMatchingImageFilter, ImageToImageFilter);
00075
00077 itkStaticConstMacro(ImageDimension, unsigned int,
00078 TInputImage::ImageDimension);
00079
00081 typedef typename TOutputImage::RegionType OutputImageRegionType;
00082
00084 typedef typename Superclass::InputImageType InputImageType;
00085 typedef typename Superclass::InputImagePointer InputImagePointer;
00086 typedef typename Superclass::InputImageConstPointer InputImageConstPointer;
00087 typedef typename Superclass::OutputImageType OutputImageType;
00088 typedef typename Superclass::OutputImagePointer OutputImagePointer;
00089
00091 typedef typename InputImageType::PixelType InputPixelType;
00092 typedef typename OutputImageType::PixelType OutputPixelType;
00093
00095 typedef Statistics::Histogram<InputPixelType, 1> HistogramType;
00096 typedef typename HistogramType::Pointer HistogramPointer;
00097
00099 void SetSourceImage( const InputImageType * source )
00100 { this->SetInput( source ); }
00101 const InputImageType * GetSourceImage(void)
00102 { return this->GetInput(); }
00103
00105 void SetReferenceImage( const InputImageType * reference );
00106 const InputImageType * GetReferenceImage(void);
00107
00109 itkSetMacro( NumberOfHistogramLevels, unsigned long );
00110 itkGetMacro( NumberOfHistogramLevels, unsigned long );
00111
00113 itkSetMacro( NumberOfMatchPoints, unsigned long );
00114 itkGetMacro( NumberOfMatchPoints, unsigned long );
00115
00121 itkSetMacro( ThresholdAtMeanIntensity, bool );
00122 itkGetMacro( ThresholdAtMeanIntensity, bool );
00123 itkBooleanMacro( ThresholdAtMeanIntensity );
00124
00126 virtual void GenerateInputRequestedRegion();
00127
00131 itkGetObjectMacro(SourceHistogram, HistogramType);
00132 itkGetObjectMacro(ReferenceHistogram, HistogramType);
00133 itkGetObjectMacro(OutputHistogram, HistogramType);
00134
00135
00136 protected:
00137 HistogramMatchingImageFilter();
00138 ~HistogramMatchingImageFilter() {};
00139 void PrintSelf(std::ostream& os, Indent indent) const;
00140
00141 void BeforeThreadedGenerateData();
00142 void AfterThreadedGenerateData();
00143 void ThreadedGenerateData(const OutputImageRegionType& outputRegionForThread,
00144 int threadId );
00145
00147 void ComputeMinMaxMean( const InputImageType * image,
00148 double& minValue, double& maxValue, double& meanValue );
00149
00151 void ConstructHistogram( const InputImageType * image,
00152 HistogramType * histogram, double minValue,
00153 double maxValue );
00154
00155 private:
00156 HistogramMatchingImageFilter(const Self&);
00157 void operator=(const Self&);
00158
00159 unsigned long m_NumberOfHistogramLevels;
00160 unsigned long m_NumberOfMatchPoints;
00161 bool m_ThresholdAtMeanIntensity;
00162
00163 InputPixelType m_SourceIntensityThreshold;
00164 InputPixelType m_ReferenceIntensityThreshold;
00165 OutputPixelType m_OutputIntensityThreshold;
00166
00167 double m_SourceMinValue;
00168 double m_SourceMaxValue;
00169 double m_SourceMeanValue;
00170 double m_ReferenceMinValue;
00171 double m_ReferenceMaxValue;
00172 double m_ReferenceMeanValue;
00173 double m_OutputMinValue;
00174 double m_OutputMaxValue;
00175 double m_OutputMeanValue;
00176
00177 HistogramPointer m_SourceHistogram;
00178 HistogramPointer m_ReferenceHistogram;
00179 HistogramPointer m_OutputHistogram;
00180
00181 typedef vnl_matrix<double> TableType;
00182 TableType m_QuantileTable;
00183
00184 typedef vnl_vector<double> GradientArrayType;
00185 GradientArrayType m_Gradients;
00186 double m_LowerGradient;
00187 double m_UpperGradient;
00188
00189 };
00190
00191
00192 }
00193
00194 #ifndef ITK_MANUAL_INSTANTIATION
00195 #include "itkHistogramMatchingImageFilter.txx"
00196 #endif
00197
00198 #endif