ITK
4.1.0
Insight Segmentation and Registration Toolkit
|
00001 /*========================================================================= 00002 * 00003 * Copyright Insight Software Consortium 00004 * 00005 * Licensed under the Apache License, Version 2.0 (the "License"); 00006 * you may not use this file except in compliance with the License. 00007 * You may obtain a copy of the License at 00008 * 00009 * http://www.apache.org/licenses/LICENSE-2.0.txt 00010 * 00011 * Unless required by applicable law or agreed to in writing, software 00012 * distributed under the License is distributed on an "AS IS" BASIS, 00013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00014 * See the License for the specific language governing permissions and 00015 * limitations under the License. 00016 * 00017 *=========================================================================*/ 00018 #ifndef __itkMultiphaseSparseFiniteDifferenceImageFilter_h 00019 #define __itkMultiphaseSparseFiniteDifferenceImageFilter_h 00020 00021 #include "itkMultiphaseFiniteDifferenceImageFilter.h" 00022 #include "itkZeroCrossingImageFilter.h" 00023 #include "itkImageRegionConstIterator.h" 00024 #include "itkShiftScaleImageFilter.h" 00025 #include "itkNeighborhoodAlgorithm.h" 00026 #include "itkSparseFieldLevelSetImageFilter.h" 00027 00028 #include <vector> 00029 00030 namespace itk 00031 { 00176 template< class TInputImage, class TFeatureImage, class TOutputImage, class TFunction, 00177 typename TIdCell = unsigned int > 00178 class ITK_EXPORT MultiphaseSparseFiniteDifferenceImageFilter: 00179 public MultiphaseFiniteDifferenceImageFilter< TInputImage, 00180 TFeatureImage, TOutputImage, TFunction, TIdCell > 00181 { 00182 public: 00183 00185 typedef MultiphaseSparseFiniteDifferenceImageFilter Self; 00186 typedef MultiphaseFiniteDifferenceImageFilter< TInputImage, 00187 TFeatureImage, TOutputImage, TFunction, TIdCell > Superclass; 00188 typedef SmartPointer< Self > Pointer; 00189 typedef SmartPointer< const Self > ConstPointer; 00190 00192 itkNewMacro(Self); 00193 00195 itkTypeMacro(MultiphaseSparseFiniteDifferenceImageFilter, MultiphaseFiniteDifferenceImageFilter); 00196 00197 itkStaticConstMacro(ImageDimension, unsigned int, Superclass::ImageDimension); 00198 00200 typedef typename Superclass::TimeStepType TimeStepType; 00201 00203 typedef typename Superclass::InputImageType InputImageType; 00204 typedef typename Superclass::InputImagePointer InputImagePointer; 00205 typedef typename Superclass::InputRegionType InputRegionType; 00206 typedef typename Superclass::InputSizeType InputSizeType; 00207 typedef typename Superclass::InputSizeValueType InputSizeValueType; 00208 typedef typename Superclass::InputIndexType InputIndexType; 00209 typedef typename Superclass::InputIndexValueType InputIndexValueType; 00210 typedef typename Superclass::InputPixelType InputPixelType; 00211 typedef typename Superclass::InputPointType InputPointType; 00212 typedef typename Superclass::InputSpacingType InputSpacingType; 00213 typedef typename Superclass::InputOffsetValueType InputOffsetValueType; 00214 00215 typedef typename Superclass::FeatureImageType FeatureImageType; 00216 typedef typename Superclass::FeatureSizeType FeatureSizeType; 00217 typedef typename Superclass::FeatureImagePointer FeatureImagePointer; 00218 typedef typename Superclass::FeatureRegionType FeatureRegionType; 00219 typedef typename Superclass::FeatureSpacingType FeatureSpacingType; 00220 typedef typename Superclass::FeaturePointType FeaturePointType; 00221 00222 typedef typename Superclass::OutputImageType OutputImageType; 00223 typedef typename Superclass::OutputImagePointer OutputImagePointer; 00224 typedef typename Superclass::OutputRegionType OutputRegionType; 00225 typedef typename Superclass::OutputSizeType OutputSizeType; 00226 typedef typename Superclass::OutputIndexType OutputIndexType; 00227 typedef typename Superclass::OutputIndexValueType OutputIndexValueType; 00228 typedef typename Superclass::OutputPixelType OutputPixelType; 00229 00230 typedef typename InputImageType::ValueType ValueType; 00231 typedef typename Superclass::IdCellType IdCellType; 00232 00233 typedef typename Superclass::FiniteDifferenceFunctionType 00234 FiniteDifferenceFunctionType; 00235 typedef typename Superclass::FiniteDifferenceFunctionPointer 00236 FiniteDifferenceFunctionPointer; 00237 typedef typename FiniteDifferenceFunctionType::FloatOffsetType 00238 FiniteDifferenceFunctionFloatOffsetType; 00239 00241 typedef SparseFieldLevelSetNode< OutputIndexType > LayerNodeType; 00242 00244 typedef SparseFieldLayer< LayerNodeType > LayerType; 00245 typedef typename LayerType::Pointer LayerPointerType; 00246 typedef typename LayerType::Iterator LayerIterator; 00247 typedef typename LayerType::ConstIterator LayerConstIterator; 00248 00250 typedef std::vector< LayerPointerType > LayerListType; 00251 typedef typename LayerListType::iterator LayerListIterator; 00252 typedef typename LayerListType::const_iterator LayerListConstIterator; 00253 00255 typedef signed char StatusType; 00256 00259 typedef Image< StatusType, itkGetStaticConstMacro(ImageDimension) > 00260 StatusImageType; 00261 typedef typename StatusImageType::Pointer StatusImagePointer; 00262 00263 typedef ZeroCrossingImageFilter< InputImageType, InputImageType > 00264 ZeroCrossingFilterType; 00265 typedef typename ZeroCrossingFilterType::Pointer 00266 ZeroCrossingFilterPointer; 00267 00268 typedef NeighborhoodAlgorithm::ImageBoundaryFacesCalculator< StatusImageType > BFCType; 00269 00272 typedef ObjectStore< LayerNodeType > LayerNodeStorageType; 00273 typedef typename LayerNodeStorageType::Pointer LayerNodeStoragePointer; 00274 00276 typedef std::vector< ValueType > UpdateBufferType; 00277 typedef typename UpdateBufferType::const_iterator UpdateBufferConstIterator; 00278 00279 typedef SparseFieldCityBlockNeighborList< NeighborhoodIterator< OutputImageType > > NeighborListType; 00280 typedef typename NeighborListType::OffsetType OffsetType; 00281 00285 itkSetMacro(NumberOfLayers, unsigned int); 00286 itkGetConstMacro(NumberOfLayers, unsigned int); 00288 00290 itkSetMacro(IsoSurfaceValue, ValueType); 00291 itkGetConstMacro(IsoSurfaceValue, ValueType); 00293 00298 itkSetMacro(InterpolateSurfaceLocation, bool); 00299 itkGetConstMacro(InterpolateSurfaceLocation, bool); 00301 00303 void InterpolateSurfaceLocationOn() 00304 { this->SetInterpolateSurfaceLocation(true); } 00305 void InterpolateSurfaceLocationOff() 00306 { this->SetInterpolateSurfaceLocation(false); } 00308 00309 void SetFunctionCount(const IdCellType & n) 00310 { 00311 this->Superclass::SetFunctionCount(n); 00312 00313 m_SparseData.resize(this->m_FunctionCount, 0); 00314 00315 for ( IdCellType i = 0; i < this->m_FunctionCount; i++ ) 00316 { 00317 m_SparseData[i] = new SparseDataStruct(i); 00318 } 00319 } 00320 00321 #ifdef ITK_USE_CONCEPT_CHECKING 00322 00323 itkConceptMacro( OutputEqualityComparableCheck, 00324 ( Concept::EqualityComparable< typename TOutputImage::PixelType > ) ); 00325 itkConceptMacro( DoubleConvertibleToOutputCheck, 00326 ( Concept::Convertible< double, typename TOutputImage::PixelType > ) ); 00327 itkConceptMacro( OutputOStreamWritableCheck, 00328 ( Concept::OStreamWritable< typename TOutputImage::PixelType > ) ); 00329 00331 #endif 00332 protected: 00333 MultiphaseSparseFiniteDifferenceImageFilter(); 00334 ~MultiphaseSparseFiniteDifferenceImageFilter() 00335 { 00336 while ( !m_SparseData.empty() ) 00337 { 00338 if ( m_SparseData.back() ) 00339 { 00340 delete m_SparseData.back(); 00341 } 00342 m_SparseData.pop_back(); 00343 } 00344 } 00346 00347 virtual void PrintSelf(std::ostream & os, Indent indent) const; 00348 00349 // This data structure is created for each phase 00350 struct SparseDataStruct { 00351 SparseDataStruct(const IdCellType & index) 00352 { 00353 m_LayerNodeStore = LayerNodeStorageType::New(); 00354 m_LayerNodeStore->SetGrowthStrategyToExponential(); 00355 m_Index = index; 00356 } 00357 00362 LayerListType m_Layers; 00363 00365 StatusImagePointer m_StatusImage; 00366 00368 LayerNodeStoragePointer m_LayerNodeStore; 00369 00372 UpdateBufferType m_UpdateBuffer; 00373 00374 IdCellType m_Index; 00375 }; 00376 00378 NeighborListType m_NeighborList; 00379 00381 std::vector< ValueType > m_PixelDistance; 00382 00387 inline virtual ValueType CalculateUpdateValue( 00388 const OutputIndexType & itkNotUsed(idx), 00389 const TimeStepType & dt, 00390 const ValueType & value, 00391 const ValueType & change) 00392 { 00393 return ( value + dt * change ); 00394 } 00395 00399 virtual void PostProcessOutput(); 00400 00405 virtual void InitializeBackgroundPixels(); 00406 00408 void Initialize(); 00409 00414 void CopyInputToOutput(); 00415 00417 void AllocateUpdateBuffer(){} 00418 00421 void ApplyUpdate(TimeStepType dt); 00422 00425 TimeStepType CalculateChange(); 00426 00430 void ConstructLayer(SparseDataStruct *sparsePtr, StatusType from, StatusType 00431 to); 00432 00437 void ConstructActiveLayer(); 00438 00440 void InitializeActiveLayerValues(); 00441 00444 void InitializeBackgroundConstants(); 00445 00453 void PropagateLayerValues(SparseDataStruct *sparsePtr, StatusType from, 00454 StatusType to, StatusType promote, int InOrOut); 00455 00460 void PropagateAllLayerValues(); 00461 00462 void PropagateFunctionLayerValues(unsigned int functionIndex); 00463 00467 void UpdateActiveLayerValues(TimeStepType dt, LayerType *StatusUpList, 00468 LayerType *StatusDownList); 00469 00471 void ProcessStatusList(LayerType *InputList, LayerType *OutputList, 00472 StatusType ChangeToStatus, StatusType SearchForStatus); 00473 00475 void ProcessOutsideList(LayerType *OutsideList, StatusType ChangeToStatus); 00476 00477 void InitializeIteration(); 00478 00479 virtual void UpdatePixel( unsigned int itkNotUsed(functionIndex), unsigned int itkNotUsed(idx), 00480 NeighborhoodIterator< InputImageType > & itkNotUsed(iterator), ValueType & itkNotUsed( 00481 newValue), 00482 bool & itkNotUsed(status) ){} 00483 00484 itkGetConstMacro(ValueZero, ValueType); 00485 itkGetConstMacro(ValueOne, ValueType); 00486 00489 static double m_ConstantGradientValue; 00490 00492 static const ValueType m_ValueOne; 00493 00495 static const ValueType m_ValueZero; 00496 00499 static const StatusType m_StatusChanging; 00500 00503 static const StatusType m_StatusActiveChangingUp; 00504 00507 static const StatusType m_StatusActiveChangingDown; 00508 00511 static const StatusType m_StatusBoundaryPixel; 00512 00515 static const StatusType m_StatusNull; 00516 00517 std::vector< SparseDataStruct * > m_SparseData; 00518 00522 unsigned int m_NumberOfLayers; 00523 00525 ValueType m_IsoSurfaceValue; 00526 00528 ValueType m_BackgroundValue; 00529 00534 bool m_InterpolateSurfaceLocation; 00535 private: 00536 MultiphaseSparseFiniteDifferenceImageFilter(const Self &); 00537 void operator=(const Self &); //purposely not implemented 00539 00540 unsigned int m_CurrentFunctionIndex; 00541 00542 double m_RMSSum; 00543 unsigned int m_RMSCounter; 00544 00547 bool m_BoundsCheckingActive; 00548 }; 00549 } // end namespace itk 00550 00551 #ifndef ITK_MANUAL_INSTANTIATION 00552 #include "itkMultiphaseSparseFiniteDifferenceImageFilter.hxx" 00553 #endif 00554 00555 #endif 00556