From 2d4027c27cc96e208939359e57bea9bf2e94ced4 Mon Sep 17 00:00:00 2001 From: Mickael Savinaud <mickael.savinaud@c-s.fr> Date: Tue, 13 May 2014 12:31:25 +0200 Subject: [PATCH] ENH: reactivate the adjency effect computation by default no adjency effect is computed (as previous even if the checkbox is set by default correct some strange mistake about the name of parameters --- .../Radiometry/otbOpticalCalibration.cxx | 94 +++++++++++-------- 1 file changed, 53 insertions(+), 41 deletions(-) diff --git a/Applications/Radiometry/otbOpticalCalibration.cxx b/Applications/Radiometry/otbOpticalCalibration.cxx index b84cb8487a..0ec37c97fa 100644 --- a/Applications/Radiometry/otbOpticalCalibration.cxx +++ b/Applications/Radiometry/otbOpticalCalibration.cxx @@ -100,7 +100,7 @@ public: typedef otb::SurfaceAdjacencyEffect6SCorrectionSchemeFilter<DoubleVectorImageType,DoubleVectorImageType> SurfaceAdjacencyEffect6SCorrectionSchemeFilterType; - typedef otb::GroundSpacingImageFunction<DoubleVectorImageType> GroundSpacingImageType; + typedef otb::GroundSpacingImageFunction<FloatVectorImageType> GroundSpacingImageType; typedef DoubleVectorImageType::IndexType IndexType; typedef GroundSpacingImageType::FloatType FloatType; @@ -284,6 +284,7 @@ private: SetParameterDescription("atmo.radius","Window radius for adjacency effects corrections"); MandatoryOff("atmo.radius"); SetDefaultParameterInt("atmo.radius", 2); + DisableParameter("atmo.radius"); // Doc example parameter settings SetDocExampleParameterValue("in", "QB_1_ortho.tif"); @@ -439,7 +440,7 @@ private: m_ScaleFilter->InPlaceOn(); m_ClampFilter = ClampFilterType::New(); - FloatVectorImageType::Pointer inImage = GetParameterFloatVectorImage("in"); + FloatVectorImageType::Pointer inImage = GetParameterFloatVectorImage("in"); // Set (Date and Day) OR FluxNormalizationCoef to corresponding filters if ( !IsParameterEnabled("acquisition.fluxnormalizationcoefficient") ) @@ -647,9 +648,9 @@ private: m_AtmosphericParam->SetAerosolOptical(GetParameterFloat("atmo.opt")); // Relative Spectral Response File - if (IsParameterEnabled("rsr")) + if (IsParameterEnabled("atmo.rsr")) { - m_ReflectanceToSurfaceReflectanceFilter->SetFilterFunctionValuesFileName(GetParameterString("rsr")); + m_ReflectanceToSurfaceReflectanceFilter->SetFilterFunctionValuesFileName(GetParameterString("atmo.rsr")); } // Aeronet file @@ -679,51 +680,62 @@ private: GetLogger()->Info("Atmospheric correction parameters compute by 6S : " + oss.str()); - //Compute adjacency effect - // m_SurfaceAdjacencyEffect6SCorrectionSchemeFilter - // = SurfaceAdjacencyEffect6SCorrectionSchemeFilterType::New(); - - // m_SurfaceAdjacencyEffect6SCorrectionSchemeFilter->SetInput(m_ReflectanceToSurfaceReflectanceFilter->GetOutput()); - // m_SurfaceAdjacencyEffect6SCorrectionSchemeFilter-> - // SetAtmosphericRadiativeTerms( - // m_ReflectanceToSurfaceReflectanceFilter->GetAtmosphericRadiativeTerms()); - // m_SurfaceAdjacencyEffect6SCorrectionSchemeFilter->SetZenithalViewingAngle( - // m_AtmosphericParam->GetViewingZenithalAngle()); - // m_SurfaceAdjacencyEffect6SCorrectionSchemeFilter->SetWindowRadius(GetParameterInt("radius")); - - // //estimate ground spacing in kilometers - // GroundSpacingImageType::Pointer groundSpacing = GroundSpacingImageType::New(); - - // groundSpacing->SetInputImage(inImage); - // IndexType index; - - // vnl_random rand; - - // index[0] = static_cast<IndexValueType>(rand.lrand32(0, inImage->GetLargestPossibleRegion().GetSize()[0])); - // index[1] = static_cast<IndexValueType>(rand.lrand32(0, inImage->GetLargestPossibleRegion().GetSize()[1])); - // FloatType tmpSpacing = groundSpacing->EvaluateAtIndex(index); - - // const float spacingInKilometers = (std::max(tmpSpacing[0], tmpSpacing[1])) / 1000.; - // // std::ostringstream oss2; - // // oss2.str(""); - // // oss2 << spacingInKilometers; - // // GetLogger()->Info("Spacing in kilometers " + oss2.str()); - // m_SurfaceAdjacencyEffect6SCorrectionSchemeFilter-> - // SetPixelSpacingInKilometers(spacingInKilometers); + bool adjComputation=false; + if (IsParameterEnabled("atmo.radius")) + { + adjComputation=true; + //Compute adjacency effect + m_SurfaceAdjacencyEffect6SCorrectionSchemeFilter + = SurfaceAdjacencyEffect6SCorrectionSchemeFilterType::New(); + + m_SurfaceAdjacencyEffect6SCorrectionSchemeFilter->SetInput(m_ReflectanceToSurfaceReflectanceFilter->GetOutput()); + m_SurfaceAdjacencyEffect6SCorrectionSchemeFilter-> + SetAtmosphericRadiativeTerms( + m_ReflectanceToSurfaceReflectanceFilter->GetAtmosphericRadiativeTerms()); + m_SurfaceAdjacencyEffect6SCorrectionSchemeFilter->SetZenithalViewingAngle( + m_AtmosphericParam->GetViewingZenithalAngle()); + m_SurfaceAdjacencyEffect6SCorrectionSchemeFilter->SetWindowRadius(GetParameterInt("atmo.radius")); + + //Estimate ground spacing in kilometers + GroundSpacingImageType::Pointer groundSpacing = GroundSpacingImageType::New(); + + groundSpacing->SetInputImage(inImage); + IndexType index; + vnl_random rand; + + index[0] = static_cast<IndexValueType>(rand.lrand32(0, inImage->GetLargestPossibleRegion().GetSize()[0])); + index[1] = static_cast<IndexValueType>(rand.lrand32(0, inImage->GetLargestPossibleRegion().GetSize()[1])); + FloatType tmpSpacing = groundSpacing->EvaluateAtIndex(index); + + const float spacingInKilometers = (std::max(tmpSpacing[0], tmpSpacing[1])) / 1000.; + // std::ostringstream oss2; + // oss2.str(""); + // oss2 << spacingInKilometers; + // GetLogger()->Info("Spacing in kilometers " + oss2.str()); + m_SurfaceAdjacencyEffect6SCorrectionSchemeFilter-> + SetPixelSpacingInKilometers(spacingInKilometers); - // //rescale the surface reflectance in milli-reflectance - // m_SurfaceAdjacencyEffect6SCorrectionSchemeFilter->UpdateOutputInformation(); - // //m_SurfaceAdjacencyEffect6SCorrectionSchemeFilter->Update(); - // m_ScaleFilter->SetInput(m_SurfaceAdjacencyEffect6SCorrectionSchemeFilter->GetOutput()); + + m_SurfaceAdjacencyEffect6SCorrectionSchemeFilter->UpdateOutputInformation(); + } + //Rescale the surface reflectance in milli-reflectance if (!IsParameterEnabled("clamp")) { - m_ScaleFilter->SetInput(m_ReflectanceToSurfaceReflectanceFilter->GetOutput()); + if (!adjComputation) + m_ScaleFilter->SetInput(m_ReflectanceToSurfaceReflectanceFilter->GetOutput()); + else + m_ScaleFilter->SetInput(m_SurfaceAdjacencyEffect6SCorrectionSchemeFilter->GetOutput()); } else { GetLogger()->Info("Clamp values between [0, 100]"); - m_ClampFilter->SetInput(m_ReflectanceToSurfaceReflectanceFilter->GetOutput()); + + if (!adjComputation) + m_ClampFilter->SetInput(m_ReflectanceToSurfaceReflectanceFilter->GetOutput()); + else + m_ClampFilter->SetInput(m_SurfaceAdjacencyEffect6SCorrectionSchemeFilter->GetOutput()); + m_ClampFilter->ClampOutside(0.0, 1.0); m_ScaleFilter->SetInput(m_ClampFilter->GetOutput()); } -- GitLab