/*========================================================================= * * Copyright NumFOCUS * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0.txt * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * *=========================================================================*/ #ifndef itkLaplacianSegmentationLevelSetFunction_h #define itkLaplacianSegmentationLevelSetFunction_h #include "itkSegmentationLevelSetFunction.h" namespace itk { /** \class LaplacianSegmentationLevelSetFunction * * \brief This function is used in LaplacianSegmentationImageFilter to * segment structures in an image based Laplacian edges. * * Assumes a strictly POSITIVE feature image * \ingroup ITKLevelSets */ template class ITK_TEMPLATE_EXPORT LaplacianSegmentationLevelSetFunction : public SegmentationLevelSetFunction { public: ITK_DISALLOW_COPY_AND_MOVE(LaplacianSegmentationLevelSetFunction); /** Standard class type aliases. */ using Self = LaplacianSegmentationLevelSetFunction; using Superclass = SegmentationLevelSetFunction; using Pointer = SmartPointer; using ConstPointer = SmartPointer; using FeatureImageType = TFeatureImageType; /** Method for creation through the object factory. */ itkNewMacro(Self); /** \see LightObject::GetNameOfClass() */ itkOverrideGetNameOfClassMacro(LaplacianSegmentationLevelSetFunction); /** Extract some parameters from the superclass. */ using typename Superclass::ImageType; using typename Superclass::ScalarValueType; using typename Superclass::FeatureScalarType; using typename Superclass::RadiusType; /** Extract some parameters from the superclass. */ static constexpr unsigned int ImageDimension = Superclass::ImageDimension; void CalculateSpeedImage() override; void Initialize(const RadiusType & r) override { Superclass::Initialize(r); this->SetAdvectionWeight(ScalarValueType{}); this->SetPropagationWeight(-1.0 * NumericTraits::OneValue()); this->SetCurvatureWeight(NumericTraits::OneValue()); } /** * The Laplacian level set does not use an advection term. We clamp * the value to ZERO here because a superclass may try to set it * otherwise. in fact, SegmentationLevelSetImageFilter tries to set * it when SetFeatureScaling is called. */ void SetAdvectionWeight(const ScalarValueType value) override { if (Math::ExactlyEquals(value, ScalarValueType{})) { Superclass::SetAdvectionWeight(value); } } protected: LaplacianSegmentationLevelSetFunction() { this->SetAdvectionWeight(0.0); this->SetPropagationWeight(1.0); this->SetCurvatureWeight(1.0); } ~LaplacianSegmentationLevelSetFunction() override = default; }; } // end namespace itk #ifndef ITK_MANUAL_INSTANTIATION # include "itkLaplacianSegmentationLevelSetFunction.hxx" # include "itkMath.h" #endif #endif