00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef __itkImageToListAdaptor_h
00018 #define __itkImageToListAdaptor_h
00019
00020 #include <typeinfo>
00021
00022 #include "itkImage.h"
00023 #include "itkPixelTraits.h"
00024 #include "itkListSampleBase.h"
00025 #include "itkSmartPointer.h"
00026 #include "itkImageRegionIterator.h"
00027 #include "itkFixedArray.h"
00028 #include "itkMacro.h"
00029
00030 namespace itk{
00031 namespace Statistics{
00032
00062 template < class TImage,
00063 class TMeasurementVector =
00064 ITK_TYPENAME TImage::PixelType >
00065 class ITK_EXPORT ImageToListAdaptor :
00066 public ListSampleBase< TMeasurementVector >
00067 {
00068 public:
00070 typedef ImageToListAdaptor Self;
00071 typedef ListSampleBase< TMeasurementVector > Superclass;
00072 typedef SmartPointer< Self > Pointer;
00073 typedef SmartPointer<const Self> ConstPointer;
00074
00076 itkTypeMacro(ImageToListAdaptor, ListSampleBase) ;
00077
00079 itkNewMacro(Self) ;
00080
00082 typedef TImage ImageType;
00083 typedef typename ImageType::Pointer ImagePointer ;
00084 typedef typename ImageType::ConstPointer ImageConstPointer ;
00085 typedef typename ImageType::IndexType IndexType ;
00086 typedef typename ImageType::PixelType PixelType ;
00087 typedef typename ImageType::PixelContainerConstPointer PixelContainerConstPointer ;
00088 typedef typename ImageType::PixelContainer::ElementIdentifier
00089 InstanceIdentifier;
00090
00092 typedef ImageRegionIterator< ImageType > IteratorType ;
00093 typedef PixelTraits< typename TImage::PixelType > PixelTraitsType ;
00094
00096 itkStaticConstMacro(MeasurementVectorSize, unsigned int,
00097 PixelTraitsType::Dimension);
00098
00101 typedef typename PixelTraitsType::ValueType MeasurementType ;
00102 typedef typename Superclass::FrequencyType FrequencyType ;
00103
00104 typedef TMeasurementVector MeasurementVectorType ;
00105 typedef MeasurementVectorType ValueType ;
00106
00108 void SetImage(const TImage* image) ;
00109
00111 const TImage* GetImage() const;
00112
00114 unsigned int Size() const ;
00115
00116 inline virtual const MeasurementVectorType & GetMeasurementVector(const InstanceIdentifier &id) const;
00117
00118 inline FrequencyType GetFrequency(const InstanceIdentifier &id) const ;
00119
00120 FrequencyType GetTotalFrequency() const ;
00121
00122
00123 class Iterator
00124 {
00125 public:
00126
00127 Iterator(){}
00128
00129 Iterator(InstanceIdentifier id, Pointer pContainer)
00130 :m_Id(id),m_Container(pContainer)
00131 {}
00132
00133 FrequencyType GetFrequency() const
00134 { return 1 ;}
00135
00136 const MeasurementVectorType & GetMeasurementVector() const
00137 { return m_Container->GetMeasurementVector(m_Id) ;}
00138
00139 InstanceIdentifier GetInstanceIdentifier() const
00140 { return m_Id ;}
00141
00142 Iterator& operator++()
00143 { ++m_Id ; return *this ;}
00144
00145
00146
00147
00148 Iterator& operator+(int n)
00149 { m_Id += n; return *this ;}
00150
00151 Iterator& operator-(int n)
00152 { m_Id -= n; return *this ;}
00153
00154 bool operator!=(const Iterator &it)
00155 {
00156 if (m_Id != it.m_Id)
00157 {return true ;}
00158
00159 if (m_Container != it.m_Container)
00160 { return true ;}
00161
00162 return false ;
00163 }
00164
00165 bool operator==(const Iterator &it)
00166 { return !(*this != it);}
00167
00168 Iterator& operator = (const Iterator &iter)
00169 {
00170 m_Id = iter.m_Id;
00171 m_Container = iter.m_Container ;
00172 return *this ;
00173 }
00174
00175 Iterator(const Iterator &iter)
00176 {
00177 m_Id = iter.m_Id;
00178 m_Container = iter.m_Container ;
00179 }
00180
00181 private:
00182 InstanceIdentifier m_Id;
00183 Pointer m_Container ;
00184 } ;
00185
00186
00187 class ConstIterator
00188 {
00189 public:
00190
00191 ConstIterator(){}
00192
00193 ConstIterator(InstanceIdentifier id, ConstPointer pContainer)
00194 :m_Id(id),m_Container(pContainer)
00195 {}
00196
00197 FrequencyType GetFrequency() const
00198 { return 1 ;}
00199
00200 const MeasurementVectorType & GetMeasurementVector() const
00201 { return m_Container->GetMeasurementVector(m_Id) ;}
00202
00203 InstanceIdentifier GetInstanceIdentifier() const
00204 { return m_Id ;}
00205
00206 ConstIterator& operator++()
00207 { ++m_Id ; return *this ;}
00208
00209
00210
00211
00212 ConstIterator& operator+(int n)
00213 { m_Id += n; return *this ;}
00214
00215 ConstIterator& operator-(int n)
00216 { m_Id -= n; return *this ;}
00217
00218 bool operator!=(const ConstIterator &it)
00219 {
00220 if (m_Id != it.m_Id)
00221 {return true ;}
00222
00223 if (m_Container != it.m_Container)
00224 { return true ;}
00225
00226 return false ;
00227 }
00228
00229 bool operator==(const ConstIterator &it)
00230 { return !(*this != it);}
00231
00232 ConstIterator& operator = (const ConstIterator &iter)
00233 {
00234 m_Id = iter.m_Id;
00235 m_Container = iter.m_Container ;
00236 return *this ;
00237 }
00238
00239 ConstIterator(const ConstIterator &iter)
00240 {
00241 m_Id = iter.m_Id;
00242 m_Container = iter.m_Container ;
00243 }
00244
00245 private:
00246 InstanceIdentifier m_Id;
00247 ConstPointer m_Container ;
00248 } ;
00249
00250
00251
00252 Iterator Begin()
00253 {
00254 Iterator iter(0, this);
00255 return iter;
00256 }
00257
00258 Iterator End()
00259 {
00260 Iterator iter(this->Size(), this);
00261 return iter;
00262 }
00263
00264 ConstIterator Begin() const
00265 {
00266 ConstIterator iter(0, this);
00267 return iter;
00268 }
00269
00270 ConstIterator End() const
00271 {
00272 ConstIterator iter(this->Size(), this);
00273 return iter;
00274 }
00275
00276 protected:
00277 ImageToListAdaptor() ;
00278 virtual ~ImageToListAdaptor() {}
00279 void PrintSelf(std::ostream& os, Indent indent) const;
00280
00281 itkGetConstReferenceMacro(PixelContainer,PixelContainerConstPointer);
00282 itkGetConstReferenceMacro(UseBuffer,bool);
00283 itkGetConstReferenceMacro(ImageBeginIndex,IndexType);
00284 itkGetConstReferenceMacro(ImageEndIndex,IndexType);
00285
00286
00287 private:
00288 ImageToListAdaptor(const Self&) ;
00289 void operator=(const Self&) ;
00290
00291 PixelContainerConstPointer m_PixelContainer ;
00292 bool m_UseBuffer ;
00293 IndexType m_ImageBeginIndex ;
00294 IndexType m_ImageEndIndex ;
00295
00296 ImageConstPointer m_Image ;
00297 } ;
00298
00299 }
00300 }
00301
00302 #ifndef ITK_MANUAL_INSTANTIATION
00303 #include "itkImageToListAdaptor.txx"
00304 #endif
00305
00306 #endif