00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef __itkImage_h
00018 #define __itkImage_h
00019
00020 #include "itkImageBase.h"
00021 #include "itkImageRegion.h"
00022 #include "itkImportImageContainer.h"
00023 #include "itkDefaultPixelAccessor.h"
00024 #include "itkPoint.h"
00025 #include "itkContinuousIndex.h"
00026
00027 namespace itk
00028 {
00029
00078 template <class TPixel, unsigned int VImageDimension=2>
00079 class ITK_EXPORT Image : public ImageBase<VImageDimension>
00080 {
00081 public:
00083 typedef Image Self;
00084 typedef ImageBase<VImageDimension> Superclass;
00085 typedef SmartPointer<Self> Pointer;
00086 typedef SmartPointer<const Self> ConstPointer;
00087
00089 itkNewMacro(Self);
00090
00092 itkTypeMacro(Image, ImageBase);
00093
00096 typedef TPixel PixelType;
00097
00099 typedef TPixel ValueType ;
00100
00105 typedef TPixel InternalPixelType;
00106
00109 typedef DefaultPixelAccessor< PixelType > AccessorType;
00110
00115 itkStaticConstMacro(ImageDimension, unsigned int, VImageDimension);
00116
00118 typedef ImportImageContainer<unsigned long, PixelType> PixelContainer;
00119
00121 typedef Index<VImageDimension> IndexType;
00122
00124 typedef Offset<VImageDimension> OffsetType;
00125
00127 typedef Size<VImageDimension> SizeType;
00128
00130 typedef ImageRegion<VImageDimension> RegionType;
00131
00133 typedef typename PixelContainer::Pointer PixelContainerPointer;
00134
00137 void Allocate();
00138
00142 void SetRegions(RegionType region)
00143 {
00144 this->SetLargestPossibleRegion(region);
00145 this->SetBufferedRegion(region);
00146 this->SetRequestedRegion(region);
00147 };
00148
00149 void SetRegions(SizeType size)
00150 {
00151 RegionType region; region.SetSize(size);
00152 this->SetLargestPossibleRegion(region);
00153 this->SetBufferedRegion(region);
00154 this->SetRequestedRegion(region);
00155 };
00156
00159 virtual void Initialize();
00160
00163 void FillBuffer (const TPixel& value);
00164
00170 void SetPixel(const IndexType &index, const TPixel& value)
00171 {
00172 typename Superclass::OffsetValueType offset = this->ComputeOffset(index);
00173 (*m_Buffer)[offset] = value;
00174 }
00175
00180 const TPixel& GetPixel(const IndexType &index) const
00181 {
00182 typename Superclass::OffsetValueType offset = this->ComputeOffset(index);
00183 return ( (*m_Buffer)[offset] );
00184 }
00185
00190 TPixel& GetPixel(const IndexType &index)
00191 {
00192 typename Superclass::OffsetValueType offset = this->ComputeOffset(index);
00193 return ( (*m_Buffer)[offset] );
00194 }
00195
00200 TPixel & operator[](const IndexType &index)
00201 { return this->GetPixel(index); }
00202
00207 const TPixel& operator[](const IndexType &index) const
00208 { return this->GetPixel(index); }
00209
00212 TPixel *GetBufferPointer()
00213 { return m_Buffer ? m_Buffer->GetBufferPointer() : 0; }
00214 const TPixel *GetBufferPointer() const
00215 { return m_Buffer ? m_Buffer->GetBufferPointer() : 0; }
00216
00218 PixelContainer* GetPixelContainer()
00219 { return m_Buffer.GetPointer(); }
00220
00223 void SetPixelContainer( PixelContainer *container );
00224
00226 AccessorType GetPixelAccessor( void )
00227 { return AccessorType(); }
00228
00230 const AccessorType GetPixelAccessor( void ) const
00231 { return AccessorType(); }
00232
00237 virtual void SetSpacing( const double spacing[VImageDimension] );
00238 virtual void SetSpacing( const float spacing[VImageDimension] );
00239
00244 virtual void SetOrigin( const double origin[VImageDimension] );
00245 virtual void SetOrigin( const float origin[VImageDimension] );
00246
00251 template<class TCoordRep>
00252 bool TransformPhysicalPointToContinuousIndex(
00253 const Point<TCoordRep, VImageDimension>& point,
00254 ContinuousIndex<TCoordRep, VImageDimension>& index ) const
00255 {
00256
00257 for (unsigned int i = 0 ; i < VImageDimension ; i++)
00258 {
00259 index[i] = static_cast<TCoordRep>( (point[i]- m_Origin[i]) / m_Spacing[i] );
00260 }
00261
00262
00263 const bool isInside =
00264 this->GetLargestPossibleRegion().IsInside( index );
00265
00266 return isInside;
00267 }
00268
00273 template<class TCoordRep>
00274 bool TransformPhysicalPointToIndex(
00275 const Point<TCoordRep, VImageDimension>& point,
00276 IndexType & index ) const
00277 {
00278 typedef typename IndexType::IndexValueType IndexValueType;
00279
00280
00281 for (unsigned int i = 0 ; i < VImageDimension ; i++)
00282 {
00283 index[i] = static_cast<IndexValueType>( (point[i]- m_Origin[i]) / m_Spacing[i] );
00284 }
00285
00286
00287 const bool isInside =
00288 this->GetLargestPossibleRegion().IsInside( index );
00289
00290 return isInside;
00291 }
00292
00297 template<class TCoordRep>
00298 void TransformContinuousIndexToPhysicalPoint(
00299 const ContinuousIndex<TCoordRep, VImageDimension>& index,
00300 Point<TCoordRep, VImageDimension>& point ) const
00301 {
00302 for (unsigned int i = 0 ; i < VImageDimension ; i++)
00303 {
00304 point[i] = static_cast<TCoordRep>( m_Spacing[i] * index[i] + m_Origin[i] );
00305 }
00306 }
00307
00313 template<class TCoordRep>
00314 void TransformIndexToPhysicalPoint(
00315 const IndexType & index,
00316 Point<TCoordRep, VImageDimension>& point ) const
00317 {
00318 for (unsigned int i = 0 ; i < VImageDimension ; i++)
00319 {
00320 point[i] = static_cast<TCoordRep>( m_Spacing[i] *
00321 static_cast<double>( index[i] ) + m_Origin[i] );
00322 }
00323 }
00324
00341 virtual void CopyInformation(const DataObject *data);
00342
00343 protected:
00344 Image();
00345 void PrintSelf(std::ostream& os, Indent indent) const;
00346 virtual ~Image() {};
00347 private:
00348 Image(const Self&);
00349 void operator=(const Self&);
00350
00352 PixelContainerPointer m_Buffer;
00353 };
00354
00355 }
00356
00357 #ifndef ITK_MANUAL_INSTANTIATION
00358 #include "itkImage.txx"
00359 #endif
00360
00361 #endif
00362