From 3c68b9d72befe87ecc0616811e14722fbf80cfd4 Mon Sep 17 00:00:00 2001 From: Mickael Savinaud <mickael.savinaud@c-s.fr> Date: Tue, 20 May 2014 23:59:48 +0200 Subject: [PATCH] ENH: add a way to compute atmospheric radiative terms --- .../otbAtmosphericRadiativeTerms2.cxx | 610 ++++++++++++++++++ .../otbAtmosphericRadiativeTerms2.h | 276 ++++++++ ...ionParametersToAtmosphericRadiativeTerms.h | 112 ++++ Testing/Code/Radiometry/CMakeLists.txt | 11 + ...nParametersToAtmosphericRadiativeTerms.cxx | 175 +++++ .../Code/Radiometry/otbRadiometryTests4.cxx | 1 + 6 files changed, 1185 insertions(+) create mode 100644 Code/Radiometry/otbAtmosphericRadiativeTerms2.cxx create mode 100644 Code/Radiometry/otbAtmosphericRadiativeTerms2.h create mode 100644 Code/Radiometry/otbRadiometryCorrectionParametersToAtmosphericRadiativeTerms.h create mode 100644 Testing/Code/Radiometry/otbAtmosphericCorrectionParametersToAtmosphericRadiativeTerms.cxx diff --git a/Code/Radiometry/otbAtmosphericRadiativeTerms2.cxx b/Code/Radiometry/otbAtmosphericRadiativeTerms2.cxx new file mode 100644 index 0000000000..846b9e4a09 --- /dev/null +++ b/Code/Radiometry/otbAtmosphericRadiativeTerms2.cxx @@ -0,0 +1,610 @@ +/*========================================================================= + + Program: ORFEO Toolbox + Language: C++ + Date: $Date$ + Version: $Revision$ + + + Copyright (c) Centre National d'Etudes Spatiales. All rights reserved. + See OTBCopyright.txt for details. + + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the above copyright notices for more information. + +=========================================================================*/ + +#include "otbAtmosphericRadiativeTerms2.h" + +namespace otb +{ +/************** AtmosphericRadiativeTermsSingleChannel2******************/ +/** Constructor */ +AtmosphericRadiativeTermsSingleChannel2::AtmosphericRadiativeTermsSingleChannel2() : + m_IntrinsicAtmosphericReflectance(0.04), + m_SphericalAlbedo(0.09), + m_TotalGaseousTransmission(0.95), + m_DownwardTransmittance(0.91), + m_UpwardTransmittance(0.94), + m_UpwardDiffuseTransmittance(0.09), + m_UpwardDirectTransmittance(0.85), + m_UpwardDiffuseTransmittanceForRayleigh(0.05), + m_UpwardDiffuseTransmittanceForAerosol(0.04), + m_WavelengthSpectralBand(0.0) +{ +} + +/**PrintSelf method */ +void +AtmosphericRadiativeTermsSingleChannel2 +::PrintSelf(std::ostream& os, itk::Indent indent) const +{ + Superclass::PrintSelf(os, indent); + os << indent << "Atmospheric Intrinsic Reflectance : " << m_IntrinsicAtmosphericReflectance << std::endl; + os << indent << "Atmosphere Shperical Albedo : " << m_SphericalAlbedo << std::endl; + os << indent << "Total Gaseous Transmission : " << m_TotalGaseousTransmission << std::endl; + os << indent << "Atmospher Downward Transmittance : " << m_DownwardTransmittance << std::endl; + os << indent << "Atmospher Upward Transmittance : " << m_UpwardTransmittance << std::endl; + os << indent << "Upward Diffuse Transmittance : " << m_UpwardDiffuseTransmittance << std::endl; + os << indent << "Upward Direct Transmittance : " << m_UpwardDirectTransmittance << std::endl; + os << indent << "Upward Diffuse Transmittance for Rayleigh: " << m_UpwardDiffuseTransmittanceForRayleigh << std::endl; + os << indent << "Upward Diffuse Transmittance for aerosols: " << m_UpwardDiffuseTransmittanceForAerosol << std::endl; +} + +/***************** AtmosphericRadiativeTerms **************************/ +/**CONSTRUCTOR. */ +AtmosphericRadiativeTerms2 +::AtmosphericRadiativeTerms2() +{ + m_Values.clear(); + m_IsInitialized = false; +} + +void +AtmosphericRadiativeTerms2 +::ValuesInitialization(unsigned int nbChannel) +{ + for (unsigned int j = 0; j < nbChannel; ++j) + { + ValueType temp = AtmosphericRadiativeTermsSingleChannel2::New(); + m_Values.push_back(temp); + } + m_IsInitialized = true; +} + +/** SET ACCESSORS WITH VECTORS. */ +void +AtmosphericRadiativeTerms2 +::SetIntrinsicAtmosphericReflectances(const DataVectorType& vect) +{ + if (!m_IsInitialized) + { + this->ValuesInitialization(vect.size()); + + } + for (unsigned int nbChannel = 0; nbChannel < vect.size(); ++nbChannel) + { + m_Values[nbChannel]->SetIntrinsicAtmosphericReflectance(vect[nbChannel]); + } +} +void +AtmosphericRadiativeTerms2 +::SetSphericalAlbedos(const DataVectorType& vect) +{ + if (!m_IsInitialized) + { + this->ValuesInitialization(vect.size()); + } + for (unsigned int nbChannel = 0; nbChannel < vect.size(); ++nbChannel) + { + m_Values[nbChannel]->SetSphericalAlbedo(vect[nbChannel]); + } +} +void +AtmosphericRadiativeTerms2 +::SetTotalGaseousTransmissions(const DataVectorType& vect) +{ + if (!m_IsInitialized) + { + this->ValuesInitialization(vect.size()); + } + for (unsigned int nbChannel = 0; nbChannel < vect.size(); ++nbChannel) + { + m_Values[nbChannel]->SetTotalGaseousTransmission(vect[nbChannel]); + } + +} +void +AtmosphericRadiativeTerms2 +::SetDownwardTransmittances(const DataVectorType& vect) +{ + if (!m_IsInitialized) + { + this->ValuesInitialization(vect.size()); + } + for (unsigned int nbChannel = 0; nbChannel < vect.size(); ++nbChannel) + { + m_Values[nbChannel]->SetDownwardTransmittance(vect[nbChannel]); + } +} +void +AtmosphericRadiativeTerms2 +::SetUpwardTransmittances(const DataVectorType& vect) +{ + if (!m_IsInitialized) + { + this->ValuesInitialization(vect.size()); + } + for (unsigned int nbChannel = 0; nbChannel < vect.size(); ++nbChannel) + { + m_Values[nbChannel]->SetUpwardTransmittance(vect[nbChannel]); + } +} +void +AtmosphericRadiativeTerms2 +::SetUpwardDiffuseTransmittances(const DataVectorType& vect) +{ + if (!m_IsInitialized) + { + this->ValuesInitialization(vect.size()); + } + for (unsigned int nbChannel = 0; nbChannel < vect.size(); ++nbChannel) + { + m_Values[nbChannel]->SetUpwardDiffuseTransmittance(vect[nbChannel]); + } +} +void +AtmosphericRadiativeTerms2 +::SetUpwardDirectTransmittances(const DataVectorType& vect) +{ + if (!m_IsInitialized) + { + this->ValuesInitialization(vect.size()); + } + for (unsigned int nbChannel = 0; nbChannel < vect.size(); ++nbChannel) + { + m_Values[nbChannel]->SetUpwardDirectTransmittance(vect[nbChannel]); + } +} +void +AtmosphericRadiativeTerms2 +::SetUpwardDiffuseTransmittancesForRayleigh(const DataVectorType& vect) +{ + if (!m_IsInitialized) + { + this->ValuesInitialization(vect.size()); + } + for (unsigned int nbChannel = 0; nbChannel < vect.size(); ++nbChannel) + { + m_Values[nbChannel]->SetUpwardDiffuseTransmittanceForRayleigh(vect[nbChannel]); + } +} +void +AtmosphericRadiativeTerms2 +::SetUpwardDiffuseTransmittancesForAerosol(const DataVectorType& vect) +{ + if (!m_IsInitialized) + { + this->ValuesInitialization(vect.size()); + } + for (unsigned int nbChannel = 0; nbChannel < vect.size(); ++nbChannel) + { + m_Values[nbChannel]->SetUpwardDiffuseTransmittanceForAerosol(vect[nbChannel]); + } +} +void +AtmosphericRadiativeTerms2 +::SetWavelengthSpectralBand(const DataVectorType& vect) +{ + if (!m_IsInitialized) + { + this->ValuesInitialization(vect.size()); + } + for (unsigned int nbChannel = 0; nbChannel < vect.size(); ++nbChannel) + { + m_Values[nbChannel]->SetWavelengthSpectralBand(vect[nbChannel]); + } +} + +/** SET ACCESSORS WITH INDEX. */ +void +AtmosphericRadiativeTerms2 +::SetValueByIndex(unsigned int id, const ValueType& val) +{ + if (m_IsInitialized) + { + if (m_Values.size() < id + 1) + { + while (id >= m_Values.size()) + { + ValueType temp = AtmosphericRadiativeTermsSingleChannel2::New(); + m_Values.push_back(temp); + } + } + m_Values[id] = val; + } + else + { + itkExceptionMacro(<< "Can't insert value before iniatilizing vector value..." << std::endl); + } +} +void +AtmosphericRadiativeTerms2 +::SetIntrinsicAtmosphericReflectance(unsigned int id, const double& val) +{ + if (m_Values.size() < id + 1) + { + while (id >= m_Values.size()) + { + ValueType temp = AtmosphericRadiativeTermsSingleChannel2::New(); + m_Values.push_back(temp); + } + } + m_Values[id]->SetIntrinsicAtmosphericReflectance(val); +} +void +AtmosphericRadiativeTerms2 +::SetSphericalAlbedo(unsigned int id, const double& val) +{ + if (m_Values.size() < id + 1) + { + while (id >= m_Values.size()) + { + ValueType temp = AtmosphericRadiativeTermsSingleChannel2::New(); + m_Values.push_back(temp); + } + } + m_Values[id]->SetSphericalAlbedo(val); +} +void +AtmosphericRadiativeTerms2 +::SetTotalGaseousTransmission(unsigned int id, const double& val) +{ + if (m_Values.size() < id + 1) + { + while (id >= m_Values.size()) + { + ValueType temp = AtmosphericRadiativeTermsSingleChannel2::New(); + m_Values.push_back(temp); + } + } + m_Values[id]->SetTotalGaseousTransmission(val); +} +void +AtmosphericRadiativeTerms2 +::SetDownwardTransmittance(unsigned int id, const double& val) +{ + if (m_Values.size() < id + 1) + { + while (id >= m_Values.size()) + { + ValueType temp = AtmosphericRadiativeTermsSingleChannel2::New(); + m_Values.push_back(temp); + } + } + m_Values[id]->SetDownwardTransmittance(val); +} +void +AtmosphericRadiativeTerms2 +::SetUpwardTransmittance(unsigned int id, const double& val) +{ + if (m_Values.size() < id + 1) + { + while (id >= m_Values.size()) + { + ValueType temp = AtmosphericRadiativeTermsSingleChannel2::New(); + m_Values.push_back(temp); + } + } + m_Values[id]->SetUpwardTransmittance(val); +} +void +AtmosphericRadiativeTerms2 +::SetUpwardDiffuseTransmittance(unsigned int id, const double& val) +{ + if (m_Values.size() < id + 1) + { + while (id >= m_Values.size()) + { + ValueType temp = AtmosphericRadiativeTermsSingleChannel2::New(); + m_Values.push_back(temp); + } + } + m_Values[id]->SetUpwardDiffuseTransmittance(val); +} +void +AtmosphericRadiativeTerms2 +::SetUpwardDirectTransmittance(unsigned int id, const double& val) +{ + if (m_Values.size() < id + 1) + { + while (id >= m_Values.size()) + { + ValueType temp = AtmosphericRadiativeTermsSingleChannel2::New(); + m_Values.push_back(temp); + } + } + m_Values[id]->SetUpwardDirectTransmittance(val); +} +void +AtmosphericRadiativeTerms2 +::SetUpwardDiffuseTransmittanceForRayleigh(unsigned int id, const double& val) +{ + if (m_Values.size() < id + 1) + { + while (id >= m_Values.size()) + { + ValueType temp = AtmosphericRadiativeTermsSingleChannel2::New(); + m_Values.push_back(temp); + } + } + m_Values[id]->SetUpwardDiffuseTransmittanceForRayleigh(val); +} +void +AtmosphericRadiativeTerms2 +::SetUpwardDiffuseTransmittanceForAerosol(unsigned int id, const double& val) +{ + if (m_Values.size() < id + 1) + { + while (id >= m_Values.size()) + { + ValueType temp = AtmosphericRadiativeTermsSingleChannel2::New(); + m_Values.push_back(temp); + } + } + m_Values[id]->SetUpwardDiffuseTransmittanceForAerosol(val); +} +void +AtmosphericRadiativeTerms2 +::SetWavelengthSpectralBand(unsigned int id, const double& val) +{ + if (m_Values.size() < id + 1) + { + while (id >= m_Values.size()) + { + ValueType temp = AtmosphericRadiativeTermsSingleChannel2::New(); + m_Values.push_back(temp); + } + } + m_Values[id]->SetWavelengthSpectralBand(val); +} + +/** GET ACCESSORS WITH VECTORS. */ +AtmosphericRadiativeTerms2::DataVectorType +AtmosphericRadiativeTerms2 +::GetIntrinsicAtmosphericReflectances() const +{ + DataVectorType vect(m_Values.size(), 0); + for (unsigned int nbChannel = 0; nbChannel < m_Values.size(); ++nbChannel) + { + vect[nbChannel] = m_Values[nbChannel]->GetIntrinsicAtmosphericReflectance(); + } + return vect; +} +AtmosphericRadiativeTerms2::DataVectorType +AtmosphericRadiativeTerms2 +::GetSphericalAlbedos() const +{ + DataVectorType vect(m_Values.size(), 0); + for (unsigned int nbChannel = 0; nbChannel < m_Values.size(); ++nbChannel) + { + vect[nbChannel] = m_Values[nbChannel]->GetSphericalAlbedo(); + } + return vect; +} +AtmosphericRadiativeTerms2::DataVectorType +AtmosphericRadiativeTerms2 +::GetTotalGaseousTransmissions() const +{ + DataVectorType vect(m_Values.size(), 0); + for (unsigned int nbChannel = 0; nbChannel < m_Values.size(); ++nbChannel) + { + vect[nbChannel] = m_Values[nbChannel]->GetTotalGaseousTransmission(); + } + return vect; +} +AtmosphericRadiativeTerms2::DataVectorType +AtmosphericRadiativeTerms2 +::GetDownwardTransmittances() const +{ + DataVectorType vect(m_Values.size(), 0); + for (unsigned int nbChannel = 0; nbChannel < m_Values.size(); ++nbChannel) + { + vect[nbChannel] = m_Values[nbChannel]->GetDownwardTransmittance(); + } + return vect; +} +AtmosphericRadiativeTerms2::DataVectorType +AtmosphericRadiativeTerms2 +::GetUpwardTransmittances() const +{ + DataVectorType vect(m_Values.size(), 0); + for (unsigned int nbChannel = 0; nbChannel < m_Values.size(); ++nbChannel) + { + vect[nbChannel] = m_Values[nbChannel]->GetUpwardTransmittance(); + } + return vect; +} +AtmosphericRadiativeTerms2::DataVectorType +AtmosphericRadiativeTerms2 +::GetUpwardDiffuseTransmittances() const +{ + DataVectorType vect(m_Values.size(), 0); + for (unsigned int nbChannel = 0; nbChannel < m_Values.size(); ++nbChannel) + { + vect[nbChannel] = m_Values[nbChannel]->GetUpwardDiffuseTransmittance(); + } + return vect; +} +AtmosphericRadiativeTerms2::DataVectorType +AtmosphericRadiativeTerms2 +::GetUpwardDirectTransmittances() const +{ + DataVectorType vect(m_Values.size(), 0); + for (unsigned int nbChannel = 0; nbChannel < m_Values.size(); ++nbChannel) + { + vect[nbChannel] = m_Values[nbChannel]->GetUpwardDirectTransmittance(); + } + return vect; +} +AtmosphericRadiativeTerms2::DataVectorType +AtmosphericRadiativeTerms2 +::GetUpwardDiffuseTransmittancesForRayleigh() const +{ + DataVectorType vect(m_Values.size(), 0); + for (unsigned int nbChannel = 0; nbChannel < m_Values.size(); ++nbChannel) + { + vect[nbChannel] = m_Values[nbChannel]->GetUpwardDiffuseTransmittanceForRayleigh(); + } + return vect; +} +AtmosphericRadiativeTerms2::DataVectorType +AtmosphericRadiativeTerms2 +::GetUpwardDiffuseTransmittancesForAerosol() const +{ + DataVectorType vect(m_Values.size(), 0); + for (unsigned int nbChannel = 0; nbChannel < m_Values.size(); ++nbChannel) + { + vect[nbChannel] = m_Values[nbChannel]->GetUpwardDiffuseTransmittanceForAerosol(); + } + return vect; +} +AtmosphericRadiativeTerms2::DataVectorType +AtmosphericRadiativeTerms2 +::GetWavelengthSpectralBand() const +{ + DataVectorType vect(m_Values.size(), 0); + for (unsigned int nbChannel = 0; nbChannel < m_Values.size(); ++nbChannel) + { + vect[nbChannel] = m_Values[nbChannel]->GetWavelengthSpectralBand(); + } + return vect; +} + +/** GET ACCESSORS WITH INDEX. */ +double +AtmosphericRadiativeTerms2 +::GetIntrinsicAtmosphericReflectance(unsigned int id) const +{ + if (id >= m_Values.size()) itkExceptionMacro(<< " band index out of bounds: " << id + << " for " << m_Values.size() << " bands."); + return m_Values[id]->GetIntrinsicAtmosphericReflectance(); +} +double +AtmosphericRadiativeTerms2 +::GetSphericalAlbedo(unsigned int id) const +{ + if (id >= m_Values.size()) itkExceptionMacro(<< " band index out of bounds: " << id + << " for " << m_Values.size() << " bands."); + return m_Values[id]->GetSphericalAlbedo(); +} +double +AtmosphericRadiativeTerms2 +::GetTotalGaseousTransmission(unsigned int id) const +{ + if (id >= m_Values.size()) itkExceptionMacro(<< " band index out of bounds: " << id + << " for " << m_Values.size() << " bands."); + return m_Values[id]->GetTotalGaseousTransmission(); +} +double +AtmosphericRadiativeTerms2 +::GetDownwardTransmittance(unsigned int id) const +{ + if (id >= m_Values.size()) itkExceptionMacro(<< " band index out of bounds: " << id + << " for " << m_Values.size() << " bands."); + return m_Values[id]->GetDownwardTransmittance(); +} +double +AtmosphericRadiativeTerms2 +::GetUpwardTransmittance(unsigned int id) const +{ + if (id >= m_Values.size()) itkExceptionMacro(<< " band index out of bounds: " << id + << " for " << m_Values.size() << " bands."); + return m_Values[id]->GetUpwardTransmittance(); +} +double +AtmosphericRadiativeTerms2 +::GetUpwardDiffuseTransmittance(unsigned int id) const +{ + if (id >= m_Values.size()) itkExceptionMacro(<< " band index out of bounds: " << id + << " for " << m_Values.size() << " bands."); + return m_Values[id]->GetUpwardDiffuseTransmittance(); +} +double +AtmosphericRadiativeTerms2 +::GetUpwardDirectTransmittance(unsigned int id) const +{ + if (id >= m_Values.size()) itkExceptionMacro(<< " band index out of bounds: " << id + << " for " << m_Values.size() << " bands."); + return m_Values[id]->GetUpwardDirectTransmittance(); +} +double +AtmosphericRadiativeTerms2 +::GetUpwardDiffuseTransmittanceForRayleigh(unsigned int id) const +{ + if (id >= m_Values.size()) itkExceptionMacro(<< " band index out of bounds: " << id + << " for " << m_Values.size() << " bands."); + return m_Values[id]->GetUpwardDiffuseTransmittanceForRayleigh(); +} +double +AtmosphericRadiativeTerms2 +::GetUpwardDiffuseTransmittanceForAerosol(unsigned int id) const +{ + if (id >= m_Values.size()) itkExceptionMacro(<< " band index out of bounds: " << id + << " for " << m_Values.size() << " bands."); + return m_Values[id]->GetUpwardDiffuseTransmittanceForAerosol(); +} +double +AtmosphericRadiativeTerms2 +::GetWavelengthSpectralBand(unsigned int id) const +{ + if (id >= m_Values.size()) itkExceptionMacro(<< " band index out of bounds: " << id + << " for " << m_Values.size() << " bands."); + return m_Values[id]->GetWavelengthSpectralBand(); +} + +const AtmosphericRadiativeTerms2::ValueType +AtmosphericRadiativeTerms2 +::GetValueByIndex(unsigned int id) const +{ + if (id >= m_Values.size()) itkExceptionMacro(<< " band index out of bounds: " << id + << " for " << m_Values.size() << " bands."); + return m_Values[id]; +} + +/**PrintSelf method */ +void +AtmosphericRadiativeTerms2 +::PrintSelf(std::ostream& os, itk::Indent indent) const +{ + os << m_Values.size() << " channels:" << std::endl; + for (unsigned int i = 0; i < m_Values.size(); ++i) + { + os << "Channel " << i << " : " << std::endl; + //ValueType::(os, indent); + os << indent << "Intrinsic Atmospheric Reflectance : " + << m_Values[i]->GetIntrinsicAtmosphericReflectance() << std::endl; + os << indent << "Shperical Albedo of the Atmosphere : " + << m_Values[i]->GetSphericalAlbedo() << std::endl; + os << indent << "Total Gaseous Transmission : " + << m_Values[i]->GetTotalGaseousTransmission() << std::endl; + os << indent << "Atmosphere Downward Transmittance : " + << m_Values[i]->GetDownwardTransmittance() << std::endl; + os << indent << "Atmosphere Upward Transmittance : " + << m_Values[i]->GetUpwardTransmittance() << std::endl; + os << indent << "Upward Diffuse Transmittance : " + << m_Values[i]->GetUpwardDiffuseTransmittance() << std::endl; + os << indent << "Upward Direct Transmittance : " + << m_Values[i]->GetUpwardDirectTransmittance() << std::endl; + os << indent << "Rayleigh Upward Diffuse Transmittance : " + << m_Values[i]->GetUpwardDiffuseTransmittanceForRayleigh() << std::endl; + os << indent << "Aerosols Upward Diffuse Transmittance : " + << m_Values[i]->GetUpwardDiffuseTransmittanceForAerosol() << std::endl; + os << indent << "Wavelength : " + << m_Values[i]->GetWavelengthSpectralBand() << std::endl; + } +} + +} // end namespace otb diff --git a/Code/Radiometry/otbAtmosphericRadiativeTerms2.h b/Code/Radiometry/otbAtmosphericRadiativeTerms2.h new file mode 100644 index 0000000000..69227c57dc --- /dev/null +++ b/Code/Radiometry/otbAtmosphericRadiativeTerms2.h @@ -0,0 +1,276 @@ +/*========================================================================= + + Program: ORFEO Toolbox + Language: C++ + Date: $Date$ + Version: $Revision$ + + + Copyright (c) Centre National d'Etudes Spatiales. All rights reserved. + See OTBCopyright.txt for details. + + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the above copyright notices for more information. + +=========================================================================*/ +#ifndef __otbAtmosphericRadiativeTerms_h +#define __otbAtmosphericRadiativeTerms_h + +#include "itkObject.h" +#include "itkObjectFactory.h" +#include "itkMacro.h" +#include <vector> + +namespace otb +{ + +/** \class AtmosphericRadiativeTermsSingleChannel + * \brief This class contains all atmospheric radiative terms for one channel. + * + * Each value can be deducted from the atmospheric correction parameters (using 6S) + * or directly set by the user. + * + * \ingroup Radiometry + */ + +class ITK_EXPORT AtmosphericRadiativeTermsSingleChannel2 : public itk::Object +{ +public: + /** Standard typedefs */ + typedef AtmosphericRadiativeTermsSingleChannel2 Self; + typedef itk::Object Superclass; + typedef itk::SmartPointer<Self> Pointer; + typedef itk::SmartPointer<const Self> ConstPointer; + + /** Type macro */ + itkTypeMacro(AtmosphericRadiativeTermsSingleChannel2, Object); + + /** Creation through object factory macro */ + itkNewMacro(Self); + + /** + * Set/Get the intrinsic atmospheric reflectance. + */ + itkSetMacro(IntrinsicAtmosphericReflectance, double); + itkGetMacro(IntrinsicAtmosphericReflectance, double); + + /** + * Set/Get the spherical albedo of the atmosphere. + */ + itkSetMacro(SphericalAlbedo, double); + itkGetMacro(SphericalAlbedo, double); + /** + * Set/Get the total gaseous transmission. + */ + itkSetMacro(TotalGaseousTransmission, double); + itkGetMacro(TotalGaseousTransmission, double); + + /** + * Set/Get the downward transmittance of the atmosphere. + */ + itkSetMacro(DownwardTransmittance, double); + itkGetMacro(DownwardTransmittance, double); + + /** + * Set/Get the upward transmittance of the atmosphere. + */ + itkSetMacro(UpwardTransmittance, double); + itkGetMacro(UpwardTransmittance, double); + + /** + * Set/Get the upward diffuse transmittance + */ + itkSetMacro(UpwardDiffuseTransmittance, double); + itkGetMacro(UpwardDiffuseTransmittance, double); + + /** + * Set/Get the upward direct transmittance + */ + itkSetMacro(UpwardDirectTransmittance, double); + itkGetMacro(UpwardDirectTransmittance, double); + + /** + * Set/Get the upward diffuse transmittance for rayleigh + */ + itkSetMacro(UpwardDiffuseTransmittanceForRayleigh, double); + itkGetMacro(UpwardDiffuseTransmittanceForRayleigh, double); + + /** + * Set/Get the upward diffuse transmittance for aerosols + */ + itkSetMacro(UpwardDiffuseTransmittanceForAerosol, double); + itkGetMacro(UpwardDiffuseTransmittanceForAerosol, double); + + /** + * Set/Get the wavelength + */ + itkSetMacro(WavelengthSpectralBand, double); + itkGetMacro(WavelengthSpectralBand, double); + +protected: + /** Constructor */ + AtmosphericRadiativeTermsSingleChannel2(); + /** Destructor */ + ~AtmosphericRadiativeTermsSingleChannel2() {} + /**PrintSelf method */ + void PrintSelf(std::ostream& os, itk::Indent indent) const; + +private: + AtmosphericRadiativeTermsSingleChannel2(const Self &); //purposely not implemented + void operator =(const Self&); //purposely not implemented + + /** The intrinsic atmospheric reflectance. */ + double m_IntrinsicAtmosphericReflectance; + + /** The spherical albedo of the atmosphere.*/ + double m_SphericalAlbedo; + + /**The total gaseous transmission (for all species). */ + double m_TotalGaseousTransmission; + + /** The downward transmittance. */ + double m_DownwardTransmittance; + + /** The upward transmittance. */ + double m_UpwardTransmittance; + + /** The upward diffuse transmittance. */ + double m_UpwardDiffuseTransmittance; + + /** The upward direct transmittance. */ + double m_UpwardDirectTransmittance; + + /** The upward diffuse transmittance for rayleigh. */ + double m_UpwardDiffuseTransmittanceForRayleigh; + + /** The upward diffuse transmittance for aerosols. */ + double m_UpwardDiffuseTransmittanceForAerosol; + + /** Wavelength associated with the data: not used in the computation, for reference only */ + double m_WavelengthSpectralBand; +}; + +/** \class AtmosphericRadiativeTerms + * \brief This class is a vector of AtmosphericRadiativeTermsSingleChannel, + * it contains all atmospheric radiative terms for each studied channel. + * + * \ingroup AtmosphericRadiativeTermSingleChannel + * \ingroup Radiometry + */ + +class ITK_EXPORT AtmosphericRadiativeTerms2 : public itk::Object +{ +public: + /** Standard typedefs */ + typedef AtmosphericRadiativeTerms2 Self; + typedef itk::Object Superclass; + typedef itk::SmartPointer<Self> Pointer; + typedef itk::SmartPointer<const Self> ConstPointer; + + /** Type macro */ + itkTypeMacro(AtmosphericRadiativeTerms2, Object); + + /** Creation through object factory macro */ + itkNewMacro(Self); + + typedef AtmosphericRadiativeTermsSingleChannel2::Pointer ValueType; + typedef std::vector<ValueType> VectorValueType; + typedef std::vector<double> DataVectorType; + /** + * Set/Get the values. + */ + void SetValues(const VectorValueType& val) + { + m_Values = val; + this->Modified(); + } + VectorValueType& GetValues() + { + return m_Values; + } + const VectorValueType& GetValues() const + { + return m_Values; + } + + /** Set/Get the data classified by channel. */ + /** Set methods with vectors. */ + void SetIntrinsicAtmosphericReflectances(const DataVectorType& vect); + void SetSphericalAlbedos(const DataVectorType& vect); + void SetTotalGaseousTransmissions(const DataVectorType& vect); + void SetDownwardTransmittances(const DataVectorType& vect); + void SetUpwardTransmittances(const DataVectorType& vect); + + void SetUpwardDiffuseTransmittances(const DataVectorType& vect); + void SetUpwardDirectTransmittances(const DataVectorType& vect); + void SetUpwardDiffuseTransmittancesForRayleigh(const DataVectorType& vect); + void SetUpwardDiffuseTransmittancesForAerosol(const DataVectorType& vect); + void SetWavelengthSpectralBand(const DataVectorType& vect); + + /** Set methods with index. */ + void SetValueByIndex(unsigned int id, const ValueType& val); + void SetIntrinsicAtmosphericReflectance(unsigned int id, const double& val); + void SetSphericalAlbedo(unsigned int id, const double& val); + void SetTotalGaseousTransmission(unsigned int id, const double& val); + void SetDownwardTransmittance(unsigned int id, const double& val); + void SetUpwardTransmittance(unsigned int id, const double& val); + + void SetUpwardDiffuseTransmittance(unsigned int id, const double& val); + void SetUpwardDirectTransmittance(unsigned int id, const double& val); + void SetUpwardDiffuseTransmittanceForRayleigh(unsigned int id, const double& val); + void SetUpwardDiffuseTransmittanceForAerosol(unsigned int id, const double& val); + void SetWavelengthSpectralBand(unsigned int id, const double& val); + + /** Get methods with vectors. */ + DataVectorType GetIntrinsicAtmosphericReflectances() const; + DataVectorType GetSphericalAlbedos() const; + DataVectorType GetTotalGaseousTransmissions() const; + DataVectorType GetDownwardTransmittances() const; + DataVectorType GetUpwardTransmittances() const; + + DataVectorType GetUpwardDiffuseTransmittances() const; + DataVectorType GetUpwardDirectTransmittances() const; + DataVectorType GetUpwardDiffuseTransmittancesForRayleigh() const; + DataVectorType GetUpwardDiffuseTransmittancesForAerosol() const; + DataVectorType GetWavelengthSpectralBand() const; + + /** Get methods with index. */ + double GetIntrinsicAtmosphericReflectance(unsigned int id) const; + double GetSphericalAlbedo(unsigned int id) const; + double GetTotalGaseousTransmission(unsigned int id) const; + double GetDownwardTransmittance(unsigned int id) const; + double GetUpwardTransmittance(unsigned int id) const; + double GetUpwardDiffuseTransmittance(unsigned int id) const; + double GetUpwardDirectTransmittance(unsigned int id) const; + double GetUpwardDiffuseTransmittanceForRayleigh(unsigned int id) const; + double GetUpwardDiffuseTransmittanceForAerosol(unsigned int id) const; + double GetWavelengthSpectralBand(unsigned int id) const; + + const ValueType GetValueByIndex(unsigned int id) const; + + /** Initialization method.*/ + void ValuesInitialization(unsigned int nbChannel); + +protected: + /** Constructor */ + AtmosphericRadiativeTerms2(); + /** Destructor */ + ~AtmosphericRadiativeTerms2() {} + /**PrintSelf method */ + void PrintSelf(std::ostream& os, itk::Indent indent) const; + +private: + AtmosphericRadiativeTerms2(const Self &); //purposely not implemented + void operator =(const Self&); //purposely not implemented + + /** The vector containing each channel information. */ + VectorValueType m_Values; + /** Boolean to know if m_Values has been initialized. */ + bool m_IsInitialized; +}; + +} // end namespace otb + +#endif \ No newline at end of file diff --git a/Code/Radiometry/otbRadiometryCorrectionParametersToAtmosphericRadiativeTerms.h b/Code/Radiometry/otbRadiometryCorrectionParametersToAtmosphericRadiativeTerms.h new file mode 100644 index 0000000000..3ba45922f4 --- /dev/null +++ b/Code/Radiometry/otbRadiometryCorrectionParametersToAtmosphericRadiativeTerms.h @@ -0,0 +1,112 @@ +/*========================================================================= + + Program: ORFEO Toolbox + Language: C++ + Date: $Date$ + Version: $Revision$ + + + Copyright (c) Centre National d'Etudes Spatiales. All rights reserved. + See OTBCopyright.txt for details. + + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the above copyright notices for more information. + +=========================================================================*/ +#ifndef __otbRadiometryCorrectionParametersToAtmosphericRadiativeTerms_h +#define __otbRadiometryCorrectionParametersToAtmosphericRadiativeTerms_h + +#include "otbAtmosphericRadiativeTerms2.h" +#include "otbAtmosphericCorrectionParameters.h" +#include "otbSIXSTraits.h" + +namespace otb +{ + +/** \class RadiometryCorrectionParametersToAtmosphericRadiativeTerms + * \brief TODO. + * + * TODO + * \ingroup Radiometry + * + */ + class ITK_EXPORT RadiometryCorrectionParametersToAtmosphericRadiativeTerms + { + public: + + /** Call the varSol function*/ + static AtmosphericRadiativeTerms2::Pointer Compute(AtmosphericCorrectionParameters* paramIn) + { + AtmosphericRadiativeTerms2::Pointer radTermsOut = AtmosphericRadiativeTerms2::New(); + + typedef AtmosphericCorrectionParameters::WavelengthSpectralBandVectorType WavelengthSpectralBandVectorType; + WavelengthSpectralBandVectorType WavelengthSpectralBandVector = paramIn->GetWavelengthSpectralBand(); + unsigned int NbBand = WavelengthSpectralBandVector->Size(); + + radTermsOut->ValuesInitialization(NbBand); + + double atmosphericReflectance(0.); + double atmosphericSphericalAlbedo(0.); + double totalGaseousTransmission(0.); + double downwardTransmittance(0.); + double upwardTransmittance(0.); + double upwardDiffuseTransmittance(0.); + double upwardDirectTransmittance(0.); + double upwardDiffuseTransmittanceForRayleigh(0.); + double upwardDiffuseTransmittanceForAerosol(0.); + + for (unsigned int i = 0; i < NbBand; ++i) + { + atmosphericReflectance = 0.; + atmosphericSphericalAlbedo = 0.; + totalGaseousTransmission = 0.; + downwardTransmittance = 0.; + upwardTransmittance = 0.; + upwardDiffuseTransmittance = 0.; + upwardDirectTransmittance = 0.; + upwardDiffuseTransmittanceForRayleigh = 0.; + upwardDiffuseTransmittanceForAerosol = 0.; + SIXSTraits::ComputeAtmosphericParameters( + paramIn->GetSolarZenithalAngle(), /** The Solar zenithal angle */ + paramIn->GetSolarAzimutalAngle(), /** The Solar azimutal angle */ + paramIn->GetViewingZenithalAngle(), /** The Viewing zenithal angle */ + paramIn->GetViewingAzimutalAngle(), /** The Viewing azimutal angle */ + paramIn->GetMonth(), /** The Month */ + paramIn->GetDay(), /** The Day (in the month) */ + paramIn->GetAtmosphericPressure(), /** The Atmospheric pressure */ + paramIn->GetWaterVaporAmount(), /** The Water vapor amount (Total water vapor content over vertical atmospheric column) */ + paramIn->GetOzoneAmount(), /** The Ozone amount (Stratospheric ozone layer content) */ + paramIn->GetAerosolModel(), /** The Aerosol model */ + paramIn->GetAerosolOptical(), /** The Aerosol optical (radiative impact of aerosol for the reference wavelength 550-nm) */ + paramIn->GetWavelengthSpectralBand()->GetNthElement(i), /** Wavelength for the spectral band definition */ + /** Note : The Max wavelength spectral band value must be updated ! */ + atmosphericReflectance, /** Atmospheric reflectance */ + atmosphericSphericalAlbedo, /** atmospheric spherical albedo */ + totalGaseousTransmission, /** Total gaseous transmission */ + downwardTransmittance, /** downward transmittance */ + upwardTransmittance, /** upward transmittance */ + upwardDiffuseTransmittance, /** Upward diffuse transmittance */ + upwardDirectTransmittance, /** Upward direct transmittance */ + upwardDiffuseTransmittanceForRayleigh, /** Upward diffuse transmittance for rayleigh */ + upwardDiffuseTransmittanceForAerosol /** Upward diffuse transmittance for aerosols */ + ); + + radTermsOut->SetIntrinsicAtmosphericReflectance(i, atmosphericReflectance); + radTermsOut->SetSphericalAlbedo(i, atmosphericSphericalAlbedo); + radTermsOut->SetTotalGaseousTransmission(i, totalGaseousTransmission); + radTermsOut->SetDownwardTransmittance(i, downwardTransmittance); + radTermsOut->SetUpwardTransmittance(i, upwardTransmittance); + radTermsOut->SetUpwardDiffuseTransmittance(i, upwardDiffuseTransmittance); + radTermsOut->SetUpwardDirectTransmittance(i, upwardDirectTransmittance); + radTermsOut->SetUpwardDiffuseTransmittanceForRayleigh(i, upwardDiffuseTransmittanceForRayleigh); + radTermsOut->SetUpwardDiffuseTransmittanceForAerosol(i, upwardDiffuseTransmittanceForAerosol); + radTermsOut->SetWavelengthSpectralBand(i, paramIn->GetWavelengthSpectralBand()->GetNthElement(i)->GetCenterSpectralValue()); + } + + return radTermsOut; + } + }; +} //end namespace otb +#endif diff --git a/Testing/Code/Radiometry/CMakeLists.txt b/Testing/Code/Radiometry/CMakeLists.txt index 39135effa2..fa09859191 100644 --- a/Testing/Code/Radiometry/CMakeLists.txt +++ b/Testing/Code/Radiometry/CMakeLists.txt @@ -948,6 +948,16 @@ add_test(raTvAtmosphericCorrectionParametersTo6SAtmosphericRadiativeTerms ${RADI ${TEMP}/raTvCorrectionTo6SRadiative.txt ) +# New test +add_test(raTvAtmosphericCorrectionParametersToAtmosphericRadiativeTerms ${RADIOMETRY_TESTS4} +--compare-ascii ${EPSILON_4} + ${BASELINE_FILES}/raTvSIXSTraitsComputeAtmosphericParametersTest.txt + ${TEMP}/raTvCorrectionTo6SRadiative.txt + otbAtmosphericCorrectionParametersToAtmosphericRadiativeTerms + ${INPUTDATA}/in6S_otb + ${TEMP}/raTvCorrectionTo6SRadiative.txt +) + add_test(raTvAtmosphericCorrectionSequencementTest ${RADIOMETRY_TESTS4} --compare-image ${EPSILON_10} ${BASELINE}/raTvRomaniaAtmosphericCorrectionSequencement.tif @@ -2122,6 +2132,7 @@ set(Radiometry_SRCS4 otbRadiometryTests4.cxx otbAtmosphericCorrectionParametersTo6SAtmosphericRadiativeTermsNew.cxx otbAtmosphericCorrectionParametersTo6SAtmosphericRadiativeTerms.cxx +otbAtmosphericCorrectionParametersToAtmosphericRadiativeTerms.cxx otbAtmosphericCorrectionSequencement.cxx otbEVIRAndBAndNIRVegetationIndexImageFilter.cxx otbEVIMultiChannelRAndBAndNIRVegetationIndexImageFilter.cxx diff --git a/Testing/Code/Radiometry/otbAtmosphericCorrectionParametersToAtmosphericRadiativeTerms.cxx b/Testing/Code/Radiometry/otbAtmosphericCorrectionParametersToAtmosphericRadiativeTerms.cxx new file mode 100644 index 0000000000..8c854a5582 --- /dev/null +++ b/Testing/Code/Radiometry/otbAtmosphericCorrectionParametersToAtmosphericRadiativeTerms.cxx @@ -0,0 +1,175 @@ +/*========================================================================= + + Program: ORFEO Toolbox + Language: C++ + Date: $Date$ + Version: $Revision$ + + + Copyright (c) Centre National d'Etudes Spatiales. All rights reserved. + See OTBCopyright.txt for details. + + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the above copyright notices for more information. + +=========================================================================*/ + +#include "otbRadiometryCorrectionParametersToAtmosphericRadiativeTerms.h" +#include "otbAtmosphericCorrectionParameters.h" +#include "otbAtmosphericRadiativeTerms2.h" +#include <vector> +#include <fstream> +#include <iostream> +#include <iomanip> +#include <cstdlib> + +int otbAtmosphericCorrectionParametersToAtmosphericRadiativeTerms(int argc, char * argv[]) +{ + const char * wavelenghFile = argv[1]; + const char * outputFile = argv[2]; + + typedef otb::RadiometryCorrectionParametersToAtmosphericRadiativeTerms CorrectionParametersToRadiativeTermsType; + typedef otb::AtmosphericCorrectionParameters CorrectionParametersType; + typedef otb::AtmosphericRadiativeTerms2 RadiativeTermsType; + typedef CorrectionParametersType::AerosolModelType AerosolModelType; + typedef otb::FilterFunctionValues FilterFunctionValuesType; + typedef FilterFunctionValuesType::WavelengthSpectralBandType ValueType; + typedef FilterFunctionValuesType::ValuesVectorType ValuesVectorType; + + // Instantiating object + CorrectionParametersType::Pointer param = CorrectionParametersType::New(); + AerosolModelType aerosolModel; + FilterFunctionValuesType::Pointer functionValues = FilterFunctionValuesType::New(); + ValuesVectorType vect; + + ValueType val = 0.0025; + + vect.clear(); + + // Filter function values initialization + float minSpectralValue(0.); + float maxSpectralValue(0.); + float value(0.); + // Correction parameters initialization + double solarZenithalAngle(0.); + double solarAzimutalAngle(0.); + double viewingZenithalAngle(0.); + double viewingAzimutalAngle(0.); + unsigned int month(0); + unsigned int day(0); + double atmosphericPressure(0.); + double waterVaporAmount(0.); + double ozoneAmount(0.); + double aerosolOptical(0.); + + std::ifstream fin; + std::ofstream fout; + //Read input file parameters + fin.open(wavelenghFile); + fin >> solarZenithalAngle; //asol; + fin >> solarAzimutalAngle; //phi0; + fin >> viewingZenithalAngle; //avis; + fin >> viewingAzimutalAngle; //phiv; + fin >> month; //month; + fin >> day; //jday; + fin >> atmosphericPressure; //pressure; + fin >> waterVaporAmount; //uw; + fin >> ozoneAmount; //uo3; + unsigned int aer(0); + fin >> aer; //iaer; + aerosolModel = static_cast<AerosolModelType>(aer); + fin >> aerosolOptical; //taer55; + fin >> minSpectralValue; //wlinf; + fin >> maxSpectralValue; //wlsup; + + std::string line; + std::getline(fin, line); + while (std::getline(fin, line)) + { + value = atof(line.c_str()); + vect.push_back(value); + } + + fin.close(); + functionValues->SetFilterFunctionValues(vect); + functionValues->SetMinSpectralValue(minSpectralValue); + functionValues->SetMaxSpectralValue(maxSpectralValue); + functionValues->SetUserStep(val); + param->SetWavelengthSpectralBandWithIndex(0, functionValues); + + // Set parameters + param->SetSolarZenithalAngle(static_cast<double>(solarZenithalAngle)); + param->SetSolarAzimutalAngle(static_cast<double>(solarAzimutalAngle)); + param->SetViewingZenithalAngle(static_cast<double>(viewingZenithalAngle)); + param->SetViewingAzimutalAngle(static_cast<double>(viewingAzimutalAngle)); + param->SetMonth(month); + param->SetDay(day); + param->SetAtmosphericPressure(static_cast<double>(atmosphericPressure)); + param->SetWaterVaporAmount(static_cast<double>(waterVaporAmount)); + param->SetOzoneAmount(static_cast<double>(ozoneAmount)); + param->SetAerosolModel(aerosolModel); + param->SetAerosolOptical(static_cast<double>(aerosolOptical)); + + RadiativeTermsType::Pointer radiative = CorrectionParametersToRadiativeTermsType::Compute(param); + + + fout.open(outputFile); + fout << " ---------------------------------------------------------" << std::endl; + fout << "Inputs values:" << std::setprecision(10) << std::endl; + fout << " -----> SolarZenithalAngle : " << solarZenithalAngle << std::endl; + fout << " -----> SolarAzimutalAngle : " << solarAzimutalAngle << std::endl; + fout << " -----> ViewingZenithalAngle : " << viewingZenithalAngle << std::endl; + fout << " -----> ViewingAzimutalAngle : " << viewingAzimutalAngle << std::endl; + fout << " -----> Month : " << month << std::endl; + fout << " -----> Day : " << day << std::endl; + fout << " -----> AtmosphericPressure : " << atmosphericPressure << std::endl; + fout << " -----> WaterVaporAmount : " << waterVaporAmount << std::endl; + fout << " -----> OzoneAmount : " << ozoneAmount << std::endl; + fout << " -----> AerosolModel : " << aer << std::endl; + fout << " -----> AerosolOptical : " << aerosolOptical << std::endl; + fout << " -----> MinSpectralValue : " << minSpectralValue << std::endl; + fout << " -----> MaxSpectralValue : " << maxSpectralValue << std::endl; + fout << " -----> UserStep : " << functionValues->GetUserStep() << std::endl; + fout << " ---------------------------------------------------------" << std::endl; + fout << "Outputs values:" << std::endl; + fout << " -----> atmospheric reflectance : " << + radiative->GetIntrinsicAtmosphericReflectance(0) << std::endl; + fout << " -----> atmospheric spherical albedo : " << radiative->GetSphericalAlbedo(0) << + std::endl; + fout << " -----> total gaseous transmission : " << + radiative->GetTotalGaseousTransmission(0) << std::endl; + fout << " -----> downward transmittance : " << radiative->GetDownwardTransmittance(0) << + std::endl; + fout << " -----> upward transmittance : " << radiative->GetUpwardTransmittance(0) << + std::endl; + fout << " -----> upward diffuse transmittance : " << + radiative->GetUpwardDiffuseTransmittance(0) << std::endl; + fout << " -----> upward direct transmittance : " << + radiative->GetUpwardDirectTransmittance(0) << std::endl; + fout << " -----> upward diffuse transmittance for rayleigh : " << + radiative->GetUpwardDiffuseTransmittanceForRayleigh(0) << std::endl; + fout << " -----> upward diffuse transmittance for aerosols : " << + radiative->GetUpwardDiffuseTransmittanceForAerosol(0) << std::endl; + fout << " -----> MinSpectralValue update: " << functionValues->GetMinSpectralValue() << + std::endl; + fout << " -----> MaxSpectralValue update : " << functionValues->GetMaxSpectralValue() << + std::endl; + fout << " ---------------------------------------------------------" << std::endl; + fout << "Input wavelength band values [" << functionValues->GetFilterFunctionValues().size() << "]:" << std::endl; + for (unsigned int i = 0; i < functionValues->GetFilterFunctionValues().size(); ++i) + { + fout << " " << functionValues->GetFilterFunctionValues()[i] << std::endl; + } + fout << " ---------------------------------------------------------" << std::endl; + fout << "Output wavelength band values 6S [" << functionValues->GetFilterFunctionValues6S().size() << "]:" << + std::endl; + for (unsigned int i = 0; i < functionValues->GetFilterFunctionValues6S().size(); ++i) + { + fout << " " << functionValues->GetFilterFunctionValues6S()[i] << std::endl; + } + fout << std::endl; + fout.close(); + return EXIT_SUCCESS; +} diff --git a/Testing/Code/Radiometry/otbRadiometryTests4.cxx b/Testing/Code/Radiometry/otbRadiometryTests4.cxx index db230c7888..d4178fe75d 100644 --- a/Testing/Code/Radiometry/otbRadiometryTests4.cxx +++ b/Testing/Code/Radiometry/otbRadiometryTests4.cxx @@ -26,6 +26,7 @@ void RegisterTests() { REGISTER_TEST(otbAtmosphericCorrectionParametersTo6SAtmosphericRadiativeTermsNew); REGISTER_TEST(otbAtmosphericCorrectionParametersTo6SAtmosphericRadiativeTerms); + REGISTER_TEST(otbAtmosphericCorrectionParametersToAtmosphericRadiativeTerms); REGISTER_TEST(otbAtmosphericCorrectionSequencementTest); REGISTER_TEST(otbEVIRAndBAndNIRVegetationIndexImageFilter); REGISTER_TEST(otbEVIMultiChannelRAndBAndNIRVegetationIndexImageFilter); -- GitLab