File: cmtkUniformDistanceMap.h

package info (click to toggle)
cmtk 3.3.1p2%2Bdfsg-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 10,524 kB
  • sloc: cpp: 87,098; ansic: 23,347; sh: 3,896; xml: 1,551; perl: 707; makefile: 334
file content (131 lines) | stat: -rw-r--r-- 4,156 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/*
//
//  Copyright 1997-2009 Torsten Rohlfing
//
//  Copyright 2004-2012 SRI International
//
//  This file is part of the Computational Morphometry Toolkit.
//
//  http://www.nitrc.org/projects/cmtk/
//
//  The Computational Morphometry Toolkit is free software: you can
//  redistribute it and/or modify it under the terms of the GNU General Public
//  License as published by the Free Software Foundation, either version 3 of
//  the License, or (at your option) any later version.
//
//  The Computational Morphometry Toolkit is distributed in the hope that it
//  will be useful, but WITHOUT ANY WARRANTY; without even the implied
//  warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//  GNU General Public License for more details.
//
//  You should have received a copy of the GNU General Public License along
//  with the Computational Morphometry Toolkit.  If not, see
//  <http://www.gnu.org/licenses/>.
//
//  $Revision: 5436 $
//
//  $LastChangedDate: 2018-12-10 19:01:20 -0800 (Mon, 10 Dec 2018) $
//
//  $LastChangedBy: torstenrohlfing $
//
*/

#ifndef __cmtkUniformDistanceMap_h_included_
#define __cmtkUniformDistanceMap_h_included_

#include <cmtkconfig.h>

#include <Base/cmtkDistanceMap.h>
#include <Base/cmtkUniformVolume.h>

#include <System/cmtkSmartPtr.h>
#include <System/cmtkThreads.h>

#include <vector>

namespace
cmtk
{

/** \addtogroup Base */
//@{
/** Distance map on a uniform grid.
 *\author This class is based on code originally written by Calvin R. Maurer, Jr.
 */
template<class TDistanceDataType>
class UniformDistanceMap : public DistanceMap
{
public:
  /** This class. */
  typedef UniformDistanceMap<TDistanceDataType> Self;

  /** Superclass. */
  typedef DistanceMap Superclass;

  /// Smart pointer to distance map.
  typedef SmartPointer<Self> SmartPtr;

  /// Smart pointer to distance map.
  typedef SmartConstPointer<Self> SmartConstPtr;

  /** Distance data type. */
  typedef TDistanceDataType DistanceDataType;

  /** Construct map from given volume.
   *\param volume 3-D feature image.
   *\param flags Computation flags.
   *\param value Feature value
   *\param window Window radius around feature value.
   */
  UniformDistanceMap( const UniformVolume& volume, const byte flags = Self::DEFAULT, const Types::DataItem value = 0, const Types::DataItem window = 0 );

  // Get the computed distance map.
  UniformVolume::SmartPtr Get()
  {
    return this->m_DistanceMap;
  }

private:
  /// Compute distance map.
  void BuildDistanceMap( const UniformVolume& volume, const byte flags, const Types::DataItem value=0, const Types::DataItem window = 0 );
  
  /// Compute 3-D Euclidean Distance Transformation.
  void ComputeEDT( DistanceDataType *const distance );

  /// Compute 2-D Euclidean Distance Transformation for one image plane.
  void ComputeEDT2D( DistanceDataType *const plane, std::vector<DistanceDataType>& gTemp, std::vector<DistanceDataType>& hTemp );

  /// Compute 1-D Voronoi Euclidean Distance Transform.
  bool VoronoiEDT( DistanceDataType *const lpY, const int nSize, const DistanceDataType delta, std::vector<DistanceDataType>& gTemp, std::vector<DistanceDataType>& hTemp );

  /// Internal: pointer to row storage.
  std::vector< std::vector<DistanceDataType> > m_G;

  /// Internal: pointer to row storage.
  std::vector< std::vector<DistanceDataType> > m_H;

  /** Thread parameters. */
  class ThreadParametersEDT :
    /** Inherit from standard parameters. */
    public ThreadParameters<Self>
  {
  public:
    /** Distance map pointer. */
    DistanceDataType* m_Distance;
  };
  
  /** Thread function for first phase (xy) of EDT computation. */
  static void ComputeEDTThreadPhase1( void *const args, const size_t taskIdx, const size_t taskCnt, const size_t threadIdx, const size_t );

  /** Thread function for second phase (z) of EDT computation. */
  static void ComputeEDTThreadPhase2( void *const args, const size_t taskIdx, const size_t taskCnt, const size_t threadIdx, const size_t );

  /// The computed distance map.
  UniformVolume::SmartPtr m_DistanceMap;
};

//@}

} // namespace cmtk

#endif // #ifndef __cmtkDistanceMap_h_included_