diff --git a/Modules/Applications/AppClassification/app/CMakeLists.txt b/Modules/Applications/AppClassification/app/CMakeLists.txt index d72dd40b28904567e09309d1e5022c56ea479f74..3e1dbd85f5cd2ca409ddb9ef51389edf5e544976 100644 --- a/Modules/Applications/AppClassification/app/CMakeLists.txt +++ b/Modules/Applications/AppClassification/app/CMakeLists.txt @@ -53,10 +53,12 @@ otb_create_application( SOURCES otbComputePolylineFeatureFromImage.cxx LINK_LIBRARIES ${${otb-module}_LIBRARIES}) -otb_create_application( - NAME KMeansClassification - SOURCES otbKMeansClassification.cxx - LINK_LIBRARIES ${${otb-module}_LIBRARIES}) +if(OTB_USE_SHARK) + otb_create_application( + NAME KMeansClassification + SOURCES otbKMeansClassification.cxx + LINK_LIBRARIES ${${otb-module}_LIBRARIES}) +endif() otb_create_application( NAME TrainImagesClassifier diff --git a/Modules/Applications/AppClassification/app/otbKMeansClassification.cxx b/Modules/Applications/AppClassification/app/otbKMeansClassification.cxx index d8e234214bff46edfd1d5604390788f735a248b2..a5067bf9cdb782b5dd2d70e25a43c23f7d41baa8 100644 --- a/Modules/Applications/AppClassification/app/otbKMeansClassification.cxx +++ b/Modules/Applications/AppClassification/app/otbKMeansClassification.cxx @@ -405,6 +405,8 @@ private: "KMeansClassification is a composite application, " "using an existing training and classification application." "The SharkKMeans model is used.\n" + "KMeansClassification application is only available if OTB is compiled with Shark support" + "(CMake option OTB_USE_SHARK=ON)\n" "The steps of this composite application :\n" "1) ImageEnveloppe : create a shapefile (1 polygon),\n" "2) PolygonClassStatistics : compute the statistics,\n" diff --git a/Modules/Applications/AppImageUtils/app/CMakeLists.txt b/Modules/Applications/AppImageUtils/app/CMakeLists.txt index fe9bab84a533763ce162911ff230ec617a33c86d..1a858124b5c4f2320b3ec05a14c6ac9d7e312132 100644 --- a/Modules/Applications/AppImageUtils/app/CMakeLists.txt +++ b/Modules/Applications/AppImageUtils/app/CMakeLists.txt @@ -94,3 +94,8 @@ otb_create_application( NAME ManageNoData SOURCES otbManageNoData.cxx LINK_LIBRARIES ${${otb-module}_LIBRARIES}) + +otb_create_application( + NAME DynamicConvert + SOURCES otbDynamicConvert.cxx + LINK_LIBRARIES ${${otb-module}_LIBRARIES}) diff --git a/Modules/Applications/AppImageUtils/app/otbConvert.cxx b/Modules/Applications/AppImageUtils/app/otbConvert.cxx index 51ce7f3eebd9995e9f0a694c1bb27506b5f9292f..9dc6b4d17559d141591f7c04707c846575743877 100644 --- a/Modules/Applications/AppImageUtils/app/otbConvert.cxx +++ b/Modules/Applications/AppImageUtils/app/otbConvert.cxx @@ -105,6 +105,7 @@ private: SetDocAuthors("OTB-Team"); SetDocSeeAlso("Rescale"); + AddDocTag(Tags::Deprecated); AddDocTag(Tags::Manip); AddDocTag("Conversion"); AddDocTag("Image Dynamic"); diff --git a/Modules/Applications/AppImageUtils/app/otbDynamicConvert.cxx b/Modules/Applications/AppImageUtils/app/otbDynamicConvert.cxx new file mode 100644 index 0000000000000000000000000000000000000000..08696439549ca1c0b15e66baffd3352ccee7d29b --- /dev/null +++ b/Modules/Applications/AppImageUtils/app/otbDynamicConvert.cxx @@ -0,0 +1,532 @@ +/* + * Copyright (C) 2005-2017 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. + */ + +#include "otbWrapperApplication.h" +#include "otbWrapperApplicationFactory.h" + +#include "otbVectorRescaleIntensityImageFilter.h" +#include "otbUnaryImageFunctorWithVectorImageFilter.h" +#include "otbStreamingShrinkImageFilter.h" +#include "itkListSample.h" +#include "otbListSampleToHistogramListGenerator.h" +#include "itkImageRegionConstIterator.h" + +#include "otbImageListToVectorImageFilter.h" +#include "otbMultiToMonoChannelExtractROI.h" +#include "otbImageList.h" + +namespace otb +{ +namespace Wrapper +{ + +namespace Functor +{ + template< class TScalar > +class ITK_EXPORT LogFunctor +{ +public: + TScalar operator() (const TScalar& v) const + { + return std::log(v); + } +}; +} // end namespace Functor + + + +class DynamicConvert : public Application +{ +public: + /** Standard class typedefs. */ + typedef DynamicConvert Self; + typedef Application Superclass; + typedef itk::SmartPointer<Self> Pointer; + typedef itk::SmartPointer<const Self> ConstPointer; + + /** Standard macro */ + itkNewMacro(Self); + + itkTypeMacro(DynamicConvert, otb::Application); + + /** Filters typedef */ + typedef itk::Statistics::ListSample<FloatVectorImageType::PixelType> ListSampleType; + typedef itk::Statistics::DenseFrequencyContainer2 DFContainerType; + typedef ListSampleToHistogramListGenerator<ListSampleType, + FloatVectorImageType::InternalPixelType, + DFContainerType> HistogramsGeneratorType; + + typedef StreamingShrinkImageFilter<FloatVectorImageType, + FloatVectorImageType> ShrinkFilterType; + + typedef Functor::LogFunctor<FloatVectorImageType::InternalPixelType> TransferLogFunctor; + typedef UnaryImageFunctorWithVectorImageFilter<FloatVectorImageType, + FloatVectorImageType, + TransferLogFunctor> TransferLogType; + +private: + + void DoInit() ITK_OVERRIDE + { + SetName("DynamicConvert"); + SetDescription("Change the pixel type and rescale the image's dynamic"); + + // Documentation + SetDocName("Dynamic Conversion"); + // TODO + SetDocLongDescription("This application performs an image pixel type " + "conversion (short, ushort, uchar, int, uint, float and double types are " + "handled). The output image is written in the specified format (ie. " + "that corresponds to the given extension).\n The conversion can include " + "a rescale of the data range, by default it's set between the 2nd to " + "the 98th percentile. The rescale can be linear or log2. \n The choice " + "of the output channels can be done with the extended filename, but " + "less easy to handle. To do this, a 'channels' parameter allows you to " + "select the desired bands at the output. There are 3 modes, the " + "available choices are: \n * grayscale : to display mono image as " + "standard color image \n * rgb : select 3 bands in the input image " + "(multi-bands) \n * all : keep all bands."); + SetDocLimitations("None"); + SetDocAuthors("OTB-Team"); + SetDocSeeAlso("Convert, Rescale"); + + AddDocTag(Tags::Manip); + AddDocTag("Conversion"); + AddDocTag("Image Dynamic"); + + AddParameter(ParameterType_InputImage, "in", "Input image"); + SetParameterDescription("in", "Input image"); + + AddParameter(ParameterType_OutputImage, "out", "Output Image"); + SetParameterDescription("out", "Output image"); + SetDefaultOutputPixelType("out",ImagePixelType_uint8); + + AddParameter(ParameterType_Choice, "type", "Rescale type"); + SetParameterDescription("type", "Transfer function for the rescaling"); + AddChoice("type.linear", "Linear"); + AddChoice("type.log2", "Log2"); + SetParameterString("type", "linear", false); + + AddParameter(ParameterType_Float,"type.linear.gamma", + "Gamma correction factor"); + SetParameterDescription("type.linear.gamma", + "Gamma correction factor"); + SetDefaultParameterFloat("type.linear.gamma",1.0); + MandatoryOff("type.linear.gamma"); + + AddParameter(ParameterType_InputImage, "mask", "Input mask"); + SetParameterDescription("mask", + "The masked pixels won't be used to adapt the dynamic " + "(the mask must have the same dimensions as the input image)"); + MandatoryOff("mask"); + DisableParameter("mask"); + + AddParameter(ParameterType_Group,"quantile","Histogram quantile cutting"); + SetParameterDescription("quantile", + "Cut the histogram edges before rescaling"); + + AddParameter(ParameterType_Float, "quantile.high", "High cut quantile"); + SetParameterDescription("quantile.high", + "Quantiles to cut from histogram high values " + "before computing min/max rescaling (in percent, 2 by default)"); + MandatoryOff("quantile.high"); + SetDefaultParameterFloat("quantile.high", 2.0); + DisableParameter("quantile.high"); + + AddParameter(ParameterType_Float, "quantile.low", "Low cut quantile"); + SetParameterDescription("quantile.low", + "Quantiles to cut from histogram low values " + "before computing min/max rescaling (in percent, 2 by default)"); + MandatoryOff("quantile.low"); + SetDefaultParameterFloat("quantile.low", 2.0); + DisableParameter("quantile.low"); + + AddParameter(ParameterType_Choice, "channels", "Channels selection"); + SetParameterDescription("channels", "It's possible to select the channels " + "of the output image. There are 3 modes, the available choices are:"); + + AddChoice("channels.all", "Default mode"); + SetParameterDescription("channels.all", + "Select all bands in the input image, (1,...,n)."); + + AddChoice("channels.grayscale", "Grayscale mode"); + SetParameterDescription("channels.grayscale", + "Display single channel as standard color image."); + AddParameter(ParameterType_Int, "channels.grayscale.channel", + "Grayscale channel"); + SetDefaultParameterInt("channels.grayscale.channel", 1); + SetMinimumParameterIntValue("channels.grayscale.channel", 1); + + AddChoice("channels.rgb", "RGB composition"); + SetParameterDescription("channels.rgb", "Select 3 bands in the input image " + "(multi-bands), by default (1,2,3)."); + + AddParameter(ParameterType_Int, "channels.rgb.red", "Red Channel"); + SetParameterDescription("channels.rgb.red", "Red channel index."); + SetMinimumParameterIntValue("channels.rgb.red", 1); + AddParameter(ParameterType_Int, "channels.rgb.green", "Green Channel"); + SetParameterDescription("channels.rgb.green", "Green channel index."); + SetMinimumParameterIntValue("channels.rgb.green", 1); + AddParameter(ParameterType_Int, "channels.rgb.blue", "Blue Channel"); + SetParameterDescription("channels.rgb.blue", "Blue channel index."); + SetMinimumParameterIntValue("channels.rgb.blue", 1); + + AddParameter(ParameterType_Float, "outmin", "Output min value"); + SetDefaultParameterFloat("outmin", 0.0); + SetParameterDescription( "outmin", "Minimum value of the output image." ); + AddParameter(ParameterType_Float, "outmax", "Output max value"); + SetDefaultParameterFloat("outmax", 255.0); + SetParameterDescription( "outmax", "Maximum value of the output image." ); + MandatoryOff("outmin"); + MandatoryOff("outmax"); + + AddRAMParameter(); + + // Doc example parameter settings + SetDocExampleParameterValue("in", "QB_Toulouse_Ortho_XS.tif"); + SetDocExampleParameterValue("out", "otbConvertWithScalingOutput.png"); + SetDocExampleParameterValue("type", "linear"); + SetDocExampleParameterValue("channels", "rgb"); + SetDocExampleParameterValue("outmin", "0"); + SetDocExampleParameterValue("outmax", "255"); + + SetOfficialDocLink(); + } + + void DoUpdateParameters() ITK_OVERRIDE + { + // Read information + if ( HasValue("in") ) + { + typedef otb::ImageMetadataInterfaceBase ImageMetadataInterfaceType; + ImageMetadataInterfaceType::Pointer metadataInterface = + ImageMetadataInterfaceFactory::CreateIMI( + GetParameterImage("in")->GetMetaDataDictionary()); + + int nbBand = GetParameterImage("in")->GetNumberOfComponentsPerPixel(); + SetMaximumParameterIntValue("channels.grayscale.channel", nbBand); + SetMaximumParameterIntValue("channels.rgb.red", nbBand); + SetMaximumParameterIntValue("channels.rgb.green", nbBand); + SetMaximumParameterIntValue("channels.rgb.blue", nbBand); + + if (nbBand > 1) + { + // get band index : Red/Green/Blue, in depending on the sensor + auto const& display = metadataInterface->GetDefaultDisplay(); + SetDefaultParameterInt("channels.rgb.red", display[0] + 1); + SetDefaultParameterInt("channels.rgb.green", display[1] + 1); + SetDefaultParameterInt("channels.rgb.blue", display[2] + 1); + } + } + } + + template<class TImageType> + void GenericDoExecute() + { + // Clear previously registered filters + m_Filters.clear(); + + std::string rescaleType = this->GetParameterString("type"); + typedef otb::VectorRescaleIntensityImageFilter<FloatVectorImageType, TImageType> RescalerType; + typename RescalerType::Pointer rescaler = RescalerType::New(); + + // selected channel + auto tempImage = GetSelectedChannels<FloatVectorImageType>(); + + const unsigned int nbComp(tempImage->GetNumberOfComponentsPerPixel()); + + // We need to subsample the input image in order to estimate its histogram + // Shrink factor is computed so as to load a quicklook of 1000 + // pixels square at most + auto imageSize = tempImage->GetLargestPossibleRegion().GetSize(); + unsigned int shrinkFactor = std::max({int(imageSize[0])/1000, + int(imageSize[1])/1000, 1}); + otbAppLogDEBUG( << "Shrink factor used to compute Min/Max: "<<shrinkFactor ); + + otbAppLogDEBUG( << "Shrink starts..." ); + typename ShrinkFilterType::Pointer shrinkFilter = ShrinkFilterType::New(); + shrinkFilter->SetShrinkFactor(shrinkFactor); + shrinkFilter->GetStreamer()-> + SetAutomaticAdaptativeStreaming(GetParameterInt("ram")); + AddProcess(shrinkFilter->GetStreamer(), + "Computing shrink Image for min/max estimation..."); + + if ( rescaleType == "log2") + { + //define the transfer log + m_TransferLog = TransferLogType::New(); + m_TransferLog->SetInput(tempImage); + m_TransferLog->UpdateOutputInformation(); + + shrinkFilter->SetInput(m_TransferLog->GetOutput()); + rescaler->SetInput(m_TransferLog->GetOutput()); + shrinkFilter->Update(); + } + else + { + shrinkFilter->SetInput(tempImage); + rescaler->SetInput(tempImage); + shrinkFilter->Update(); + } + + otbAppLogDEBUG( << "Evaluating input Min/Max..." ); + itk::ImageRegionConstIterator<FloatVectorImageType> + it(shrinkFilter->GetOutput(), + shrinkFilter->GetOutput()->GetLargestPossibleRegion()); + + typename ListSampleType::Pointer listSample = ListSampleType::New(); + listSample->SetMeasurementVectorSize( + tempImage->GetNumberOfComponentsPerPixel()); + + // Now we generate the list of samples + if (IsParameterEnabled("mask")) + { + FloatVectorImageType::Pointer mask = this->GetParameterImage("mask"); + ShrinkFilterType::Pointer maskShrinkFilter = ShrinkFilterType::New(); + maskShrinkFilter->SetShrinkFactor(shrinkFactor); + maskShrinkFilter->SetInput(mask); + maskShrinkFilter->GetStreamer()-> + SetAutomaticAdaptativeStreaming(GetParameterInt("ram")); + maskShrinkFilter->Update(); + + auto itMask = itk::ImageRegionConstIterator<FloatVectorImageType>( + maskShrinkFilter->GetOutput(), + maskShrinkFilter->GetOutput()->GetLargestPossibleRegion()); + + // Remove masked pixels + it.GoToBegin(); + itMask.GoToBegin(); + for(; !it.IsAtEnd(); ++it, ++itMask) + { + // float values, so the threshold is set to 0.5 + if (itMask.Get()[0] > 0.5) + { + listSample->PushBack(it.Get()); + } + } + // if listSample is empty + if (listSample->Size() == 0) + { + otbAppLogINFO( << "All pixels were masked, the application assume " + "a wrong mask and include all the image"); + } + } + + // get all pixels : if mask is disable or all pixels were masked + if ((!IsParameterEnabled("mask")) || (listSample->Size() == 0)) + { + for(it.GoToBegin(); !it.IsAtEnd(); ++it) + { + listSample->PushBack(it.Get()); + } + } + + // And then the histogram + typename HistogramsGeneratorType::Pointer histogramsGenerator = + HistogramsGeneratorType::New(); + histogramsGenerator->SetListSample(listSample); + histogramsGenerator->SetNumberOfBins(255); + // Samples with nodata values are ignored + histogramsGenerator->NoDataFlagOn(); + histogramsGenerator->Update(); + auto histOutput = histogramsGenerator->GetOutput(); + assert(histOutput); + + // And extract the lower and upper quantile + typename FloatVectorImageType::PixelType inputMin(nbComp), inputMax(nbComp); + for(unsigned int i = 0; i < nbComp; ++i) + { + auto && elm = histOutput->GetNthElement(i); + assert(elm); + inputMin[i] = elm->Quantile(0, + 0.01 * GetParameterFloat("quantile.low")); + inputMax[i] = elm->Quantile(0, + 1.0 - 0.01 * GetParameterFloat("quantile.high")); + } + + otbAppLogDEBUG( << std::setprecision(5) + << "Min/Max computation done : min=" + << inputMin + << " max=" << inputMax ); + + rescaler->AutomaticInputMinMaxComputationOff(); + rescaler->SetInputMinimum(inputMin); + rescaler->SetInputMaximum(inputMax); + + if ( rescaleType == "linear") + { + rescaler->SetGamma(GetParameterFloat("type.linear.gamma")); + } + + typename TImageType::PixelType minimum(nbComp); + typename TImageType::PixelType maximum(nbComp); + + /* + float outminvalue = std::numeric_limits<typename TImageType::InternalPixelType>::min(); + float outmaxvalue = std::numeric_limits<typename TImageType::InternalPixelType>::max(); + // TODO test outmin/outmax values + if (outminvalue > GetParameterFloat("outmin")) + itkExceptionMacro("The outmin value at " << GetParameterFloat("outmin") << + " is too low, select a value in "<< outminvalue <<" min."); + if ( outmaxvalue < GetParameterFloat("outmax") ) + itkExceptionMacro("The outmax value at " << GetParameterFloat("outmax") << + " is too high, select a value in "<< outmaxvalue <<" max."); + */ + + maximum.Fill( GetParameterFloat("outmax") ); + minimum.Fill( GetParameterFloat("outmin") ); + + rescaler->SetOutputMinimum(minimum); + rescaler->SetOutputMaximum(maximum); + + m_Filters.push_back(rescaler.GetPointer()); + SetParameterOutputImage<TImageType>("out", rescaler->GetOutput()); + } + + // Get the bands order + std::vector<int> const GetChannels() + { + std::vector<int> channels; + + int nbChan = GetParameterImage("in")->GetNumberOfComponentsPerPixel(); + std::string channelMode = GetParameterString("channels"); + + if(channelMode == "grayscale") + { + if (GetParameterInt("channels.grayscale.channel") <= nbChan) + { + channels = {GetParameterInt("channels.grayscale.channel"), + GetParameterInt("channels.grayscale.channel"), + GetParameterInt("channels.grayscale.channel")}; + } + else + { + itkExceptionMacro(<< "The channel has an invalid index"); + } + } + else if (channelMode == "rgb") + { + if ((GetParameterInt("channels.rgb.red") <= nbChan) + && ( GetParameterInt("channels.rgb.green") <= nbChan) + && ( GetParameterInt("channels.rgb.blue") <= nbChan)) + { + channels = {GetParameterInt("channels.rgb.red"), + GetParameterInt("channels.rgb.green"), + GetParameterInt("channels.rgb.blue")}; + } + else + { + itkExceptionMacro(<< "At least one needed channel has an invalid " + "index"); + } + } + else if (channelMode == "all") + { + // take all bands + channels.resize(nbChan); + std::iota(channels.begin(), channels.end(), 1); + } + return channels; + } + + // return an image with the bands order modified of the input image + template<class TImageType> + typename TImageType::Pointer GetSelectedChannels() + { + typedef MultiToMonoChannelExtractROI<FloatVectorImageType::InternalPixelType, + typename TImageType::InternalPixelType> ExtractROIFilterType; + typedef otb::ImageList<otb::Image<typename TImageType::InternalPixelType> > ImageListType; + typedef ImageListToVectorImageFilter<ImageListType, + TImageType > ListConcatenerFilterType; + + typename ImageListType::Pointer imageList = ImageListType::New(); + typename ListConcatenerFilterType::Pointer concatener = + ListConcatenerFilterType::New(); + + //m_Filters.push_back(imageList.GetPointer()); + m_Filters.push_back(concatener.GetPointer()); + + const bool monoChannel = IsParameterEnabled("channels.grayscale"); + + // get band order + const std::vector<int> channels = GetChannels(); + + for (auto && channel : channels) + { + typename ExtractROIFilterType::Pointer extractROIFilter = + ExtractROIFilterType::New(); + m_Filters.push_back(extractROIFilter.GetPointer()); + extractROIFilter->SetInput(GetParameterImage("in")); + if (!monoChannel) + extractROIFilter->SetChannel(channel); + + extractROIFilter->UpdateOutputInformation(); + imageList->PushBack(extractROIFilter->GetOutput()); + } + + concatener->SetInput(imageList); + concatener->UpdateOutputInformation(); + + return concatener->GetOutput(); + } + + + void DoExecute() override + { + switch ( this->GetParameterOutputImagePixelType("out") ) + { + case ImagePixelType_uint8: + GenericDoExecute<UInt8VectorImageType>(); + break; + case ImagePixelType_int16: + GenericDoExecute<Int16VectorImageType>(); + break; + case ImagePixelType_uint16: + GenericDoExecute<UInt16VectorImageType>(); + break; + case ImagePixelType_int32: + GenericDoExecute<Int32VectorImageType>(); + break; + case ImagePixelType_uint32: + GenericDoExecute<UInt32VectorImageType>(); + break; + case ImagePixelType_float: + GenericDoExecute<FloatVectorImageType>(); + break; + case ImagePixelType_double: + GenericDoExecute<DoubleVectorImageType>(); + break; + default: + itkExceptionMacro("Unknown pixel type " + <<this->GetParameterOutputImagePixelType("out")<<"."); + break; + } + } + + itk::ProcessObject::Pointer m_TmpFilter; + TransferLogType::Pointer m_TransferLog; + std::vector<itk::LightObject::Pointer> m_Filters; +}; + +} +} + +OTB_APPLICATION_EXPORT(otb::Wrapper::DynamicConvert) + diff --git a/Modules/Applications/AppImageUtils/app/otbRescale.cxx b/Modules/Applications/AppImageUtils/app/otbRescale.cxx index 54cb606e0ac84f2489b8046e19fe44a365d69595..f5c08c80a24bed127fb76e1fbc93f13d54d40915 100644 --- a/Modules/Applications/AppImageUtils/app/otbRescale.cxx +++ b/Modules/Applications/AppImageUtils/app/otbRescale.cxx @@ -62,8 +62,8 @@ private: SetDocAuthors("OTB-Team"); SetDocSeeAlso(" "); + AddDocTag(Tags::Deprecated); AddDocTag(Tags::Manip); - AddParameter(ParameterType_InputImage, "in", "Input Image"); SetParameterDescription( "in", "The image to scale." ); AddParameter(ParameterType_OutputImage, "out", "Output Image"); diff --git a/Modules/Applications/AppImageUtils/test/CMakeLists.txt b/Modules/Applications/AppImageUtils/test/CMakeLists.txt index 7c33a6b68e7078ab32d85c1890ac21e16df9859a..d2852f4d46be0c1a130e293c101fdd1934e60aae 100644 --- a/Modules/Applications/AppImageUtils/test/CMakeLists.txt +++ b/Modules/Applications/AppImageUtils/test/CMakeLists.txt @@ -36,7 +36,7 @@ otb_test_application(NAME apTvUtConvertBasic OPTIONS -in ${INPUTDATA}/QB_Toulouse_Ortho_XS.tif -out ${TEMP}/apTvUtConvertBasicOutput.tif float VALID --compare-image ${NOTOL} - ${INPUTDATA}/apTvUtConvertBasicOutput.tif + ${OTBAPP_BASELINE}/apTvUtConvertBasicOutput.tif ${TEMP}/apTvUtConvertBasicOutput.tif ) @@ -52,8 +52,8 @@ otb_test_application(NAME apTvUtConvertWithScaling -out ${TEMP}/apTvUtConvertWithScalingOutput.tif -type linear VALID --compare-image ${NOTOL} - ${INPUTDATA}/apTvUtConvertWithScalingOutput.tif - ${TEMP}/apTvUtConvertWithScalingOutput.tif + ${OTBAPP_BASELINE}/apTvUtConvertWithScalingOutput.tif + ${TEMP}/apTvUtConvertWithScalingOutput.tif ) otb_test_application(NAME apTvUtConvertExtendedFilename_readerGEOM @@ -74,7 +74,7 @@ otb_test_application(NAME apTvUtConvertSelectChannels -channels.rgb.blue 1 -type linear VALID --compare-image ${NOTOL} - ${INPUTDATA}/apTvUtConvertSelectChannelsRgbOutput.tif + ${OTBAPP_BASELINE}/apTvUtConvertSelectChannelsRgbOutput.tif ${TEMP}/apTvUtConvertSelectChannelsRgbOutput.tif) otb_test_application(NAME apTvUtConvertMonoChannel @@ -84,9 +84,46 @@ otb_test_application(NAME apTvUtConvertMonoChannel -channels grayscale -type linear VALID --compare-image ${NOTOL} - ${INPUTDATA}/apTvUtConvertMonoChannelOutput.tif + ${OTBAPP_BASELINE}/apTvUtConvertMonoChannelOutput.tif ${TEMP}/apTvUtConvertMonoChannelOutput.tif) +#----------- DynamicConvert TESTS ------------ +otb_test_application(NAME apTvUtDynamicConvertBasic + APP DynamicConvert + OPTIONS -in ${INPUTDATA}/QB_Toulouse_Ortho_XS.tif + -out ${TEMP}/apTvUtDynamicConvertOutput.tif + -type linear + -channels rgb + -channels.rgb.red 2 + -channels.rgb.green 3 + -channels.rgb.blue 1 + VALID --compare-image ${NOTOL} + ${OTBAPP_BASELINE}/apTvUtConvertSelectChannelsRgbOutput.tif + ${TEMP}/apTvUtDynamicConvertOutput.tif) + +otb_test_application(NAME apTvUtDynamicConvertLog2 + APP DynamicConvert + OPTIONS -in ${INPUTDATA}/QB_Toulouse_Ortho_XS.tif + -out ${TEMP}/apTvUtDynamicConvertLog2Output.tif + -type log2 + VALID --compare-image ${NOTOL} + ${OTBAPP_BASELINE}/apTvUtDynamicConvertLog2Output.tif + ${TEMP}/apTvUtDynamicConvertLog2Output.tif) + +otb_test_application(NAME apTvUtDynamicConvertFloat + APP DynamicConvert + OPTIONS -in ${INPUTDATA}/QB_Toulouse_Ortho_PAN.tif + -out ${TEMP}/apTvUtDynamicConvertFloatOutput.tif float + -type linear + -type.linear.gamma 2.2 + -outmin 0.0 + -outmax 1.0 + -quantile.low 0 + -quantile.high 4 + VALID --compare-image ${NOTOL} + ${OTBAPP_BASELINE}/apTvUtDynamicConvertFloatOutput.tif + ${TEMP}/apTvUtDynamicConvertFloatOutput.tif) + #----------- PixelInfo TESTS ---------------- #----------- ExtractROI TESTS ---------------- diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperTags.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperTags.h index ace5277f8b4e9747738a72fe01e5f885fadcdaff..6b5e3869aa4da529479652dd75e6fb96334e1932 100644 --- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperTags.h +++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperTags.h @@ -49,6 +49,7 @@ static const std::string SAR="SAR"; static const std::string Stereo="Stereo"; static const std::string Segmentation="Segmentation"; static const std::string Vector="Vector Data Manipulation"; +static const std::string Deprecated="Deprecated"; } // end namespace Wrappers } // end namespace Tags