Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef __itkNeighborhood_h
00018 #define __itkNeighborhood_h
00019
00020 #include <iostream>
00021 #include "itkNeighborhoodAllocator.h"
00022 #include "itkSize.h"
00023 #include "itkIndent.h"
00024 #include "itkSliceIterator.h"
00025 #include "vnl/vnl_vector.h"
00026 #include "itkOffset.h"
00027 #include <vector>
00028 #include <stdlib.h>
00029 #include <string.h>
00030
00031 namespace itk {
00032
00054 template<class TPixel, unsigned int VDimension = 2,
00055 class TAllocator = NeighborhoodAllocator<TPixel> >
00056 class ITK_EXPORT Neighborhood
00057 {
00058 public:
00060 typedef Neighborhood Self;
00061
00063 typedef TAllocator AllocatorType;
00064
00066 itkStaticConstMacro(NeighborhoodDimension, unsigned int, VDimension);
00067
00069 typedef TPixel PixelType;
00070
00074 typedef typename AllocatorType::iterator Iterator;
00075 typedef typename AllocatorType::const_iterator ConstIterator;
00076
00078 typedef ::itk::Size<VDimension> SizeType;
00079 typedef typename SizeType::SizeValueType SizeValueType;
00080
00082 typedef ::itk::Size<VDimension> RadiusType;
00083
00085 typedef Offset<VDimension> OffsetType;
00086
00088 typedef SliceIterator<TPixel, Self> SliceIteratorType;
00089
00091 Neighborhood()
00092 {
00093 m_Radius.Fill(0);
00094 m_Size.Fill(0);
00095 for (unsigned int i = 0; i < VDimension; i++)
00096 {
00097 m_StrideTable[i] = 0;
00098 }
00099 }
00101
00103 virtual ~Neighborhood() {}
00104
00106 Neighborhood(const Self& other);
00107
00109 Self &operator=(const Self& other);
00110
00112 bool
00113 operator==(const Self& other) const
00114 {
00115 return (m_Radius == other.m_Radius &&
00116 m_Size == other.m_Size &&
00117 m_DataBuffer == other.m_DataBuffer);
00118 }
00119
00121 bool operator!=(const Self& other) const
00122 {
00123 return (m_Radius != other.m_Radius ||
00124 m_Size != other.m_Size ||
00125 m_DataBuffer != other.m_DataBuffer);
00126 }
00127
00129 const SizeType GetRadius() const
00130 { return m_Radius; }
00131
00134 unsigned long GetRadius(const unsigned long n) const
00135 { return m_Radius[n]; }
00136
00139 unsigned long GetSize(const unsigned long n) const
00140 { return m_Size[n]; }
00141
00143 SizeType GetSize() const
00144 { return m_Size; }
00145
00149 unsigned GetStride(const unsigned axis) const
00150 { return m_StrideTable[axis]; }
00151
00153 Iterator End()
00154 { return m_DataBuffer.end(); }
00155 Iterator Begin()
00156 { return m_DataBuffer.begin(); }
00157 ConstIterator End() const
00158 { return m_DataBuffer.end(); }
00159 ConstIterator Begin() const
00160 { return m_DataBuffer.begin(); }
00162
00164 unsigned int Size() const
00165 { return m_DataBuffer.size(); }
00166
00168 TPixel &operator[](unsigned int i)
00169 { return m_DataBuffer[i]; }
00170 const TPixel &operator[](unsigned int i) const
00171 { return m_DataBuffer[i]; }
00172 TPixel &GetElement(unsigned int i)
00173 { return m_DataBuffer[i]; }
00175
00177 TPixel GetCenterValue() const
00178 { return (this->operator[]((this->Size())>>1)); }
00179
00182 void SetRadius(const SizeType &);
00183
00186 void SetRadius(const unsigned long *rad)
00187 {
00188 SizeType s;
00189 memcpy(s.m_Size, rad, sizeof(unsigned long) * VDimension);
00190 this->SetRadius(s);
00191 }
00193
00197 void SetRadius(const unsigned long);
00198
00200 void Print(std::ostream& os) const
00201 { this->PrintSelf(os, Indent(0)); }
00202
00204 AllocatorType &GetBufferReference()
00205 { return m_DataBuffer; }
00206 const AllocatorType &GetBufferReference() const
00207 { return m_DataBuffer; }
00209
00211 TPixel &operator[](const OffsetType &o)
00212 { return this->operator[](this->GetNeighborhoodIndex(o)); }
00213 const TPixel &operator[](const OffsetType &o) const
00214 { return this->operator[](this->GetNeighborhoodIndex(o)); }
00216
00219 OffsetType GetOffset(unsigned int i) const
00220 { return m_OffsetTable[i]; }
00221
00222 virtual unsigned int GetNeighborhoodIndex(const OffsetType &) const;
00223
00224 unsigned int GetCenterNeighborhoodIndex() const
00225 {
00226 return static_cast<unsigned int>(this->Size()/2);
00227 }
00228
00229 std::slice GetSlice(unsigned int) const;
00230
00231 protected:
00233 void SetSize()
00234 {
00235 for (unsigned int i=0; i<VDimension; ++i)
00236 {
00237 m_Size[i] = m_Radius[i]*2+1;
00238 }
00239 }
00241
00243 virtual void Allocate(unsigned int i)
00244 { m_DataBuffer.set_size(i); }
00245
00247 virtual void PrintSelf(std::ostream&, Indent) const;
00248
00250 virtual void ComputeNeighborhoodStrideTable();
00251
00254 virtual void ComputeNeighborhoodOffsetTable();
00255
00256 private:
00259 SizeType m_Radius;
00260
00263 SizeType m_Size;
00264
00266 AllocatorType m_DataBuffer;
00267
00270 unsigned int m_StrideTable[VDimension];
00271
00273 std::vector<OffsetType> m_OffsetTable;
00274
00275 };
00276
00277 template <class TPixel, unsigned int VDimension, class TContainer>
00278 std::ostream & operator<<(std::ostream &os, const Neighborhood<TPixel,VDimension,TContainer> &neighborhood)
00279 {
00280 os << "Neighborhood:" << std::endl;
00281 os << " Radius:" << neighborhood.GetRadius() << std::endl;
00282 os << " Size:" << neighborhood.GetSize() << std::endl;
00283 os << " DataBuffer:" << neighborhood.GetBufferReference() << std::endl;
00284
00285 return os;
00286 }
00287
00288 }
00289
00290
00291 #define ITK_TEMPLATE_Neighborhood(_, EXPORT, x, y) namespace itk { \
00292 _(2(class EXPORT Neighborhood< ITK_TEMPLATE_2 x >)) \
00293 namespace Templates { typedef Neighborhood< ITK_TEMPLATE_2 x > \
00294 Neighborhood##y; } \
00295 }
00296
00297 #if ITK_TEMPLATE_EXPLICIT
00298 # include "Templates/itkNeighborhood+-.h"
00299 #endif
00300
00301 #if ITK_TEMPLATE_TXX
00302 # include "itkNeighborhood.txx"
00303 #endif
00304
00305
00306
00307
00308
00309
00310
00311 #endif
00312