Main Page   Groups   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members   Concepts

itkJointDomainImageToListSampleAdaptor.h

Go to the documentation of this file.
00001 /*=========================================================================
00002 
00003   Program:   Insight Segmentation & Registration Toolkit
00004   Module:    $RCSfile: itkJointDomainImageToListSampleAdaptor.h,v $
00005   Language:  C++
00006   Date:      $Date: 2009-05-22 12:55:00 $
00007   Version:   $Revision: 1.3 $
00008 
00009   Copyright (c) Insight Software Consortium. All rights reserved.
00010   See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details.
00011 
00012      This software is distributed WITHOUT ANY WARRANTY; without even 
00013      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
00014      PURPOSE.  See the above copyright notices for more information.
00015 
00016 =========================================================================*/
00017 #ifndef __itkJointDomainImageToListSampleAdaptor_h
00018 #define __itkJointDomainImageToListSampleAdaptor_h
00019 
00020 #include "itkMacro.h"
00021 #include "itkFixedArray.h"
00022 #include "itkPoint.h"
00023 #include "itkPixelTraits.h"
00024 #include "itkImageRegionConstIteratorWithIndex.h"
00025 #include "itkImageRegionIterator.h"
00026 #include "itkImageRegionConstIterator.h"
00027 #include "itkListSample.h"
00028 
00029 namespace itk { 
00030 namespace Statistics {
00031 
00039 template< class TImage >
00040 struct ImageJointDomainTraits
00041 {
00042   typedef ImageJointDomainTraits                          Self;
00043   typedef PixelTraits< typename TImage::PixelType >       PixelTraitsType;
00044   typedef typename PixelTraitsType::ValueType             RangeDomainMeasurementType;
00045   typedef typename TImage::IndexType::IndexValueType      IndexValueType;
00046 
00047   itkStaticConstMacro(ImageDimension, unsigned int, TImage::ImageDimension);
00048   itkStaticConstMacro(Dimension, 
00049                       unsigned int, 
00050                       TImage::ImageDimension +
00051                       PixelTraitsType::Dimension );
00052 
00053   typedef float                                                              CoordinateRepType;
00054   typedef Point< CoordinateRepType, itkGetStaticConstMacro(ImageDimension) > PointType;
00055   typedef JoinTraits< RangeDomainMeasurementType, CoordinateRepType >        JoinTraitsType;
00056   typedef typename JoinTraitsType::ValueType                                 MeasurementType;
00057 
00058   typedef FixedArray< MeasurementType, itkGetStaticConstMacro(Dimension) >
00059   MeasurementVectorType;
00060 }; // end of ImageJointDomainTraits
00061 
00062 
00092 template < class TImage >
00093 class ITK_EXPORT JointDomainImageToListSampleAdaptor 
00094   : public ListSample< typename ImageJointDomainTraits< TImage >::MeasurementVectorType >
00095 {
00096 public:
00097 
00099   typedef JointDomainImageToListSampleAdaptor Self;
00100 
00101   typedef ListSample < 
00102       typename ImageJointDomainTraits< TImage >::MeasurementVectorType >   Superclass;
00103 
00104   typedef SmartPointer< Self >                Pointer;
00105   typedef SmartPointer<const Self>            ConstPointer;
00106   
00107  
00108   typedef ImageJointDomainTraits< TImage > ImageJointDomainTraitsType;
00109 
00110   typedef typename ImageJointDomainTraitsType::MeasurementVectorType
00111                                                    MeasurementVectorType;
00112 
00113   typedef typename ImageJointDomainTraitsType::MeasurementType
00114                                                    MeasurementType;
00115 
00116   typedef typename ImageJointDomainTraitsType::RangeDomainMeasurementType
00117                                                    RangeDomainMeasurementType;
00118 
00119   typedef typename ImageJointDomainTraitsType::PointType   PointType;
00120 
00121   typedef typename ImageJointDomainTraitsType::CoordinateRepType 
00122                                                    CoordinateRepType;
00124   itkTypeMacro(JointDomainImageToListSampleAdaptor, ListSample);
00125 
00127   itkNewMacro(Self);
00128 
00130   itkStaticConstMacro(MeasurementVectorSize, 
00131                       unsigned int, 
00132                       ImageJointDomainTraitsType::Dimension);
00133 
00134   itkSuperclassTraitMacro( MeasurementVectorSizeType )
00135 
00136 
00138   itkSuperclassTraitMacro( AbsoluteFrequencyType )
00139     itkSuperclassTraitMacro( TotalAbsoluteFrequencyType )
00140   itkSuperclassTraitMacro( InstanceIdentifier )
00141 
00143   typedef TImage                                          ImageType;
00144   typedef ImageRegionIterator< ImageType >                ImageIteratorType; 
00145   typedef ImageRegionConstIterator< ImageType >           ImageConstIteratorType; 
00146 
00147   typedef typename ImageType::Pointer                     ImagePointer;
00148   typedef typename ImageType::ConstPointer                ImageConstPointer;
00149   typedef typename ImageType::PixelType                   PixelType;
00150   typedef typename ImageType::PixelContainerConstPointer  PixelContainerConstPointer;
00151   typedef typename ImageType::IndexType                   ImageIndexType;
00152   typedef typename ImageType::IndexType::IndexValueType   ImageIndexValueType;
00153   typedef typename ImageType::SizeType                    ImageSizeType;
00154   typedef typename ImageType::RegionType                  ImageRegionType;
00155   typedef MeasurementVectorType                           ValueType;
00156  
00158   void SetImage(const TImage* image);
00159 
00161   const TImage* GetImage() const;
00162 
00164   InstanceIdentifier Size() const;
00165 
00167   AbsoluteFrequencyType GetFrequency(InstanceIdentifier id) const;
00168 
00170   TotalAbsoluteFrequencyType GetTotalFrequency() const;
00171 
00172   itkStaticConstMacro(RangeDomainDimension, 
00173                       unsigned int, 
00174                       itk::PixelTraits< 
00175                       typename TImage::PixelType >::Dimension);
00176 
00177   typedef FixedArray< RangeDomainMeasurementType, 
00178                       itkGetStaticConstMacro( RangeDomainDimension ) > 
00179   RangeDomainMeasurementVectorType;
00180 
00181   typedef std::vector< InstanceIdentifier > InstanceIdentifierVectorType; 
00182 
00183   typedef FixedArray< float, itkGetStaticConstMacro(MeasurementVectorSize) >
00184                                             NormalizationFactorsType;
00185 
00187   void SetNormalizationFactors(NormalizationFactorsType& factors);
00188 
00191   const MeasurementVectorType & GetMeasurementVector( InstanceIdentifier id) const; 
00192 
00194   itkSetMacro( UsePixelContainer, bool );
00195   itkGetConstMacro( UsePixelContainer, bool );
00196   itkBooleanMacro( UsePixelContainer );
00198 
00199   //  void PrintSelf(std::ostream& os, Indent indent) const;  
00200 
00202   class ConstIterator
00203     {
00204     friend class JointDomainImageToListSampleAdaptor;
00205     public:
00206 
00207     ConstIterator( const JointDomainImageToListSampleAdaptor * adaptor )
00208       {
00209       *this = adaptor->Begin();
00210       }
00211 
00212     ConstIterator(const ConstIterator &iter)
00213       {
00214       m_InstanceIdentifier = iter.m_InstanceIdentifier;
00215       m_Adaptor            = iter.m_Adaptor;
00216       }
00217 
00218     ConstIterator& operator=( const ConstIterator & iter )
00219       {
00220       m_InstanceIdentifier = iter.m_InstanceIdentifier;
00221       return *this;
00222       }
00223 
00224     AbsoluteFrequencyType GetFrequency() const
00225       {
00226       return 1;
00227       }
00228 
00229     const MeasurementVectorType & GetMeasurementVector() const
00230       {
00231       m_MeasurementVectorCache = m_Adaptor->GetMeasurementVector( m_InstanceIdentifier );
00232       return this->m_MeasurementVectorCache;
00233       }
00234 
00235     InstanceIdentifier GetInstanceIdentifier() const
00236       {
00237       return m_InstanceIdentifier;
00238       }
00239 
00240     ConstIterator& operator++()
00241       {
00242       ++m_InstanceIdentifier;
00243       return *this;
00244       }
00245 
00246     bool operator!=(const ConstIterator &it)
00247       {
00248       return (m_InstanceIdentifier != it.m_InstanceIdentifier);
00249       }
00250 
00251     bool operator==(const ConstIterator &it)
00252       {
00253       return (m_InstanceIdentifier == it.m_InstanceIdentifier);
00254       }
00255 
00256 #if !(defined(_MSC_VER) && (_MSC_VER <= 1200))
00257   protected:
00258 #endif
00259     // This method should only be available to the ListSample class
00260     ConstIterator(
00261       const JointDomainImageToListSampleAdaptor * adaptor,
00262       InstanceIdentifier iid)
00263       {
00264       m_Adaptor = adaptor;
00265       m_InstanceIdentifier = iid;
00266       }
00267 
00268     // This method is purposely not implemented
00269     ConstIterator();
00270 
00271   private:
00272     mutable MeasurementVectorType                   m_MeasurementVectorCache;
00273     InstanceIdentifier                              m_InstanceIdentifier;
00274     const JointDomainImageToListSampleAdaptor *     m_Adaptor; 
00275     };
00276 
00277   class Iterator : public ConstIterator
00278   {
00279 
00280   friend class JointDomainImageToListSampleAdaptor;
00281 
00282   public:
00283 
00284     Iterator(Self * adaptor):ConstIterator(adaptor)
00285       {
00286       }
00287 
00288     Iterator(const Iterator &iter):ConstIterator( iter )
00289       {
00290       }
00291 
00292     Iterator& operator =(const Iterator & iter)
00293       {
00294       this->ConstIterator::operator=( iter );
00295       return *this;
00296       }
00297 
00298 #if !(defined(_MSC_VER) && (_MSC_VER <= 1200))
00299   protected:
00300 #endif
00301     // To ensure const-correctness these method must not be in the public API.
00302     // The are purposly not implemented, since they should never be called.
00303     Iterator();
00304     Iterator(const Self * adaptor);
00305     Iterator(const ConstIterator & it);
00306     ConstIterator& operator=(const ConstIterator& it);
00307     Iterator(
00308       const JointDomainImageToListSampleAdaptor * adaptor,
00309       InstanceIdentifier iid):ConstIterator( adaptor, iid )
00310       {
00311       }
00312 
00313   private:
00314   };
00315 
00316 
00318   Iterator Begin()
00319     {
00320     Iterator iter(this, 0);
00321     return iter;
00322     }
00324 
00326   Iterator End()
00327     {
00328     Iterator iter(this, m_Image->GetPixelContainer()->Size());
00329     return iter;
00330     }
00332 
00334   ConstIterator Begin() const
00335     {
00336     ConstIterator iter(this, 0);
00337     return iter;
00338     }
00340 
00342   ConstIterator End() const
00343     {
00344     ConstIterator iter(this, m_Image->GetPixelContainer()->Size());
00345     return iter;
00346     }
00348 
00349  
00350 protected:
00351   JointDomainImageToListSampleAdaptor();
00352   virtual ~JointDomainImageToListSampleAdaptor() {}
00353   void PrintSelf(std::ostream& os, Indent indent) const;  
00354 
00355 private:
00356   JointDomainImageToListSampleAdaptor(const Self&); //purposely not implemented
00357   void operator=(const Self&); //purposely not implemented
00358 
00359   NormalizationFactorsType                  m_NormalizationFactors;
00360   mutable MeasurementVectorType             m_TempVector;
00361   mutable PointType                         m_TempPoint;
00362   mutable ImageIndexType                    m_TempIndex;
00363   mutable RangeDomainMeasurementVectorType  m_TempRangeVector;
00364   ImageConstPointer                         m_Image;
00365   bool                                      m_UsePixelContainer;
00366 
00367   PixelContainerConstPointer                m_PixelContainer;
00368 
00369 }; // end of class JointDomainImageToListSampleAdaptor
00370 
00371 } // end of namespace Statistics
00372 } // end of namespace itk
00373 
00374 #ifndef ITK_MANUAL_INSTANTIATION
00375 #include "itkJointDomainImageToListSampleAdaptor.txx"
00376 #endif
00377 
00378 #endif
00379 

Generated at Thu May 28 10:34:40 2009 for ITK by doxygen 1.5.5 written by Dimitri van Heesch, © 1997-2000