diff --git a/Code/Common/otbUnaryFunctorNeighborhoodWithOffsetImageFilter.txx b/Code/Common/otbUnaryFunctorNeighborhoodWithOffsetImageFilter.txx index e22755604331e510d27e5571c7557d5995a53e07..7a2d52092baa3ec69e629134da72c8ce3e27bad3 100644 --- a/Code/Common/otbUnaryFunctorNeighborhoodWithOffsetImageFilter.txx +++ b/Code/Common/otbUnaryFunctorNeighborhoodWithOffsetImageFilter.txx @@ -50,7 +50,7 @@ UnaryFunctorNeighborhoodWithOffsetImageFilter<TInputImage,TOutputImage,TFunction { Superclass::BeforeThreadedGenerateData(); - for (unsigned int i =0; i<static_cast<unsigned int>(this->GetNumberOfThreads()); i++) + for (int i =0; i<this->GetNumberOfThreads(); i++) { m_FunctorList.push_back(m_Functor); } diff --git a/Code/FeatureExtraction/otbEntropyTextureFunctor.h b/Code/FeatureExtraction/otbEntropyTextureFunctor.h index 8c57376d9da6693a9d31d3e0161b3ab49d038f31..c0f9e4381e97ab3143adbb310890da86484f41a7 100644 --- a/Code/FeatureExtraction/otbEntropyTextureFunctor.h +++ b/Code/FeatureExtraction/otbEntropyTextureFunctor.h @@ -25,10 +25,12 @@ namespace otb namespace Functor { /** \class EntropyTextureFunctor - * \brief This functor calculates the local energy of an image + * \brief This functor calculates the local entropy of an image * - * Computes the sqaure gradient which is computed using offset and - * angle pixel of the neighborhood. + * Computes joint histogram (neighborhood and offset neighborhood) + * which bins are computing using Scott formula. + * Computes the probabiltiy p for each pair of pixel. + * Entropy is the sum p.log(p) over the neighborhood. * TIterInput is an ietrator, TOutput is a PixelType. * * \ingroup Functor @@ -41,7 +43,6 @@ public: EntropyTextureFunctor() { m_Offset.Fill(1); - //m_BinLength = IntVectyorType(0, 1); }; ~EntropyTextureFunctor() {}; @@ -53,7 +54,7 @@ public: typedef typename OutputType::ValueType OutputPixelType; typedef std::vector<double> DoubleVectorType; typedef std::vector<int> IntVectorType; - typedef std::vector<IntVectorType> IntVectorVectorType; + typedef std::vector<IntVectorType> IntVectorVectorType; void SetOffset(OffsetType off) { @@ -64,6 +65,7 @@ public: return m_Offset; }; + /** Computes the histogram bins using Scott formula, plus min/max. */ IntVectorVectorType StatComputation(const TIterInput1 &it, const TIterInput2 &itOff) { IntVectorVectorType output; @@ -77,6 +79,7 @@ public: m_MaxiOff = DoubleVectorType(nbComp, itk::NumericTraits<double>::NonpositiveMin()); double area = static_cast<double>(radius[0]*radius[1]); double areaInv = 1/area; + double scottCoef = 3.5 /(vcl_pow(area, 1/3) ); OffsetType offset; offset.Fill(0); @@ -85,8 +88,8 @@ public: offsetOffInit[0] = -radius[0]+m_Offset[0]-1; offsetOffInit[1] = -radius[1]+m_Offset[1]-1; - IntVectorType mean; - IntVectorType meanOff; + DoubleVectorType mean; + DoubleVectorType meanOff; for ( unsigned int i=0; i<nbComp; i++ ) { offsetOff = offsetOffInit; @@ -99,7 +102,6 @@ public: offset[0] = l; for ( int k = -static_cast<int>(radius[1]); k <= static_cast<int>(radius[1]); k++) { - //std::cout<<it.GetPixel(offset)[i]<<std::endl; offsetOff[1]++; offset[1] = k; meanCh += static_cast<double>(it.GetPixel(offset)[i]); @@ -120,37 +122,38 @@ public: offsetOff = offsetOffInit; double stdCh = 0.; double stdChOff = 0.; - for ( int l = -static_cast<int>(radius[0]); l <= static_cast<int>(radius[0]); l++ ) - { - offsetOff[0]++; - offsetOff[1] = offsetOffInit[1]; - offset[0] = l; - for ( int k = -static_cast<int>(radius[1]); k <= static_cast<int>(radius[1]); k++) - { - offsetOff[1]++; - offset[1] = k; - stdCh += vcl_pow( (mean[i]-static_cast<double>(it.GetPixel(offset)[i])), 2); - stdChOff += vcl_pow( (meanOff[i]-static_cast<double>(itOff.GetPixel(offsetOff)[i])), 2); - } - } + + for( int l = -static_cast<int>(radius[0]); l <= static_cast<int>(radius[0]); l++ ) + { + offsetOff[0]++; + offsetOff[1] = offsetOffInit[1]; + offset[0] = l; + for( int k = -static_cast<int>(radius[1]); k <= static_cast<int>(radius[1]); k++) + { + offsetOff[1]++; + offset[1] = k; + stdCh += vcl_pow( (mean[i]-static_cast<double>(it.GetPixel(offset)[i])), 2); + stdChOff += vcl_pow( (meanOff[i]-static_cast<double>(itOff.GetPixel(offsetOff)[i])), 2); + } + } + stdCh *= areaInv; stdCh = vcl_sqrt( stdCh ); stdChOff *= areaInv; stdChOff = vcl_sqrt( stdChOff ); - binLength.push_back( (3.5*stdCh) /(vcl_pow(area, 1/3) ) ); - binLengthOff.push_back( (3.5*stdChOff) /(vcl_pow(area, 1/3) ) ); + binLength.push_back( scottCoef*stdCh ); + binLengthOff.push_back( scottCoef*stdChOff ); + } - output.push_back(binLength); output.push_back(binLengthOff); - + return output; } inline TOutput operator()(const TIterInput1 &it, const TIterInput2 &itOff) { - //std::cout<<"operator"<<std::endl; IntVectorVectorType binsLength = this->StatComputation(it, itOff); RadiusType radius = it.GetRadius(); @@ -175,8 +178,6 @@ public: for ( unsigned int i=0; i<nbComp; i++ ) { - //std::cout<<"i :"<<i<<" "<<std::endl; - IntVectorType histoTemp; IntVectorVectorType histo; if (binsLength[0][i] != 0) @@ -188,62 +189,58 @@ public: else histo = IntVectorVectorType( 1, histoTemp ); - //std::cout<<"m_Maxi[i]-m_Mini[i] "<<m_Maxi[i]<<" "<<m_Mini[i]<<std::endl; - //std::cout<<"binsLength[0][i] "<<binsLength[0][i]<<std::endl; - //std::cout<<histoTemp.size()<<" "<<histo.size()<<std::endl; - offsetOff = offsetOffInit; for ( int l = -static_cast<int>(radius[0]); l <= static_cast<int>(radius[0]); l++ ) - { //std::cout<<"i :"<<i<<" "<<l<<std::endl; - offsetOff[0]++; - offsetOff[1] = offsetOffInit[1]; - offset[0] = l; - for ( int k = -static_cast<int>(radius[1]); k <= static_cast<int>(radius[1]); k++) - { - //std::cout<<i<<" "<<l<<" "<<k<<std::endl; - offsetOff[1]++; - offset[1] = k; - if ( binsLength[1][i] != 0) - histoIdX = static_cast<int>(vcl_floor( (itOff.GetPixel(offsetOff)[i]-m_MiniOff[i]) / binsLength[1][i] )); - else - histoIdX = 0; - if ( binsLength[0][i] !=0 ) - histoIdY = static_cast<int>(vcl_floor( (it.GetPixel(offset)[i]-m_Mini[i]) / binsLength[0][i] )); - else - histoIdY = 0; - histo[histoIdX][histoIdY]++; - - } - } + { + offsetOff[0]++; + offsetOff[1] = offsetOffInit[1]; + offset[0] = l; + for ( int k = -static_cast<int>(radius[1]); k <= static_cast<int>(radius[1]); k++) + { + offsetOff[1]++; + offset[1] = k; + if ( binsLength[1][i] != 0) + histoIdX = static_cast<int>(vcl_floor( (itOff.GetPixel(offsetOff)[i]-m_MiniOff[i]) / binsLength[1][i] )); + else + histoIdX = 0; + if ( binsLength[0][i] !=0 ) + histoIdY = static_cast<int>(vcl_floor( (it.GetPixel(offset)[i]-m_Mini[i]) / binsLength[0][i] )); + else + histoIdY = 0; + histo[histoIdX][histoIdY]++; + + } + } for (unsigned r = 0; r<binsLength.size(); r++) - { - for (unsigned s = 0; s<binsLength[r].size(); s++) - { - double p = binsLength[r][s] * areaInv; - if (p != 0) - outPix[i] += static_cast<OutputPixelType>(p * vcl_log(p)); - } - } - + { + for (unsigned s = 0; s<binsLength[r].size(); s++) + { + double p = binsLength[r][s] * areaInv; + if (p != 0) + outPix[i] += static_cast<OutputPixelType>(p * vcl_log(p)); + } + } + } - //std::cout<<"operator FIN"<<std::endl; return outPix; } private: OffsetType m_Offset; + /** Stores min/max neighborhood area values */ DoubleVectorType m_Mini; - DoubleVectorType m_MiniOff; - DoubleVectorType m_Maxi; + DoubleVectorType m_Maxi; + /** Stores min/max neighborhood+offset values */ + DoubleVectorType m_MiniOff; DoubleVectorType m_MaxiOff; }; -} // namespace Functor + } // namespace Functor } // namespace otb #endif diff --git a/Code/Radiometry/otbVegetationIndex.h b/Code/Radiometry/otbVegetationIndex.h index 2dc621a2800f5e74e4fc286a8363fc7058fb5559..9304da4f3a9db43063f2c0484fbed068bd609175 100644 --- a/Code/Radiometry/otbVegetationIndex.h +++ b/Code/Radiometry/otbVegetationIndex.h @@ -256,7 +256,7 @@ public: * * This vegetation index use three inputs channels * - * [Yoram J. Kaufman and Didier Tanré, 1992] + * [Yoram J. Kaufman and Didier Tanr�, 1992] * * \ingroup Functor */ @@ -295,6 +295,85 @@ private: double m_Gamma; }; +/** \class EVI + * \brief This functor calculate the Enhanced Vegetation Index (EVI) + * + * This vegetation index use three inputs channels + * + * [Huete, Justice, & Liu, 1994; Huete, Liu, Batchily, & van Leeuwen, 1997] + * + * \ingroup Functor + */ +template <class TInput1, class TInput2, class TInput3, class TOutput> +class EVI +{ +public: + EVI() : m_G(2.5), m_C1(6.0), m_C2(7.5), m_L(1.0) {}; + ~EVI() {}; + inline TOutput operator()(const TInput1 &r, const TInput2 &b, const TInput3 &nir) + { + double dr = static_cast<double>(r); + double db = static_cast<double>(b); + double dnir = static_cast<double>(nir); + double denominator = dnir + m_C1*dr - m_C2*db + m_L; + if ( denominator == 0. ) + { + return static_cast<TOutput>(0.); + } + return ( static_cast<TOutput>( m_G * (dnir - dr)/denominator ) ); + } + /** Set/Get G parameter */ + void SetG(const double g) + { + m_G = g; + } + double GetG(void)const + { + return (m_G); + } + /** Set/Get C1 parameter */ + void SetC1(const double c1) + { + m_C1 = c1; + } + double GetC1(void)const + { + return (m_C1); + } + /** Set/Get C2 parameter */ + void SetC2(const double c2) + { + m_C2 = c2; + } + double GetC2(void)const + { + return (m_C2); + } + /** Set/Get L parameter */ + void SetL(const double l) + { + m_L = l; + } + double GetL(void)const + { + return (m_L); + } + +private: + + /** Gain factor */ + double m_G; + + /** Coefficient of the aerosol resistance term */ + double m_C1; + + /** Coefficient of the aerosol resistance term */ + double m_C2; + + /** Canopy background adjustment */ + double m_L; +}; + } // namespace Functor } // namespace otb diff --git a/Testing/Code/FeatureExtraction/CMakeLists.txt b/Testing/Code/FeatureExtraction/CMakeLists.txt index a4dd84ccb574ecd933190e658314c4213008ba89..3262c5858e5a09e9df19bfc8651a4f383d2a33a5 100644 --- a/Testing/Code/FeatureExtraction/CMakeLists.txt +++ b/Testing/Code/FeatureExtraction/CMakeLists.txt @@ -434,7 +434,7 @@ ADD_TEST(feTvExtractSegments ${FEATUREEXTRACTION_TESTS6} ${INPUTDATA}/ImageLine_hd.bsq.hdr ${INPUTDATA}/ImageLineDir.bsq.hdr ${TEMP}/feFiltreExtractSegments_ImageLine.hdr - 2 0.3 20 20 2 10 0.5) + 10 0.3 10 10 3 10 0.5) # ------- otb::ForwardFourierMellinTransformImageFilter ------------- diff --git a/Testing/Code/FeatureExtraction/otbExtractSegments.cxx b/Testing/Code/FeatureExtraction/otbExtractSegments.cxx index 15a4dba6254d75fecc3c14a73999a5c63e6167be..08871de80b3839b7b9bf0531089c7e5eda275a24 100644 --- a/Testing/Code/FeatureExtraction/otbExtractSegments.cxx +++ b/Testing/Code/FeatureExtraction/otbExtractSegments.cxx @@ -90,7 +90,7 @@ int otbExtractSegments( int argc, char * argv[] ) RescalerType::Pointer rescaler = RescalerType::New(); rescaler->SetOutputMinimum(0); - rescaler->SetOutputMaximum(1); + rescaler->SetOutputMaximum(255); reader1->SetFileName( inputFilename1 ); reader2->SetFileName( inputFilename2 ); diff --git a/Testing/Code/Radiometry/CMakeLists.txt b/Testing/Code/Radiometry/CMakeLists.txt index ecfe15907588ff63b0c33722f439ffba310c14b9..b49d17bd43ca3ba338b71f3ec09ace193297a47c 100644 --- a/Testing/Code/Radiometry/CMakeLists.txt +++ b/Testing/Code/Radiometry/CMakeLists.txt @@ -487,6 +487,40 @@ ADD_TEST(raTvAtmosphericCorrectionSequencementTest ${RADIOMETRY_TESTS4} ) +# ------- otb::RAndBAndNIRVegetationIndexImageFilter ------------------------------ +ADD_TEST(raTvEVIRAndBAndNIRVegetationIndexImageFilter ${RADIOMETRY_TESTS4} + #--compare-image ${EPSILON} ${BASELINE}/raRAndBAndNIRVegetationIndex_EVI_poupees_subc1c2c3.tif + # ${TEMP}/raRAndBAndNIRVegetationIndex_EVI_poupees_subc1c2c3.tif + otbEVIRAndBAndNIRVegetationIndexImageFilter + EVI + ${INPUTDATA}/poupees_sub_c1.png + ${INPUTDATA}/poupees_sub_c2.png + ${INPUTDATA}/poupees_sub_c3.png + ${TEMP}/raRAndBAndNIRVegetationIndex_EVI_poupees_subc1c2c3.tif + 2.5 + 6.0 + 7.5 + 1.0 +) + +# ------- otb::MultiChannelRAndBAndNIRVegetationIndexImageFilter ------------------------------ +ADD_TEST(raTvEVIMultiChannelRAndBAndNIRVegetationIndexImageFilter ${RADIOMETRY_TESTS4} + #--compare-image ${EPSILON} ${BASELINE}/raRAndBAndNIRVegetationIndex_EVI_poupees_subc1c2c3.tif + # ${TEMP}/raRAndBAndNIRVegetationIndex_EVI_poupees_subc1c2c3.tif + otbEVIMultiChannelRAndBAndNIRVegetationIndexImageFilter + EVI + ${INPUTDATA}/qb_RoadExtract.img.hdr + ${TEMP}/raRAndBAndNIRVegetationIndex_EVI_qb_RoadExtract.tif + 3 # red + 1 # blue + 4 # nir + 2.5 # gain factor + 6.0 # coefficient of the aerosol resistance term + 7.5 # coefficient of the aerosol resistance term + 1.0 # canopy background adjustment +) + + # A enrichir SET(Radiometry_SRCS1 @@ -526,6 +560,8 @@ SET(Radiometry_SRCS4 otbAtmosphericCorrectionParametersTo6SAtmosphericRadiativeTermsNew.cxx otbAtmosphericCorrectionParametersTo6SAtmosphericRadiativeTerms.cxx otbAtmosphericCorrectionSequencement.cxx +otbEVIRAndBAndNIRVegetationIndexImageFilter.cxx +otbEVIMultiChannelRAndBAndNIRVegetationIndexImageFilter.cxx ) INCLUDE_DIRECTORIES("${OTBTesting_BINARY_DIR}") diff --git a/Testing/Code/Radiometry/otbEVIMultiChannelRAndBAndNIRVegetationIndexImageFilter.cxx b/Testing/Code/Radiometry/otbEVIMultiChannelRAndBAndNIRVegetationIndexImageFilter.cxx new file mode 100644 index 0000000000000000000000000000000000000000..bd3d6503c45b9fa0d68c939a7d0857ce6c5593f9 --- /dev/null +++ b/Testing/Code/Radiometry/otbEVIMultiChannelRAndBAndNIRVegetationIndexImageFilter.cxx @@ -0,0 +1,89 @@ +/*========================================================================= + + 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 "itkExceptionObject.h" + +#include "otbMultiChannelRAndBAndNIRVegetationIndexImageFilter.h" +#include "otbImage.h" +#include "otbVectorImage.h" +#include "otbImageFileReader.h" +#include "otbImageFileWriter.h" +#include "otbVegetationIndex.h" + + +template<class TInputImage, class TOutputImage, class TFunction> +int generic_EVIMultiChannelRAndBAndNIRVegetationIndexImageFilter(int argc, char * argv[]) +{ + typedef otb::ImageFileReader<TInputImage> ReaderType; + typedef otb::ImageFileWriter<TOutputImage> WriterType; + + typedef otb::MultiChannelRAndBAndNIRVegetationIndexImageFilter<TInputImage,TOutputImage,TFunction> + MultiChannelRAndBAndNIRVegetationIndexImageFilterType; + + // Instantiating object + typename MultiChannelRAndBAndNIRVegetationIndexImageFilterType::Pointer filter = MultiChannelRAndBAndNIRVegetationIndexImageFilterType::New(); + typename ReaderType::Pointer reader = ReaderType::New(); + typename WriterType::Pointer writer = WriterType::New(); + + const char * inputFilename = argv[1]; + const char * outputFilename = argv[2]; + + unsigned int redChannel(::atoi(argv[3])); + unsigned int blueChannel(::atoi(argv[4])); + unsigned int nirChannel(::atoi(argv[5])); + + double g(::atof(argv[6])); + double c1(::atof(argv[7])); + double c2(::atof(argv[8])); + double l(::atof(argv[9])); + + reader->SetFileName( inputFilename ); + writer->SetFileName( outputFilename ); + filter->SetRedIndex(redChannel); + filter->SetBlueIndex(blueChannel); + filter->SetNIRIndex(nirChannel); + filter->SetInput( reader->GetOutput() ); + filter->GetFunctor().SetG(g); + filter->GetFunctor().SetC1(c1); + filter->GetFunctor().SetC2(c2); + filter->GetFunctor().SetL(l); + + writer->SetInput( filter->GetOutput() ); + writer->Update(); + + return EXIT_SUCCESS; +} + +int otbEVIMultiChannelRAndBAndNIRVegetationIndexImageFilter(int argc, char * argv[]) +{ + const unsigned int Dimension = 2; + typedef otb::VectorImage<double ,Dimension> InputImageType; + typedef otb::Image<double,Dimension> OutputImageType; + + std::string strArgv(argv[1]); + argc--; + argv++; + if ( strArgv == "EVI" ) return( generic_EVIMultiChannelRAndBAndNIRVegetationIndexImageFilter<InputImageType, OutputImageType, + otb::Functor::EVI< InputImageType::InternalPixelType, + InputImageType::InternalPixelType, + InputImageType::InternalPixelType, + OutputImageType::PixelType> > + (argc,argv) ); + else + return EXIT_FAILURE; + return EXIT_SUCCESS; +} diff --git a/Testing/Code/Radiometry/otbEVIRAndBAndNIRVegetationIndexImageFilter.cxx b/Testing/Code/Radiometry/otbEVIRAndBAndNIRVegetationIndexImageFilter.cxx new file mode 100644 index 0000000000000000000000000000000000000000..3ba53fa6da3ab02166a6821be4917023638fb6a4 --- /dev/null +++ b/Testing/Code/Radiometry/otbEVIRAndBAndNIRVegetationIndexImageFilter.cxx @@ -0,0 +1,94 @@ +/*========================================================================= + + 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 "itkExceptionObject.h" + +#include "otbRAndBAndNIRVegetationIndexImageFilter.h" +#include "otbImage.h" +#include "otbImageFileReader.h" +#include "otbImageFileWriter.h" +#include "otbVegetationIndex.h" + + +template<class TInputRImage, class TInputBImage, class TInputNIRImage, class TOutputImage, class TFunction> +int generic_EVIRAndBAndNIRVegetationIndexImageFilter(int argc, char * argv[]) +{ + typedef otb::ImageFileReader<TInputRImage> RReaderType; + typedef otb::ImageFileReader<TInputBImage> BReaderType; + typedef otb::ImageFileReader<TInputNIRImage> NIRReaderType; + typedef otb::ImageFileWriter<TOutputImage> WriterType; + + typedef otb::RAndBAndNIRVegetationIndexImageFilter<TInputRImage,TInputBImage,TInputNIRImage,TOutputImage,TFunction> + RAndBAndNIRVegetationIndexImageFilterType; + + // Instantiating object + typename RAndBAndNIRVegetationIndexImageFilterType::Pointer filter = RAndBAndNIRVegetationIndexImageFilterType::New(); + typename RReaderType::Pointer readerR = RReaderType::New(); + typename BReaderType::Pointer readerB = BReaderType::New(); + typename NIRReaderType::Pointer readerNIR = NIRReaderType::New(); + typename WriterType::Pointer writer = WriterType::New(); + + const char * inputFilenameR = argv[1]; + const char * inputFilenameB = argv[2]; + const char * inputFilenameNIR = argv[3]; + const char * outputFilename = argv[4]; + double g(::atof(argv[5])); + double c1(::atof(argv[6])); + double c2(::atof(argv[7])); + double l(::atof(argv[8])); + + readerR->SetFileName( inputFilenameR ); + readerB->SetFileName( inputFilenameB ); + readerNIR->SetFileName( inputFilenameNIR ); + writer->SetFileName( outputFilename ); + filter->SetInputR( readerR->GetOutput() ); + filter->SetInputB( readerB->GetOutput() ); + filter->SetInputNIR( readerNIR->GetOutput() ); + + filter->GetFunctor().SetG(g); + filter->GetFunctor().SetC1(c1); + filter->GetFunctor().SetC2(c2); + filter->GetFunctor().SetL(l); + + writer->SetInput( filter->GetOutput() ); + writer->Update(); + + return EXIT_SUCCESS; +} + +int otbEVIRAndBAndNIRVegetationIndexImageFilter(int argc, char * argv[]) +{ + const unsigned int Dimension = 2; + typedef double PixelType; + typedef otb::Image<PixelType,Dimension> InputRImageType; + typedef otb::Image<PixelType,Dimension> InputBImageType; + typedef otb::Image<PixelType,Dimension> InputNIRImageType; + typedef otb::Image<double,Dimension> OutputImageType; + + std::string strArgv(argv[1]); + argc--; + argv++; + if ( strArgv == "EVI" ) return( generic_EVIRAndBAndNIRVegetationIndexImageFilter<InputRImageType, InputBImageType, InputNIRImageType, OutputImageType, + otb::Functor::EVI< InputRImageType::PixelType, + InputBImageType::PixelType, + InputNIRImageType::PixelType, + OutputImageType::PixelType> > + (argc,argv) ); + else + return EXIT_FAILURE; + return EXIT_SUCCESS; +} diff --git a/Testing/Code/Radiometry/otbRadiometryTests4.cxx b/Testing/Code/Radiometry/otbRadiometryTests4.cxx index 82be2c33f926e90d6a9771eae694b85875f0d6ea..c51fb1b5a29a17e11848460b77f322886111d710 100644 --- a/Testing/Code/Radiometry/otbRadiometryTests4.cxx +++ b/Testing/Code/Radiometry/otbRadiometryTests4.cxx @@ -30,5 +30,7 @@ void RegisterTests() REGISTER_TEST(otbAtmosphericCorrectionParametersTo6SAtmosphericRadiativeTermsNew); REGISTER_TEST(otbAtmosphericCorrectionParametersTo6SAtmosphericRadiativeTerms); REGISTER_TEST(otbAtmosphericCorrectionSequencementTest); + REGISTER_TEST(otbEVIRAndBAndNIRVegetationIndexImageFilter); + REGISTER_TEST(otbEVIMultiChannelRAndBAndNIRVegetationIndexImageFilter); }