diff --git a/Modules/Applications/AppProjection/app/otbSuperimpose.cxx b/Modules/Applications/AppProjection/app/otbSuperimpose.cxx index 3293c3ad1f229e6af4ff39755c11f348e869038a..a2fc5e2549333380e9b2cca755f2cacf3f43eeea 100644 --- a/Modules/Applications/AppProjection/app/otbSuperimpose.cxx +++ b/Modules/Applications/AppProjection/app/otbSuperimpose.cxx @@ -106,6 +106,11 @@ private: SetDefaultParameterFloat("lms", 4.); MandatoryOff("lms"); + AddParameter(ParameterType_Float, "fv", "Fill Value"); + SetParameterDescription("fv","Fill value for area outside the reprojected image"); + SetDefaultParameterFloat("fv", 0.); + MandatoryOff("fv"); + AddParameter(ParameterType_OutputImage, "out", "Output image"); SetParameterDescription("out","Output reprojected image."); @@ -210,8 +215,8 @@ private: FloatVectorImageType::PixelType defaultValue; itk::NumericTraits<FloatVectorImageType::PixelType>::SetLength(defaultValue, movingImage->GetNumberOfComponentsPerPixel()); + defaultValue.Fill(GetParameterFloat("fv")); - if(GetParameterString("mode")=="default") { if(IsParameterEnabled("lms")) diff --git a/Modules/Filtering/ImageManipulation/include/otbStreamingShrinkImageFilter.h b/Modules/Filtering/ImageManipulation/include/otbStreamingShrinkImageFilter.h index 38d511a2ca3b9ab38c56529d1bc238af2aadbf14..51cef1b3d9c74b4054c2c8eb47ec99a40ba5cfc8 100644 --- a/Modules/Filtering/ImageManipulation/include/otbStreamingShrinkImageFilter.h +++ b/Modules/Filtering/ImageManipulation/include/otbStreamingShrinkImageFilter.h @@ -78,7 +78,6 @@ public: const RegionType& region) ITK_OVERRIDE; itkGetMacro(TileSizeAlignment, unsigned int); - itkSetMacro(TileSizeAlignment, unsigned int); itkGetMacro(TileDimension, unsigned int); @@ -246,6 +245,9 @@ private: /** The shrink factor */ unsigned int m_ShrinkFactor; + + /** The offset to get the cell center */ + IndexType m_Offset; }; // end of class PersistentStatisticsVectorImageFilter diff --git a/Modules/Filtering/ImageManipulation/include/otbStreamingShrinkImageFilter.txx b/Modules/Filtering/ImageManipulation/include/otbStreamingShrinkImageFilter.txx index d20cd23bb9b90f355a6ef6cc3ba573682ca82f9a..df3082cce1c204d7228c1a48c7a74d03da54956c 100644 --- a/Modules/Filtering/ImageManipulation/include/otbStreamingShrinkImageFilter.txx +++ b/Modules/Filtering/ImageManipulation/include/otbStreamingShrinkImageFilter.txx @@ -43,7 +43,7 @@ StreamingShrinkStreamingManager<TImage>::PrepareStreaming( itk::DataObject * inp { typedef otb::StreamingShrinkImageRegionSplitter TileSplitterType; TileSplitterType::Pointer splitter = TileSplitterType::New(); - splitter->SetTileSizeAlignment(m_ShrinkFactor); + splitter->SetShrinkFactor(m_ShrinkFactor); this->m_Splitter = splitter; unsigned long nbDivisions = this->EstimateOptimalNumberOfDivisions(input, region, 0); @@ -125,6 +125,9 @@ PersistentShrinkImageFilter<TInputImage, TOutputImage> inputSpacing = inputPtr->GetSpacing(); const typename InputImageType::SizeType& inputSize = inputPtr->GetLargestPossibleRegion().GetSize(); + const typename InputImageType::IndexType& inputIndex + = inputPtr->GetLargestPossibleRegion().GetIndex(); + typename InputImageType::IndexType startIndex; typename OutputImageType::SpacingType shrunkOutputSpacing; typename OutputImageType::RegionType shrunkOutputLargestPossibleRegion; @@ -134,12 +137,14 @@ PersistentShrinkImageFilter<TInputImage, TOutputImage> for (unsigned int i = 0; i < OutputImageType::ImageDimension; ++i) { + startIndex[i] = inputIndex[i] + (m_ShrinkFactor - 1) / 2; + if (m_ShrinkFactor > inputSize[i]) + startIndex[i] = inputIndex[i] + (inputSize[i] - 1) / 2; + m_Offset[i] = startIndex[i] % m_ShrinkFactor; shrunkOutputSpacing[i] = inputSpacing[i] * static_cast<double>(m_ShrinkFactor); shrunkOutputSize[i] = inputSize[i] > m_ShrinkFactor ? inputSize[i] / m_ShrinkFactor : 1; - shrunkOutputOrigin[i] = inputPtr->GetOrigin()[i] + inputSpacing[i] * - (static_cast<double>(inputPtr->GetLargestPossibleRegion().GetIndex(i)) - 0.5) - + shrunkOutputSpacing[i] * 0.5; + shrunkOutputOrigin[i] = inputPtr->GetOrigin()[i] + inputSpacing[i] * startIndex[i]; // we choose to output a region with a start index [0,0] // the origin is set accordingly @@ -184,12 +189,12 @@ PersistentShrinkImageFilter<TInputImage, TOutputImage> { const IndexType& inIndex = inIt.GetIndex(); // TODO the pixel value should be taken near the centre of the cell, not at the corners - if (inIndex[0] % m_ShrinkFactor == 0 - && inIndex[1] % m_ShrinkFactor == 0 ) + if ((inIndex[0] - m_Offset[0]) % m_ShrinkFactor == 0 + && (inIndex[1] - m_Offset[1]) % m_ShrinkFactor == 0 ) { IndexType shrunkIndex; - shrunkIndex[0] = inIndex[0] / m_ShrinkFactor; - shrunkIndex[1] = inIndex[1] / m_ShrinkFactor; + shrunkIndex[0] = (inIndex[0] - m_Offset[0]) / m_ShrinkFactor; + shrunkIndex[1] = (inIndex[1] - m_Offset[1]) / m_ShrinkFactor; if (m_ShrunkOutput->GetLargestPossibleRegion().IsInside(shrunkIndex)) m_ShrunkOutput->SetPixel(shrunkIndex, inIt.Get()); } diff --git a/Modules/Filtering/ImageManipulation/src/otbStreamingShrinkImageFilter.cxx b/Modules/Filtering/ImageManipulation/src/otbStreamingShrinkImageFilter.cxx index e1e2064c29a8155856e442209a750553efdba5b9..dbbb0c7036835d77cbaf84123d880e888514f76e 100644 --- a/Modules/Filtering/ImageManipulation/src/otbStreamingShrinkImageFilter.cxx +++ b/Modules/Filtering/ImageManipulation/src/otbStreamingShrinkImageFilter.cxx @@ -27,23 +27,24 @@ StreamingShrinkImageRegionSplitter unsigned int theoricalNbPixelPerTile = region.GetNumberOfPixels() / requestedNumber; unsigned int theoricalTileDimension = static_cast<unsigned int> (vcl_sqrt(static_cast<double>(theoricalNbPixelPerTile)) ); - // Take the previous multiple of m_TileSizeAlignment (eventually generate more splits than requested) - m_TileDimension = theoricalTileDimension / m_TileSizeAlignment * m_TileSizeAlignment; + // Take the previous multiple of m_ShrinkFactor (eventually generate more splits than requested) + m_TileDimension = theoricalTileDimension / m_ShrinkFactor * m_ShrinkFactor; - // Minimal tile size is m_TileSizeAlignment * m_TileSizeAlignment - if (m_TileDimension < m_TileSizeAlignment) + // Minimal tile size is m_ShrinkFactor * m_ShrinkFactor + if (m_TileDimension < m_ShrinkFactor) { - otbMsgDevMacro(<< "Using the minimal tile size : " << m_TileSizeAlignment << " * " << m_TileSizeAlignment); - m_TileDimension = m_TileSizeAlignment; + otbMsgDevMacro(<< "Using the minimal tile size : " << m_ShrinkFactor << " * " << m_ShrinkFactor); + m_TileDimension = m_ShrinkFactor; } - // Use the computed tile size, and generate (m_TileDimension * 1) tiles const SizeType& regionSize = region.GetSize(); - m_SplitsPerDimension[0] = (regionSize[0] + m_TileDimension - 1) / m_TileDimension; - m_SplitsPerDimension[1] = regionSize[1] / m_TileSizeAlignment; + // Compute the alignment of the sampling grid + m_TileSizeAlignment = (m_ShrinkFactor - 1) / 2; + if (m_ShrinkFactor > regionSize[1]) m_TileSizeAlignment = (regionSize[1] - 1)/2; - if (m_SplitsPerDimension[1] == 0) - m_SplitsPerDimension[1] = 1; + // Use the computed tile size, and generate (m_TileDimension * 1) tiles + m_SplitsPerDimension[0] = (regionSize[0] + m_TileDimension - 1) / m_TileDimension; + m_SplitsPerDimension[1] = (regionSize[1] - m_TileSizeAlignment - 1) / m_ShrinkFactor + 1; unsigned int numPieces = 1; for (unsigned int j = 0; j < ImageDimension; ++j) @@ -82,7 +83,7 @@ StreamingShrinkImageRegionSplitter // Transform the split index to the actual coordinates splitRegion.SetIndex(0, region.GetIndex(0) + m_TileDimension * splitIndex[0]); - splitRegion.SetIndex(1, region.GetIndex(1) + m_TileSizeAlignment * splitIndex[1]); + splitRegion.SetIndex(1, region.GetIndex(1) + m_ShrinkFactor * splitIndex[1] + m_TileSizeAlignment); splitRegion.SetSize(0, m_TileDimension); splitRegion.SetSize(1, 1); @@ -98,6 +99,7 @@ StreamingShrinkImageRegionSplitter ::PrintSelf(std::ostream& os, itk::Indent indent) const { Superclass::PrintSelf(os, indent); + os << indent << "ShrinkFactor : " << m_ShrinkFactor << std::endl; os << indent << "SplitsPerDimension : " << m_SplitsPerDimension << std::endl; os << indent << "TileDimension : " << m_TileDimension << std::endl; os << indent << "TileSizeAlignment : " << m_TileSizeAlignment << std::endl; diff --git a/Modules/Learning/Sampling/src/otbSamplingRateCalculator.cxx b/Modules/Learning/Sampling/src/otbSamplingRateCalculator.cxx index 121ed2b588e3a292140643a04ca305dbed1e5e00..934e2d480ae6437846280be21c23aa476054a9b7 100644 --- a/Modules/Learning/Sampling/src/otbSamplingRateCalculator.cxx +++ b/Modules/Learning/Sampling/src/otbSamplingRateCalculator.cxx @@ -50,15 +50,23 @@ SamplingRateCalculator MapRateType::iterator it = m_RatesByClass.begin(); for (; it != m_RatesByClass.end() ; ++it) { - if (smallestNbofSamples > it->second.Tot) + if (it->second.Tot) { - smallestNbofSamples = it->second.Tot; + if (smallestNbofSamples > it->second.Tot) + { + smallestNbofSamples = it->second.Tot; + } + } + else + { + otbWarningMacro("Ignoring empty class " << it->first); } } - // Check if there is an empty class - if (smallestNbofSamples == 0UL) + // Check if there is at least one non-empty class + if (smallestNbofSamples == itk::NumericTraits<unsigned long>::max()) { - otbWarningMacro("There is an empty class, sample size is set to zero!"); + otbWarningMacro("There are only empty classes, sample size is set to zero!"); + smallestNbofSamples = 0UL; } this->SetNbOfSamplesAllClasses( smallestNbofSamples ); } @@ -70,7 +78,15 @@ SamplingRateCalculator MapRateType::iterator it = m_RatesByClass.begin(); for (; it != m_RatesByClass.end() ; ++it) { - it->second.Required = dRequiredNbSamples; + if (it->second.Tot) + { + it->second.Required = dRequiredNbSamples; + } + else + { + // ignore empty classes + it->second.Required = 0UL; + } this->UpdateRate(it->first); } } diff --git a/Modules/Visualization/MonteverdiGui/CMakeLists.txt b/Modules/Visualization/MonteverdiGui/CMakeLists.txt index 73d8b00def4c69928e012d52803148695bebba76..37f9984e1ddbabc5b30532cf9802c06bfee4d2d0 100644 --- a/Modules/Visualization/MonteverdiGui/CMakeLists.txt +++ b/Modules/Visualization/MonteverdiGui/CMakeLists.txt @@ -7,4 +7,44 @@ set( OTBMonteverdiGUI_INCLUDE_DIRS ${OTBMonteverdiGUI_BINARY_DIR}/src ) + +set(OTBMonteverdiGUI_DATA_DIR "${CMAKE_SOURCE_DIR}/Utilities/Data") + +if (UNIX AND NOT APPLE) + # ------------------------- + # Install icons + # following freedesktop recommandations + # http://standards.freedesktop.org/icon-theme-spec/icon-theme-spec-latest.html + + # The different icon sizes installed + # According to the specs, the 48x48 icon is mandatory, others are optional + set( icon_sizes 16 32 48 128 ) + foreach( icon_size ${icon_sizes} ) + install(FILES ${OTBMonteverdiGUI_DATA_DIR}/Icons/monteverdi-${icon_size}x${icon_size}.png + DESTINATION share/icons/hicolor/${icon_size}x${icon_size}/apps + RENAME monteverdi.png) + endforeach() + + # Fallback on "/usr/share/pixmaps" + # See http://standards.freedesktop.org/icon-theme-spec/icon-theme-spec-latest.html#directory_layout + install(FILES ${OTBMonteverdiGUI_DATA_DIR}/Icons/monteverdi-32x32.png + DESTINATION share/pixmaps + RENAME monteverdi.png) + + install(FILES ${OTBMonteverdiGUI_DATA_DIR}/Icons/monteverdi-splash.png + DESTINATION share/pixmaps + RENAME monteverdi-splash.png) + + install(FILES ${OTBMonteverdiGUI_DATA_DIR}/Icons/monteverdi-32x32.xpm + DESTINATION share/pixmaps + RENAME monteverdi.xpm) + + # ------------------------- + # Install freedesktop entry + + install(FILES ${OTBMonteverdiGUI_DATA_DIR}/monteverdi.desktop + DESTINATION share/applications) + +endif() + otb_module_impl() diff --git a/SuperBuild/CMake/External_libsvm.cmake b/SuperBuild/CMake/External_libsvm.cmake index e385aa3c640a72aee6f0ca2637231982259c2628..34789c84b4481ed1282b270d7ba05f9b5a7c99c2 100644 --- a/SuperBuild/CMake/External_libsvm.cmake +++ b/SuperBuild/CMake/External_libsvm.cmake @@ -4,8 +4,8 @@ SETUP_SUPERBUILD(LIBSVM) ExternalProject_Add(LIBSVM PREFIX LIBSVM - URL "https://github.com/cjlin1/libsvm/archive/v320.tar.gz" - URL_MD5 b735fce96fc634f1d7e26b586181e1a4 + URL "https://github.com/cjlin1/libsvm/archive/v322.tar.gz" + URL_MD5 d9617d29efad013573f63ca9a517f490 BINARY_DIR ${LIBSVM_SB_BUILD_DIR} DOWNLOAD_DIR ${DOWNLOAD_LOCATION} INSTALL_DIR ${SB_INSTALL_PREFIX} diff --git a/Utilities/Data/CMakeLists.txt b/Utilities/Data/CMakeLists.txt deleted file mode 100644 index d4060576ab3db7625996ddce4a2d2ee30e1735ed..0000000000000000000000000000000000000000 --- a/Utilities/Data/CMakeLists.txt +++ /dev/null @@ -1,43 +0,0 @@ -if (UNIX AND NOT APPLE) - -# ------------------------- -# Install icons -# following freedesktop recommandations -# http://standards.freedesktop.org/icon-theme-spec/icon-theme-spec-latest.html - -# The different icon sizes installed -# According to the specs, the 48x48 icon is mandatory, others are optional -set( icon_sizes 16 32 48 128 ) -foreach( icon_size ${icon_sizes} ) - install(FILES Icons/monteverdi-${icon_size}x${icon_size}.png - DESTINATION share/icons/hicolor/${icon_size}x${icon_size}/apps - RENAME monteverdi.png - COMPONENT Resources) -endforeach() - -# Fallback on "/usr/share/pixmaps" -# See http://standards.freedesktop.org/icon-theme-spec/icon-theme-spec-latest.html#directory_layout -install(FILES Icons/monteverdi-32x32.png - DESTINATION share/pixmaps - RENAME monteverdi.png - COMPONENT Resources) - -install(FILES Icons/monteverdi-splash.png - DESTINATION share/pixmaps - RENAME monteverdi-splash.png - COMPONENT Resources) - - -install(FILES Icons/monteverdi-32x32.xpm - DESTINATION share/pixmaps - RENAME monteverdi.xpm - COMPONENT Resources) - -# ------------------------- -# Install freedesktop entry - -install(FILES monteverdi.desktop - DESTINATION share/applications - COMPONENT Resources) - -endif()