/* * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) * * This file is part of Orfeo Toolbox * * https://www.orfeo-toolbox.org/ * * 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 * * http://www.apache.org/licenses/LICENSE-2.0 * * 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 otbSarBrightnessFunction_hxx #define otbSarBrightnessFunction_hxx #include "otbSarBrightnessFunction.h" #include "itkNumericTraits.h" namespace otb { /** * Constructor */ template SarBrightnessFunction::SarBrightnessFunction() : m_Scale(1.0) { m_Noise = ParametricFunctionType::New(); m_AntennaPatternNewGain = ParametricFunctionType::New(); m_AntennaPatternOldGain = ParametricFunctionType::New(); m_RangeSpreadLoss = ParametricFunctionType::New(); m_Noise->SetConstantValue(0.0); m_EnableNoise = true; m_AntennaPatternNewGain->SetConstantValue(1.0); m_AntennaPatternOldGain->SetConstantValue(1.0); m_RangeSpreadLoss->SetConstantValue(1.0); } /** * Initialize by setting the input image */ template void SarBrightnessFunction::SetInputImage(const InputImageType* ptr) { Superclass::SetInputImage(ptr); m_Noise->SetInputImage(ptr); m_AntennaPatternNewGain->SetInputImage(ptr); m_AntennaPatternOldGain->SetInputImage(ptr); m_RangeSpreadLoss->SetInputImage(ptr); } /** * */ template void SarBrightnessFunction::PrintSelf(std::ostream& os, itk::Indent indent) const { this->Superclass::PrintSelf(os, indent); if (m_Noise) { os << indent << "Noise:\n"; m_Noise->Print(os, indent.GetNextIndent()); } if (m_AntennaPatternNewGain) { os << indent << "AntennaPatternNewGain:\n"; m_AntennaPatternNewGain->Print(os, indent.GetNextIndent()); } if (m_AntennaPatternOldGain) { os << indent << "AntennaPatternOldGain:\n"; m_AntennaPatternOldGain->Print(os, indent.GetNextIndent()); } if (m_RangeSpreadLoss) { os << indent << "RangeSpreadLoss:\n"; m_RangeSpreadLoss->Print(os, indent.GetNextIndent()); } } /** * */ template typename SarBrightnessFunction::OutputType SarBrightnessFunction::EvaluateAtIndex(const IndexType& index) const { RealType result; result = itk::NumericTraits::Zero; if (!this->GetInputImage()) { return (itk::NumericTraits::max()); } if (!this->IsInsideBuffer(index)) { return (itk::NumericTraits::max()); } FunctorRealType noise = itk::NumericTraits::Zero; FunctorRealType antennaPatternNewGain = itk::NumericTraits::Zero; FunctorRealType antennaPatternOldGain = itk::NumericTraits::Zero; FunctorRealType rangeSpreadLoss = itk::NumericTraits::Zero; if (m_EnableNoise) { noise = static_cast(m_Noise->EvaluateAtIndex(index)); } antennaPatternNewGain = static_cast(m_AntennaPatternNewGain->EvaluateAtIndex(index)); antennaPatternOldGain = static_cast(m_AntennaPatternOldGain->EvaluateAtIndex(index)); rangeSpreadLoss = static_cast(m_RangeSpreadLoss->EvaluateAtIndex(index)); FunctorType functor; if (m_EnableNoise) { functor.SetNoise(noise); } functor.SetScale(m_Scale); functor.SetAntennaPatternNewGain(antennaPatternNewGain); functor.SetAntennaPatternOldGain(antennaPatternOldGain); functor.SetRangeSpreadLoss(rangeSpreadLoss); const std::complex pVal = this->GetInputImage()->GetPixel(index); const RealType value = std::sqrt((pVal.real() * pVal.real()) + (pVal.imag() * pVal.imag())); result = functor(value); return static_cast(result); } } // end namespace otb #endif