File: cmtkLabelCombinationLocalWeighting.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 (133 lines) | stat: -rw-r--r-- 4,096 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
132
133
/*
//
//  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 __cmtkLabelCombinationLocalWeighting_h_included_
#define __cmtkLabelCombinationLocalWeighting_h_included_

#include <cmtkconfig.h>

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

#include <Base/cmtkUniformVolume.h>

#include <vector>

namespace
cmtk
{

/** \addtogroup Segmentation */
//@{

/** Base class for segmentation combination using local weighting.
 */
class LabelCombinationLocalWeighting
{
public:
  /// This class.
  typedef LabelCombinationLocalWeighting Self;

  /// Smart pointer to this class.
  typedef SmartPointer<Self> SmartPtr;

  /// Smart pointer to const to this class.
  typedef SmartConstPointer<Self> SmartConstPtr;

  /// Constructor: compute label combination.
  LabelCombinationLocalWeighting( const UniformVolume::SmartConstPtr targetImage ) : 
    m_TargetImage( targetImage ),
    m_PatchRadius( 1 ),
    m_PatchRadiusPlusOne( 2 ),
    m_SearchRegion( UniformVolume::IndexType( 0 ), UniformVolume::IndexType( 1 ) )
  {}
  
  /// Add an atlas image (reformatted, target-matched intensity image).
  void AddAtlasImage( const UniformVolume::SmartConstPtr image );

  /** Exclude global outliers.
   * Detect atlases with abnormally low correlation between reformatted atlas and target image,
   * then delete these atlases. Outliers are defined as NCC below Q1-1.5*(Q3-Q1), where Q1 is
   * the 25th percentile of NCC between atlas and target over all atlases, Q3 is the 75th 
   * percentile.
   */
  void ExcludeGlobalOutliers();

  /// Set patch radius.
  void SetPatchRadius( const int radius )
  {
    this->m_PatchRadius = UniformVolume::IndexType( radius );
    this->m_PatchRadiusPlusOne = UniformVolume::IndexType( radius+1 );
  }

  /// Set patch radius.
  void SetSearchRadius( const int radius )
  {
    this->m_SearchRegion.From() = UniformVolume::IndexType( -radius );
    this->m_SearchRegion.To() = UniformVolume::IndexType( radius+1 );
  }
  
  /// Get resulting combined segmentation.
  virtual TypedArray::SmartPtr GetResult() const = 0;
  
protected:
  /// Target image region type.
  typedef UniformVolume::RegionType TargetRegionType;

  /// The target image.
  UniformVolume::SmartConstPtr m_TargetImage;
  
  /// Vector of target-matched atlas images.
  std::vector<UniformVolume::SmartConstPtr> m_AtlasImages;

  /// Image patch radius in pixels (x,y,z).
  UniformVolume::IndexType m_PatchRadius;

  /// Image patch radius in pixels (x,y,z) plus one added to each dimension.
  UniformVolume::IndexType m_PatchRadiusPlusOne;

  /// Patch search region in pixels (x,y,z).
  UniformVolume::RegionType m_SearchRegion;

  /** Delete atlas with given index. 
   * Derived classes may need to overload this to make sure additional  atlas components (e.g.,
   * distance map, label map) are also properly deleted.
   */
  virtual void DeleteAtlas( const size_t i )
  {
    this->m_AtlasImages.erase( this->m_AtlasImages.begin() + i );
  }
};

} // namespace cmtk

#endif // #ifndef __cmtkLabelCombinationLocalWeighting_h_included_