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