/*========================================================================= * * 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 itkCannySegmentationLevelSetFunction_hxx #define itkCannySegmentationLevelSetFunction_hxx #include "itkGradientImageFilter.h" #include "itkMultiplyImageFilter.h" #include "itkImageRegionIterator.h" #include "itkImageAlgorithm.h" namespace itk { template void CannySegmentationLevelSetFunction::CalculateSpeedImage() { // Create a distance transform to the canny edges this->CalculateDistanceImage(); // Graft the distance transform into the Speed Image this->GetSpeedImage()->Graft(m_Distance->GetOutput()); } template void CannySegmentationLevelSetFunction::CalculateAdvectionImage() { typename GradientImageFilter::Pointer gradient = GradientImageFilter::New(); using CovariantVectorImageType = typename GradientImageFilter::OutputImageType; typename MultiplyImageFilter::Pointer multiply = MultiplyImageFilter::New(); // Create a distance transform to the canny edges this->CalculateDistanceImage(); gradient->SetInput(m_Distance->GetOutput()); gradient->Update(); multiply->SetInput1(gradient->GetOutput()); multiply->SetInput2(m_Distance->GetOutput()); // multiply->GraftOutput(dynamic_cast(this->GetAdvectionImage())); multiply->Update(); // Copy output to Advection Image ImageAlgorithm::Copy(multiply->GetOutput(), this->GetAdvectionImage(), this->GetAdvectionImage()->GetRequestedRegion(), this->GetAdvectionImage()->GetRequestedRegion()); } template void CannySegmentationLevelSetFunction::CalculateDistanceImage() { auto tempFeature = TFeatureImageType::New(); // The minipipeline might muck with its feature image requested // region. The rest of the class relies on the feature image requested // region as specified by the original level set // filter. We make a temporary shallow copy of feature image to // build the distance image. tempFeature->Graft(this->GetFeatureImage()); // AssignCannyInput either sets up a pipeline through the // CastImageFilter if TImageType != TFeatureImageType // or bypasses the Cast operation if TImageType == TFeatureType typename TImageType::Pointer junk; this->AssignCannyInput(tempFeature, junk); m_Canny->SetUpperThreshold(m_Threshold); m_Canny->SetVariance(m_Variance); m_Canny->SetMaximumError(0.01); m_Distance->SetInput(m_Canny->GetOutput()); m_Distance->GetOutput()->SetRequestedRegion(this->GetSpeedImage()->GetRequestedRegion()); m_Distance->Update(); } } // end namespace itk #endif