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_
|