00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef __itkWatershedBoundary_h
00018 #define __itkWatershedBoundary_h
00019
00020 #if defined(_MSC_VER)
00021 #pragma warning ( disable : 4786 )
00022 #endif
00023
00024 #include <list>
00025 #include <vector>
00026 #include "itkImage.h"
00027 #include "itkObjectFactory.h"
00028 #include "itkDataObject.h"
00029 #include "itkProcessObject.h"
00030 #include "itk_hash_map.h"
00031
00032 namespace itk
00033 {
00034 namespace watershed
00035 {
00055 template <class TScalarType, unsigned int TDimension>
00056 class Boundary : public DataObject
00057 {
00058 public:
00063 itkStaticConstMacro(Dimension, unsigned int, TDimension);
00064
00069 typedef std::pair<unsigned, unsigned> IndexType;
00070 typedef typename Image<unsigned long, TDimension>::IndexType ImageIndexType;
00071 typedef TScalarType ScalarType;
00072
00074 struct face_pixel_t
00075 {
00090 short flow;
00091
00093 unsigned long label;
00094 };
00095
00097 struct flat_region_t
00098 {
00102 std::list<unsigned long> offset_list;
00103
00106 ScalarType bounds_min;
00107
00110 unsigned long min_label;
00111
00113 ScalarType value;
00114 };
00115
00118 typedef Image<face_pixel_t, TDimension> face_t;
00119
00121 typedef itk::hash_map<unsigned long, flat_region_t,
00122 itk::hash<unsigned long> > flat_hash_t;
00123 typedef typename flat_hash_t::value_type FlatHashValueType;
00124
00127 typedef Boundary Self;
00128 typedef DataObject Superclass;
00129 typedef SmartPointer<Self> Pointer;
00130 typedef SmartPointer<const Self> ConstPointer;
00131 itkNewMacro(Self);
00132 itkTypeMacro(Boundary, DataObject);
00133
00135 typedef typename face_t::Pointer FacePointer;
00136
00137
00139 FacePointer GetFace(const IndexType &idx)
00140 { return this->GetFace(idx.first, idx.second); }
00141
00145 FacePointer GetFace(unsigned dimension, unsigned highlow)
00146 {
00147 if (highlow == 0) return m_Faces[dimension].first;
00148 else return m_Faces[dimension].second;
00149 }
00150
00151 void SetFace(FacePointer f, const IndexType &idx)
00152 { this->SetFace(f, idx.first, idx.second); }
00153
00154 void SetFace(FacePointer f, unsigned dimension, unsigned highlow)
00155 {
00156 if (highlow ==0 ) m_Faces[dimension].first = f;
00157 else m_Faces[dimension].second = f;
00158 this->Modified();
00159 }
00160
00162 flat_hash_t *GetFlatHash(const IndexType &idx)
00163 { return this->GetFlatHash(idx.first, idx.second); }
00164 flat_hash_t *GetFlatHash(unsigned dimension, unsigned highlow)
00165 {
00166 if (highlow == 0) return &(m_FlatHashes[dimension].first);
00167 else return &(m_FlatHashes[dimension].second);
00168 }
00169 void SetFlatHash(flat_hash_t & l, const IndexType &idx)
00170 { this->SetFlatHash(l, idx.first, idx.second); }
00171 void SetFlatHash(flat_hash_t & l, unsigned dimension,
00172 unsigned highlow)
00173 {
00174 if (highlow ==0 ) m_FlatHashes[dimension].first = l;
00175 else m_FlatHashes[dimension].second = l;
00176 this->Modified();
00177 }
00178
00183 void SetValid(bool & l, const IndexType &idx)
00184 { this->SetValid(l, idx.first, idx.second); }
00185 void SetValid(bool b, unsigned dimension,
00186 unsigned highlow)
00187 {
00188 if (highlow ==0 ) m_Valid[dimension].first = b;
00189 else m_Valid[dimension].second = b;
00190 this->Modified();
00191 }
00192 bool GetValid(const IndexType &idx) const
00193 { return this->GetValid(idx.first, idx.second); }
00194 bool GetValid(unsigned dimension, unsigned highlow) const
00195 {
00196 if (highlow == 0) return m_Valid[dimension].first;
00197 else return m_Valid[dimension].second;
00198 }
00199
00200 protected:
00201 Boundary();
00202 virtual ~Boundary() {}
00203 Boundary(const Self&) {}
00204 void operator=(const Self&) {}
00205 void PrintSelf(std::ostream& os, Indent indent) const;
00206
00208 std::vector<std::pair<FacePointer, FacePointer> > m_Faces;
00209
00212 std::vector<std::pair<flat_hash_t, flat_hash_t> > m_FlatHashes;
00213
00216 std::vector<std::pair<bool,bool> > m_Valid;
00217
00219 void UpdateOutputInformation();
00220 bool VerifyRequestedRegion() { return true; }
00221 void SetRequestedRegionToLargestPossibleRegion () {}
00222 bool RequestedRegionIsOutsideOfTheBufferedRegion () { return false; }
00223 void SetRequestedRegion (DataObject *) {}
00224
00225 };
00226 }
00227 }
00228
00229 #ifndef ITK_MANUAL_INSTANTIATION
00230 #include "itkWatershedBoundary.txx"
00231 #endif
00232
00233 #endif
00234