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
#include "itkFixedArray.h"
00027
00028
namespace itk
00029 {
00030
00079
template <
class TPixel,
unsigned int VImageDimension=2>
00080 class ITK_EXPORT Image :
public ImageBase<VImageDimension>
00081 {
00082
public:
00084 typedef Image
Self;
00085 typedef ImageBase<VImageDimension> Superclass;
00086 typedef SmartPointer<Self> Pointer;
00087 typedef SmartPointer<const Self> ConstPointer;
00088
00090
itkNewMacro(
Self);
00091
00093
itkTypeMacro(Image,
ImageBase);
00094
00097 typedef TPixel
PixelType;
00098
00100 typedef TPixel
ValueType ;
00101
00106 typedef TPixel
InternalPixelType;
00107
00110 typedef DefaultPixelAccessor< PixelType > AccessorType;
00111
00116
itkStaticConstMacro(ImageDimension,
unsigned int, VImageDimension);
00117
00119 typedef ImportImageContainer<unsigned long, PixelType> PixelContainer;
00120
00122 typedef typename Superclass::IndexType
IndexType;
00123
00125 typedef typename Superclass::OffsetType
OffsetType;
00126
00128 typedef typename Superclass::SizeType
SizeType;
00129
00131 typedef typename Superclass::RegionType
RegionType;
00132
00135 typedef typename Superclass::SpacingType
SpacingType;
00136
00139 typedef typename Superclass::PointType
PointType;
00140
00142 typedef typename PixelContainer::Pointer
PixelContainerPointer;
00143 typedef typename PixelContainer::ConstPointer
PixelContainerConstPointer;
00144
00147
void Allocate();
00148
00152 void SetRegions(
RegionType region)
00153 {
00154 this->SetLargestPossibleRegion(region);
00155 this->SetBufferedRegion(region);
00156 this->SetRequestedRegion(region);
00157 };
00158
00159
void SetRegions(SizeType size)
00160 {
00161
RegionType region; region.SetSize(size);
00162 this->SetLargestPossibleRegion(region);
00163 this->SetBufferedRegion(region);
00164 this->SetRequestedRegion(region);
00165 };
00166
00169
virtual void Initialize();
00170
00173
void FillBuffer (
const TPixel& value);
00174
00180
void SetPixel(
const IndexType &index,
const TPixel& value)
00181 {
00182
typename Superclass::OffsetValueType offset = this->ComputeOffset(index);
00183 (*m_Buffer)[offset] = value;
00184 }
00185
00190
const TPixel& GetPixel(
const IndexType &index)
const
00191 {
00192
typename Superclass::OffsetValueType offset = this->ComputeOffset(index);
00193
return ( (*m_Buffer)[offset] );
00194 }
00195
00200 TPixel& GetPixel(
const IndexType &index)
00201 {
00202
typename Superclass::OffsetValueType offset = this->ComputeOffset(index);
00203
return ( (*m_Buffer)[offset] );
00204 }
00205
00210 TPixel & operator[](
const IndexType &index)
00211 {
return this->GetPixel(index); }
00212
00217
const TPixel& operator[](
const IndexType &index)
const
00218 {
return this->GetPixel(index); }
00219
00222 TPixel *GetBufferPointer()
00223 {
return m_Buffer ? m_Buffer->GetBufferPointer() : 0; }
00224
const TPixel *GetBufferPointer()
const
00225 {
return m_Buffer ? m_Buffer->GetBufferPointer() : 0; }
00226
00228 PixelContainer* GetPixelContainer()
00229 {
return m_Buffer.GetPointer(); }
00230
00231
const PixelContainer* GetPixelContainer()
const
00232
{
return m_Buffer.GetPointer(); }
00233
00236
void SetPixelContainer(
PixelContainer *container );
00237
00239
AccessorType GetPixelAccessor(
void )
00240 {
return AccessorType(); }
00241
00243
const AccessorType GetPixelAccessor(
void )
const
00244
{
return AccessorType(); }
00245
00250
itkSetMacro(Spacing,
SpacingType);
00251
virtual void SetSpacing(
const double spacing[VImageDimension] );
00252
virtual void SetSpacing(
const float spacing[VImageDimension] );
00253
00258
itkSetMacro(Origin,
PointType);
00259
virtual void SetOrigin(
const double origin[VImageDimension] );
00260
virtual void SetOrigin(
const float origin[VImageDimension] );
00261
00266
template<
class TCoordRep>
00267
bool TransformPhysicalPointToContinuousIndex(
00268
const Point<TCoordRep, VImageDimension>& point,
00269
ContinuousIndex<TCoordRep, VImageDimension>& index )
const
00270
{
00271
00272
for (
unsigned int i = 0 ; i < VImageDimension ; i++)
00273 {
00274 index[i] = static_cast<TCoordRep>( (point[i]- m_Origin[i]) / m_Spacing[i] );
00275 }
00276
00277
00278
const bool isInside =
00279 this->GetLargestPossibleRegion().IsInside( index );
00280
00281
return isInside;
00282 }
00283
00288
template<
class TCoordRep>
00289
bool TransformPhysicalPointToIndex(
00290
const Point<TCoordRep, VImageDimension>& point,
00291 IndexType & index )
const
00292
{
00293 typedef typename IndexType::IndexValueType IndexValueType;
00294
00295
00296
for (
unsigned int i = 0 ; i < VImageDimension ; i++)
00297 {
00298 index[i] = static_cast<IndexValueType>( (point[i]- m_Origin[i]) / m_Spacing[i] );
00299 }
00300
00301
00302
const bool isInside =
00303 this->GetLargestPossibleRegion().IsInside( index );
00304
00305
return isInside;
00306 }
00307
00312
template<
class TCoordRep>
00313
void TransformContinuousIndexToPhysicalPoint(
00314
const ContinuousIndex<TCoordRep, VImageDimension>& index,
00315 Point<TCoordRep, VImageDimension>& point )
const
00316
{
00317 for (
unsigned int i = 0 ; i < VImageDimension ; i++)
00318 {
00319 point[i] = static_cast<TCoordRep>( m_Spacing[i] * index[i] + m_Origin[i] );
00320 }
00321 }
00322
00328
template<
class TCoordRep>
00329
void TransformIndexToPhysicalPoint(
00330
const IndexType & index,
00331 Point<TCoordRep, VImageDimension>& point )
const
00332
{
00333
for (
unsigned int i = 0 ; i < VImageDimension ; i++)
00334 {
00335 point[i] = static_cast<TCoordRep>( m_Spacing[i] *
00336 static_cast<double>( index[i] ) + m_Origin[i] );
00337 }
00338 }
00339
00356
virtual void CopyInformation(
const DataObject *data);
00357
00358
protected:
00359 Image();
00360
void PrintSelf(std::ostream& os, Indent indent)
const;
00361
virtual ~Image() {};
00362
private:
00363 Image(
const Self&);
00364
void operator=(
const Self&);
00365
00367 PixelContainerPointer m_Buffer;
00368 };
00369
#ifdef ITK_EXPLICIT_INSTANTIATION
00370
extern template class Image<float ,2>;
00371
extern template class Image<double ,2>;
00372
extern template class Image<unsigned char ,2>;
00373
extern template class Image<unsigned short,2>;
00374
extern template class Image<unsigned int ,2>;
00375
extern template class Image<signed char ,2>;
00376
extern template class Image<signed short ,2>;
00377
extern template class Image<signed int ,2>;
00378
extern template class Image<float ,3>;
00379
extern template class Image<double ,3>;
00380
extern template class Image<unsigned char ,3>;
00381
extern template class Image<unsigned short,3>;
00382
extern template class Image<unsigned int ,3>;
00383
extern template class Image<signed char ,3>;
00384
extern template class Image<signed short ,3>;
00385
extern template class Image<signed int ,3>;
00386
#endif
00387
}
00388
#ifndef ITK_MANUAL_INSTANTIATION
00389
#include "itkImage.txx"
00390
#endif
00391
00392
#endif
00393