00001 /* 00002 // 00003 // Copyright 1997-2009 Torsten Rohlfing 00004 // 00005 // Copyright 2004-2010 SRI International 00006 // 00007 // This file is part of the Computational Morphometry Toolkit. 00008 // 00009 // http://www.nitrc.org/projects/cmtk/ 00010 // 00011 // The Computational Morphometry Toolkit is free software: you can 00012 // redistribute it and/or modify it under the terms of the GNU General Public 00013 // License as published by the Free Software Foundation, either version 3 of 00014 // the License, or (at your option) any later version. 00015 // 00016 // The Computational Morphometry Toolkit is distributed in the hope that it 00017 // will be useful, but WITHOUT ANY WARRANTY; without even the implied 00018 // warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00019 // GNU General Public License for more details. 00020 // 00021 // You should have received a copy of the GNU General Public License along 00022 // with the Computational Morphometry Toolkit. If not, see 00023 // <http://www.gnu.org/licenses/>. 00024 // 00025 // $Revision: 2398 $ 00026 // 00027 // $LastChangedDate: 2010-10-05 14:54:37 -0700 (Tue, 05 Oct 2010) $ 00028 // 00029 // $LastChangedBy: torstenrohlfing $ 00030 // 00031 */ 00032 00033 #include <Registration/cmtkImagePairSimilarityMeasure.h> 00034 00035 #include <Base/cmtkUniformVolumeInterpolator.h> 00036 #include <Base/cmtkLinearInterpolator.h> 00037 #include <Base/cmtkNearestNeighborInterpolator.h> 00038 00039 #include <Registration/cmtkReformatVolume.h> 00040 00041 namespace 00042 cmtk 00043 { 00044 00047 00048 ImagePairSimilarityMeasure::ImagePairSimilarityMeasure 00049 ( const UniformVolume::SmartConstPtr& refVolume, const UniformVolume::SmartConstPtr& fltVolume, const Interpolators::InterpolationEnum interpolation ) 00050 : m_InterpolationMethod( interpolation ) 00051 { 00052 this->SetReferenceVolume( refVolume ); 00053 this->SetFloatingVolume( fltVolume ); 00054 } 00055 00056 void 00057 ImagePairSimilarityMeasure::SetReferenceVolume( const UniformVolume::SmartConstPtr& refVolume ) 00058 { 00059 this->m_ReferenceVolume = refVolume; 00060 this->m_ReferenceData = this->m_ReferenceVolume->GetData(); 00061 } 00062 00063 void 00064 ImagePairSimilarityMeasure::SetFloatingVolume( const UniformVolume::SmartConstPtr& fltVolume ) 00065 { 00066 this->m_FloatingVolume = fltVolume; 00067 this->m_FloatingData = fltVolume->GetData(); 00068 00069 if ( this->m_InterpolationMethod == Interpolators::DEFAULT ) 00070 { 00071 // decide based on floating image data class. 00072 switch ( this->m_FloatingData->GetDataClass() ) 00073 { 00074 case DATACLASS_UNKNOWN : 00075 case DATACLASS_GREY : 00076 this->m_InterpolationMethod = Interpolators::LINEAR; 00077 this->m_FloatingImageInterpolator = cmtk::UniformVolumeInterpolatorBase::SmartPtr( new cmtk::UniformVolumeInterpolator<cmtk::Interpolators::Linear>( *fltVolume ) ); 00078 break; 00079 case DATACLASS_LABEL : 00080 this->m_InterpolationMethod = Interpolators::NEAREST_NEIGHBOR; 00081 this->m_FloatingImageInterpolator = cmtk::UniformVolumeInterpolatorBase::SmartPtr( new cmtk::UniformVolumeInterpolator<cmtk::Interpolators::NearestNeighbor>( *fltVolume ) ); 00082 break; 00083 } 00084 } 00085 else 00086 { 00087 this->m_FloatingImageInterpolator = ReformatVolume::CreateInterpolator( this->m_InterpolationMethod, fltVolume ); 00088 } 00089 } 00090 00091 } // namespace cmtk