00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
#ifndef __itkWatershedSegmentTable_h
00018
#define __itkWatershedSegmentTable_h
00019
00020
#if defined(_MSC_VER)
00021
#pragma warning ( disable : 4786 )
00022
#endif
00023
00024
#include "itkObjectFactory.h"
00025
#include "itkDataObject.h"
00026
#include "itkProcessObject.h"
00027
#include "itk_hash_map.h"
00028
#include <list>
00029
#include "itkOneWayEquivalencyTable.h"
00030
00031
namespace itk
00032 {
00033
namespace watershed
00034 {
00049
template <
class TScalarType>
00050 class ITK_EXPORT SegmentTable :
public DataObject
00051 {
00052
public:
00054 typedef SegmentTable
Self;
00055 typedef DataObject Superclass;
00056 typedef SmartPointer<Self> Pointer;
00057 typedef SmartPointer<const Self> ConstPointer;
00058 typedef TScalarType
ScalarType;
00059
itkNewMacro(
Self);
00060
itkTypeMacro(SegmentTable,
DataObject);
00061
00064
struct edge_pair_t
00065 {
00066
edge_pair_t() {}
00067 edge_pair_t(
unsigned long l,
ScalarType s)
00068 : label(l), height(s) {}
00069
unsigned long label;
00070 ScalarType height;
00071
00073
bool operator<(
edge_pair_t &o)
00074 {
00075 if ( this->height < o.
height )
return true;
00076
else return false;
00077 }
00078
00079 };
00080
00083
typedef std::list<edge_pair_t> edge_list_t;
00084
00086 struct segment_t
00087 {
00088
ScalarType min;
00089 edge_list_t edge_list;
00090 };
00091
00093
typedef itk::hash_map<unsigned long, segment_t, itk::hash<unsigned long> >
00094
HashMapType;
00095
typedef typename HashMapType::iterator
Iterator;
00096
typedef typename HashMapType::const_iterator
ConstIterator;
00097 typedef typename HashMapType::value_type
ValueType;
00098 typedef typename HashMapType::data_type
DataType;
00099
00101 bool Add(
unsigned long a,
const segment_t &t);
00102
00107
void PruneEdgeLists(
ScalarType maximum_saliency);
00108
00111
segment_t *Lookup(
const unsigned long a)
00112 {
00113
Iterator result = m_HashMap.find(a);
00114 if ( result == m_HashMap.end() )
return 0;
00115
else return &((*result).second);
00116 }
00117
00120
const segment_t *Lookup(
const unsigned long a)
const
00121
{
00122 ConstIterator result = m_HashMap.find(a);
00123
if ( result == m_HashMap.end() )
return 0;
00124 else return &((*result).second);
00125 }
00126
00129
bool IsEntry(
const unsigned long a)
const
00130
{
00131
if ( m_HashMap.find(a) == m_HashMap.end() )
return false;
00132
else return true;
00133 }
00134
00136
void Erase(
const unsigned long a)
00137 { m_HashMap.erase(a); }
00138
00140
void Clear()
00141 { m_HashMap.clear(); }
00142
00145
bool Empty()
const
00146 {
return m_HashMap.empty(); }
00147
00150
void SortEdgeLists();
00151
00153
typename HashMapType::size_type
Size()
const
00154
{
return m_HashMap.size(); }
00155
00157
00158
00161 Iterator Begin() {
return m_HashMap.begin(); }
00162
00165 Iterator End() {
return m_HashMap.end(); }
00166
00169 ConstIterator Begin()
const {
return m_HashMap.begin(); }
00170
00173 ConstIterator End() const {
return m_HashMap.end(); }
00174
00176
unsigned int GetSegmentMemorySize()
const
00177
{
00178
return sizeof(segment_t);
00179 }
00180
00181
00184
void SetMaximumDepth(ScalarType s)
00185 {
00186 m_MaximumDepth = s;
00187 this->Modified();
00188 }
00189 ScalarType GetMaximumDepth()
const
00190
{
return m_MaximumDepth; }
00191
00195
void Copy(
const Self& o)
00196 {
00197 m_HashMap = o.
m_HashMap;
00198 m_MaximumDepth = o.
m_MaximumDepth;
00199 }
00200
00201
protected:
00202 SegmentTable() {}
00203 virtual ~SegmentTable() {}
00204
void PrintSelf(std::ostream& os,
Indent indent)
const;
00205
00206 HashMapType m_HashMap;
00207 ScalarType m_MaximumDepth;
00208
00210 void UpdateOutputInformation();
00211 bool VerifyRequestedRegion() {
return true; }
00212
void SetRequestedRegionToLargestPossibleRegion () {}
00213
bool RequestedRegionIsOutsideOfTheBufferedRegion () {
return false; }
00214 void SetRequestedRegion (
itk::DataObject *) {}
00215
00216
private:
00217
void operator=(
const Self&) {}
00218
00219 };
00220
00221 }
00222 }
00223
00224
#ifndef ITK_MANUAL_INSTANTIATION
00225
#include "itkWatershedSegmentTable.txx"
00226
#endif
00227
00228
#endif
00229