ITK
4.1.0
Insight Segmentation and Registration Toolkit
|
00001 /*========================================================================= 00002 * 00003 * Copyright Insight Software Consortium 00004 * 00005 * Licensed under the Apache License, Version 2.0 (the "License"); 00006 * you may not use this file except in compliance with the License. 00007 * You may obtain a copy of the License at 00008 * 00009 * http://www.apache.org/licenses/LICENSE-2.0.txt 00010 * 00011 * Unless required by applicable law or agreed to in writing, software 00012 * distributed under the License is distributed on an "AS IS" BASIS, 00013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00014 * See the License for the specific language governing permissions and 00015 * limitations under the License. 00016 * 00017 *=========================================================================*/ 00018 #ifndef __itkLabelMap_h 00019 #define __itkLabelMap_h 00020 00021 #include "itkImageBase.h" 00022 #include "itkWeakPointer.h" 00023 #include <map> 00024 00025 namespace itk 00026 { 00069 template< class TLabelObject > 00070 class ITK_EXPORT LabelMap:public ImageBase< ::itk::GetImageDimension< TLabelObject >::ImageDimension > 00071 { 00072 public: 00074 typedef LabelMap Self; 00075 typedef ImageBase< ::itk::GetImageDimension< TLabelObject >::ImageDimension > Superclass; 00076 typedef SmartPointer< Self > Pointer; 00077 typedef SmartPointer< const Self > ConstPointer; 00078 typedef WeakPointer< const Self > ConstWeakPointer; 00079 00081 itkNewMacro(Self); 00082 00084 itkTypeMacro(LabelMap, ImageBase); 00085 00086 typedef TLabelObject LabelObjectType; 00087 00088 typedef typename LabelObjectType::Pointer LabelObjectPointerType; 00089 00090 typedef typename Superclass::SizeValueType SizeValueType; 00091 typedef SizeValueType LengthType; 00092 00097 itkStaticConstMacro(ImageDimension, unsigned int, LabelObjectType::ImageDimension); 00098 00100 typedef typename LabelObjectType::LabelType LabelType; 00101 typedef LabelType PixelType; 00102 00104 typedef std::vector< LabelType > LabelVectorType; 00105 typedef std::vector< LabelObjectPointerType > LabelObjectVectorType; 00106 00108 typedef typename Superclass::IndexType IndexType; 00109 00111 typedef typename Superclass::OffsetType OffsetType; 00112 00114 typedef typename Superclass::SizeType SizeType; 00115 00117 typedef typename Superclass::DirectionType DirectionType; 00118 00121 typedef typename Superclass::RegionType RegionType; 00122 00125 typedef typename Superclass::SpacingType SpacingType; 00126 00129 typedef typename Superclass::PointType PointType; 00130 00132 typedef typename Superclass::OffsetValueType OffsetValueType; 00133 00137 void SetRegions(const RegionType & region) 00138 { 00139 this->SetLargestPossibleRegion(region); 00140 this->SetBufferedRegion(region); 00141 this->SetRequestedRegion(region); 00142 } 00144 00145 void SetRegions(const SizeType & size) 00146 { 00147 RegionType region; region.SetSize(size); 00148 00149 this->SetLargestPossibleRegion(region); 00150 this->SetBufferedRegion(region); 00151 this->SetRequestedRegion(region); 00152 } 00153 00156 virtual void Initialize(); 00157 00159 virtual void Allocate(); 00160 00161 virtual void Graft(const DataObject *data); 00162 00168 LabelObjectType * GetLabelObject(const LabelType & label); 00169 const LabelObjectType * GetLabelObject(const LabelType & label) const; 00171 00177 bool HasLabel(const LabelType label) const; 00178 00185 LabelObjectType * GetNthLabelObject(const SizeValueType & pos); 00186 const LabelObjectType * GetNthLabelObject(const SizeValueType & pos) const; 00188 00196 const LabelType & GetPixel(const IndexType & idx) const; 00197 00207 void SetPixel(const IndexType & idx, const LabelType & label); 00208 00216 void AddPixel(const IndexType & idx, const LabelType & label); 00217 00222 void RemovePixel(const IndexType & idx, const LabelType & label); 00223 00231 void SetLine(const IndexType & idx, const LengthType & length, const LabelType & label); 00232 00238 LabelObjectType * GetLabelObject(const IndexType & idx) const; 00239 00244 void AddLabelObject(LabelObjectType *labelObject); 00245 00250 void PushLabelObject(LabelObjectType *labelObject); 00251 00255 void RemoveLabelObject(LabelObjectType *labelObject); 00256 00260 void RemoveLabel(const LabelType & label); 00261 00265 void ClearLabels(); 00266 00270 typename Self::SizeValueType GetNumberOfLabelObjects() const; 00271 00275 LabelVectorType GetLabels() const; 00276 00280 LabelObjectVectorType GetLabelObjects() const; 00281 00285 itkGetConstMacro(BackgroundValue, LabelType); 00286 itkSetMacro(BackgroundValue, LabelType); 00288 00293 void PrintLabelObjects(std::ostream & os) const; 00294 00295 void PrintLabelObjects() const 00296 { 00297 this->PrintLabelObjects(std::cerr); 00298 } 00299 00303 void Optimize(); 00304 00309 class ConstIterator 00310 { 00311 public: 00312 00313 ConstIterator() {} 00314 00315 ConstIterator(const Self *lm) 00316 { 00317 m_Begin = lm->m_LabelObjectContainer.begin(); 00318 m_End = lm->m_LabelObjectContainer.end(); 00319 m_Iterator = m_Begin; 00320 } 00321 00322 ConstIterator(const ConstIterator & iter) 00323 { 00324 m_Iterator = iter.m_Iterator; 00325 m_Begin = iter.m_Begin; 00326 m_End = iter.m_End; 00327 } 00328 00329 ConstIterator & operator=(const ConstIterator & iter) 00330 { 00331 m_Iterator = iter.m_Iterator; 00332 m_Begin = iter.m_Begin; 00333 m_End = iter.m_End; 00334 return *this; 00335 } 00336 00337 const LabelObjectType * GetLabelObject() const 00338 { 00339 return m_Iterator->second; 00340 } 00341 00342 const LabelType & GetLabel() const 00343 { 00344 return m_Iterator->first; 00345 } 00346 00347 ConstIterator operator++(int) 00348 { 00349 ConstIterator tmp = *this; 00350 ++(*this); 00351 return tmp; 00352 } 00353 00354 ConstIterator & operator++() 00355 { 00356 ++m_Iterator; 00357 return *this; 00358 } 00359 00360 bool operator==(const ConstIterator & iter) const 00361 { 00362 return m_Iterator == iter.m_Iterator && m_Begin == iter.m_Begin && m_End == iter.m_End; 00363 } 00364 00365 bool operator!=(const ConstIterator & iter) const 00366 { 00367 return !( *this == iter ); 00368 } 00369 00370 void GoToBegin() 00371 { 00372 m_Iterator = m_Begin; 00373 } 00374 00375 bool IsAtEnd() const 00376 { 00377 return m_Iterator == m_End; 00378 } 00379 00380 private: 00381 typedef typename std::map< LabelType, LabelObjectPointerType >::const_iterator InternalIteratorType; 00382 InternalIteratorType m_Iterator; 00383 InternalIteratorType m_Begin; 00384 InternalIteratorType m_End; 00385 }; 00386 00391 class Iterator 00392 { 00393 public: 00394 00395 Iterator() {} 00396 00397 Iterator(Self *lm) 00398 { 00399 m_Begin = lm->m_LabelObjectContainer.begin(); 00400 m_End = lm->m_LabelObjectContainer.end(); 00401 m_Iterator = m_Begin; 00402 } 00403 00404 Iterator(const Iterator & iter) 00405 { 00406 m_Iterator = iter.m_Iterator; 00407 m_Begin = iter.m_Begin; 00408 m_End = iter.m_End; 00409 } 00410 00411 Iterator & operator=(const Iterator & iter) 00412 { 00413 m_Iterator = iter.m_Iterator; 00414 m_Begin = iter.m_Begin; 00415 m_End = iter.m_End; 00416 return *this; 00417 } 00418 00419 LabelObjectType * GetLabelObject() 00420 { 00421 return m_Iterator->second; 00422 } 00423 00424 const LabelType & GetLabel() const 00425 { 00426 return m_Iterator->first; 00427 } 00428 00429 Iterator operator++(int) 00430 { 00431 Iterator tmp = *this; 00432 ++(*this); 00433 return tmp; 00434 } 00435 00436 Iterator & operator++() 00437 { 00438 ++m_Iterator; 00439 return *this; 00440 } 00441 00442 bool operator==(const Iterator & iter) const 00443 { 00444 return m_Iterator == iter.m_Iterator && m_Begin == iter.m_Begin && m_End == iter.m_End; 00445 } 00446 00447 bool operator!=(const Iterator & iter) const 00448 { 00449 return !( *this == iter ); 00450 } 00451 00452 void GoToBegin() 00453 { 00454 m_Iterator = m_Begin; 00455 } 00456 00457 bool IsAtEnd() const 00458 { 00459 return m_Iterator == m_End; 00460 } 00461 00462 private: 00463 typedef typename std::map< LabelType, LabelObjectPointerType >::iterator InternalIteratorType; 00464 InternalIteratorType m_Iterator; 00465 InternalIteratorType m_Begin; 00466 InternalIteratorType m_End; 00467 00468 friend class LabelMap; 00469 }; 00470 00471 protected: 00472 LabelMap(); 00473 virtual ~LabelMap() {} 00474 void PrintSelf(std::ostream & os, Indent indent) const; 00475 00476 private: 00477 LabelMap(const Self &); //purposely not implemented 00478 void operator=(const Self &); //purposely not implemented 00479 00481 typedef std::map< LabelType, LabelObjectPointerType > LabelObjectContainerType; 00482 typedef typename LabelObjectContainerType::iterator LabelObjectContainerIterator; 00483 typedef typename LabelObjectContainerType::const_iterator 00484 LabelObjectContainerConstIterator; 00485 00486 LabelObjectContainerType m_LabelObjectContainer; 00487 LabelType m_BackgroundValue; 00488 00489 void AddPixel( const LabelObjectContainerIterator& it, 00490 const IndexType& idx, 00491 const LabelType& iLabel ); 00492 00493 void RemovePixel( const LabelObjectContainerIterator& it, 00494 const IndexType& idx, 00495 bool iEmitModifiedEvent ); 00496 }; 00497 } // end namespace itk 00498 00499 #ifndef ITK_MANUAL_INSTANTIATION 00500 #include "itkLabelMap.hxx" 00501 #endif 00502 00503 #endif 00504