00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef __itkBilateralImageFilter_h
00018 #define __itkBilateralImageFilter_h
00019
00020 #include "itkImageToImageFilter.h"
00021 #include "itkImage.h"
00022 #include "itkFixedArray.h"
00023 #include "itkNeighborhoodIterator.h"
00024 #include "itkConstNeighborhoodIterator.h"
00025 #include "itkNeighborhood.h"
00026
00027 namespace itk
00028 {
00068 template <class TInputImage, class TOutputImage >
00069 class ITK_EXPORT BilateralImageFilter :
00070 public ImageToImageFilter< TInputImage, TOutputImage >
00071 {
00072 public:
00074 typedef BilateralImageFilter Self;
00075 typedef ImageToImageFilter< TInputImage, TOutputImage > Superclass;
00076 typedef SmartPointer<Self> Pointer;
00077 typedef SmartPointer<const Self> ConstPointer;
00078
00080 itkNewMacro(Self);
00081
00083 itkTypeMacro(BilateralImageFilter, ImageToImageFilter);
00084
00086 typedef TInputImage InputImageType;
00087 typedef TOutputImage OutputImageType;
00088
00090 typedef typename Superclass::OutputImageRegionType OutputImageRegionType;
00091
00094 typedef typename TOutputImage::PixelType OutputPixelType;
00095 typedef typename TOutputImage::InternalPixelType OutputInternalPixelType;
00096 typedef typename NumericTraits<OutputPixelType>::RealType OutputPixelRealType;
00097 typedef typename TInputImage::PixelType InputPixelType;
00098 typedef typename TInputImage::InternalPixelType InputInternalPixelType;
00099
00102 itkStaticConstMacro(ImageDimension, unsigned int,
00103 TOutputImage::ImageDimension);
00104
00106 typedef FixedArray<double, itkGetStaticConstMacro(ImageDimension)> ArrayType;
00107
00109 typedef ConstNeighborhoodIterator<TInputImage>
00110 NeighborhoodIteratorType ;
00111
00113 typedef
00114 Neighborhood<double, itkGetStaticConstMacro(ImageDimension)> KernelType;
00115
00117 typedef typename KernelType::Iterator KernelIteratorType ;
00118 typedef typename KernelType::ConstIterator KernelConstIteratorType ;
00119
00121 typedef
00122 Image<double, itkGetStaticConstMacro(ImageDimension)> GaussianImageType;
00123
00127 itkSetMacro(DomainSigma, ArrayType);
00128 itkGetMacro(DomainSigma, const ArrayType);
00129 itkSetMacro(RangeSigma, double);
00130 itkGetMacro(RangeSigma, double);
00131 itkGetMacro(FilterDimensionality, unsigned int);
00132 itkSetMacro(FilterDimensionality, unsigned int);
00133
00136 void SetDomainSigma(const double v)
00137 {
00138 m_DomainSigma.Fill(v);
00139 }
00140
00144 itkSetMacro(NumberOfRangeGaussianSamples, unsigned long);
00145 itkGetMacro(NumberOfRangeGaussianSamples, unsigned long);
00146
00147 protected:
00150 BilateralImageFilter()
00151 {
00152 m_DomainSigma.Fill(4.0);
00153 m_RangeSigma = 50.0;
00154 m_FilterDimensionality = ImageDimension;
00155 m_NumberOfRangeGaussianSamples = 100;
00156 m_DynamicRange = 0.0;
00157 m_DynamicRangeUsed = 0.0;
00158 m_DomainMu = 2.5;
00159 m_RangeMu = 4.0;
00160
00161
00162 }
00163 virtual ~BilateralImageFilter() {}
00164 void PrintSelf(std::ostream& os, Indent indent) const;
00165
00167 void BeforeThreadedGenerateData();
00168
00171 void ThreadedGenerateData(const OutputImageRegionType& outputRegionForThread,
00172 int threadId);
00173
00180 virtual void GenerateInputRequestedRegion() throw(InvalidRequestedRegionError);
00181
00182
00183 private:
00184 BilateralImageFilter(const Self&);
00185 void operator=(const Self&);
00186
00189 double m_RangeSigma;
00190
00193 ArrayType m_DomainSigma;
00194
00197 double m_DomainMu;
00198 double m_RangeMu;
00199
00201 unsigned int m_FilterDimensionality;
00202
00204 KernelType m_GaussianKernel;
00205
00207 unsigned long m_NumberOfRangeGaussianSamples;
00208 double m_DynamicRange;
00209 double m_DynamicRangeUsed;
00210 std::vector<double> m_RangeGaussianTable;
00211 };
00212
00213 }
00214
00215 #ifndef ITK_MANUAL_INSTANTIATION
00216 #include "itkBilateralImageFilter.txx"
00217 #endif
00218
00219 #endif