/*========================================================================= * * 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 itkThresholdSegmentationLevelSetFunction_hxx #define itkThresholdSegmentationLevelSetFunction_hxx #include "itkImageRegionIterator.h" #include "itkGradientAnisotropicDiffusionImageFilter.h" #include "itkLaplacianImageFilter.h" namespace itk { template void ThresholdSegmentationLevelSetFunction::CalculateSpeedImage() { typename GradientAnisotropicDiffusionImageFilter::Pointer diffusion = GradientAnisotropicDiffusionImageFilter::New(); typename LaplacianImageFilter::Pointer laplacian = LaplacianImageFilter::New(); ImageRegionIterator lit; ImageRegionConstIterator fit(this->GetFeatureImage(), this->GetFeatureImage()->GetRequestedRegion()); ImageRegionIterator sit(this->GetSpeedImage(), this->GetFeatureImage()->GetRequestedRegion()); if (m_EdgeWeight != 0.0) { diffusion->SetInput(this->GetFeatureImage()); diffusion->SetConductanceParameter(m_SmoothingConductance); diffusion->SetTimeStep(m_SmoothingTimeStep); diffusion->SetNumberOfIterations(m_SmoothingIterations); laplacian->SetInput(diffusion->GetOutput()); laplacian->Update(); lit = ImageRegionIterator(laplacian->GetOutput(), this->GetFeatureImage()->GetRequestedRegion()); lit.GoToBegin(); } // Copy the meta information (spacing and origin) from the feature image this->GetSpeedImage()->CopyInformation(this->GetFeatureImage()); // Calculate the speed image auto upper_threshold = static_cast(m_UpperThreshold); auto lower_threshold = static_cast(m_LowerThreshold); ScalarValueType mid = ((upper_threshold - lower_threshold) / 2.0) + lower_threshold; ScalarValueType threshold; for (fit.GoToBegin(), sit.GoToBegin(); !fit.IsAtEnd(); ++sit, ++fit) { if (static_cast(fit.Get()) < mid) { threshold = fit.Get() - lower_threshold; } else { threshold = upper_threshold - fit.Get(); } if (m_EdgeWeight != 0.0) { sit.Set(static_cast(threshold + m_EdgeWeight * lit.Get())); ++lit; } else { sit.Set(static_cast(threshold)); } } } } // end namespace itk #endif