Skip to content
Snippets Groups Projects
Commit 90ead1ff authored by Cyrille Valladeau's avatar Cyrille Valladeau
Browse files

ENH : add sum avrage texture + testings

parent 6367b9e4
No related branches found
No related tags found
No related merge requests found
......@@ -121,7 +121,7 @@ public:
double rVal = (static_cast<double>(r)+0.5)*binsLength[1];
for (unsigned s = 0; s<histo[r].size(); s++)
{
if( vcl_abs( rVal - (static_cast<double>(s)+0.5)*binsLength[0]) < nCeil )
if( vcl_abs( rVal - (static_cast<double>(s)+0.5)*binsLength[0]) == nCeil )
{
double p = static_cast<double>(histo[r][s])*areaInv;
out += nCeilSquare * p;
......
/*=========================================================================
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 __otbSumAverageTextureFunctor_h
#define __otbSumAverageTextureFunctor_h
#include "otbEntropyTextureFunctor.h"
namespace otb
{
namespace Functor
{
/** \class SumAverageTextureFunctor
* \brief This functor calculates the inverse difference moment of an image
*
* Computes joint histogram (neighborhood and offset neighborhood)
* which bins are computing using Scott formula.
* Computes the probabiltiy p for each pair of pixel.
* InverseDifferenceMoment is the sum 1/(1+(pi-poff)²)*p over the neighborhood.
* TIterInput is an ietrator, TOutput is a PixelType.
*
* \ingroup Functor
* \ingroup
* \ingroup Statistics
*/
template <class TIterInput1, class TIterInput2, class TOutput>
class ITK_EXPORT SumAverageTextureFunctor :
public EntropyTextureFunctor<TIterInput1, TIterInput2, TOutput>
{
public:
SumAverageTextureFunctor(){};
~SumAverageTextureFunctor(){};
typedef TIterInput1 IterType1;
typedef TIterInput2 IterType2;
typedef TOutput OutputType;
typedef typename IterType1::OffsetType OffsetType;
typedef typename IterType1::RadiusType RadiusType;
typedef typename IterType1::InternalPixelType InternalPixelType;
typedef typename IterType1::ImageType ImageType;
typedef itk::Neighborhood<InternalPixelType,::itk::GetImageDimension<ImageType>::ImageDimension> NeighborhoodType;
typedef std::vector<double> DoubleVectorType;
typedef std::vector<int> IntVectorType;
typedef std::vector<IntVectorType> IntVectorVectorType;
typedef EntropyTextureFunctor<TIterInput1, TIterInput2, TOutput> Superclass;
virtual double ComputeOverSingleChannel(const NeighborhoodType &neigh, const NeighborhoodType &neighOff)
{
DoubleVectorType binsLength = Superclass::StatComputation(neigh, neighOff);
RadiusType radius = neigh.GetRadius();
double area = static_cast<double>(neigh.GetSize()[0]*neigh.GetSize()[1]);
double areaInv = 1/area;
OffsetType offset;
offset.Fill(0);
OffsetType offsetOff;
OffsetType offsetOffInit;
offsetOffInit[0] = -radius[0]+this->GetOffset()[0]-1;
offsetOffInit[1] = -radius[1]+this->GetOffset()[1]-1;
int histoIdX = 0;
int histoIdY = 0;
double out = 0.;
IntVectorType histoTemp;
IntVectorVectorType histo;
if (binsLength[0] != 0)
histoTemp = IntVectorType( vcl_floor( static_cast<double>(this->GetMaxi()-this->GetMini())/binsLength[0])+1., 0);
else
histoTemp = IntVectorType( 1, 0 );
if (binsLength[1] != 0)
histo = IntVectorVectorType( vcl_floor(static_cast<double>(this->GetMaxiOff()-this->GetMiniOff())/binsLength[1])+1., histoTemp );
else
histo = IntVectorVectorType( 1, histoTemp );
offsetOff = offsetOffInit;
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;
histoIdX = 0;
histoIdY = 0;
if ( binsLength[1] != 0)
histoIdX = static_cast<int>(vcl_floor( (static_cast<double>(neighOff[offsetOff])-this->GetMiniOff()) / static_cast<double>(binsLength[1]) ));
if ( binsLength[0] !=0 )
histoIdY = static_cast<int>(vcl_floor( (static_cast<double>(neigh[offset])-this->GetMini()) /static_cast<double>( binsLength[0]) ));
histo[histoIdX][histoIdY]++;
}
}
// loop over bin neighborhood values
for (unsigned sB = 0; sB<histo[0].size(); sB++)
{
double nCeil = (static_cast<double>(sB)+0.5)*binsLength[0];
for (unsigned r = 0; r<histo.size(); r++)
{
double rVal = (static_cast<double>(r)+0.5)*binsLength[1];
for (unsigned s = 0; s<histo[r].size(); s++)
{
double sVal = (static_cast<double>(s)+0.5)*binsLength[0];
// In theory don't have the abs but will deals with neighborhood and offset without the same histo
// thus loop over 2*Ng don't have sense
if( vcl_abs(rVal + sVal - nCeil)<binsLength[1] || vcl_abs(rVal + sVal - 2*nCeil)<binsLength[1] )
{
double p = static_cast<double>(histo[r][s])*areaInv;
out += sVal * p;
}
}
}
}
return out;
}
};
} // namespace Functor
} // namespace otb
#endif
......@@ -28,6 +28,7 @@ SET(FEATUREEXTRACTION_TESTS9 ${CXX_TEST_PATH}/otbFeatureExtractionTests9)
SET(FEATUREEXTRACTION_TESTS10 ${CXX_TEST_PATH}/otbFeatureExtractionTests10)
SET(FEATUREEXTRACTION_TESTS11 ${CXX_TEST_PATH}/otbFeatureExtractionTests11)
SET(FEATUREEXTRACTION_TESTS12 ${CXX_TEST_PATH}/otbFeatureExtractionTests12)
SET(FEATUREEXTRACTION_TESTS13 ${CXX_TEST_PATH}/otbFeatureExtractionTests13)
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ otbFeatureExtractionTests1 ~~~~~~~~~~~~~~~~~~~~~
......@@ -977,7 +978,7 @@ ADD_TEST(feTuLandmarkNew ${FEATUREEXTRACTION_TESTS10}
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ otbFeatureExtractionTests11 ~~~~~~~~~~~~~~~~~~~~~
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ otbFeatureExtractionTests11 ~~~~~~~~~~~~~~~~~~~~~
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
......@@ -1040,8 +1041,13 @@ ADD_TEST(feTpSimplifyManyPathListFilter ${FEATUREEXTRACTION_TESTS11}
1.0
)
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ otbFeatureExtractionTests11 ~~~~~~~~~~~~~~~~~~~~~
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ------- otb::TextureFunctorBase -------------
ADD_TEST(feTvTextureFunctorBase ${FEATUREEXTRACTION_TESTS11}
ADD_TEST(feTvTextureFunctorBase ${FEATUREEXTRACTION_TESTS12}
--compare-image ${EPS}
${INPUTDATA}/poupees_sub.png
${TEMP}/feTvTextureFunctorBase.tif
......@@ -1055,7 +1061,7 @@ ADD_TEST(feTvTextureFunctorBase ${FEATUREEXTRACTION_TESTS11}
# ------- otb::EnergyTextureFunctor -------------
ADD_TEST(feTvEnergyTextureFunctor ${FEATUREEXTRACTION_TESTS11}
ADD_TEST(feTvEnergyTextureFunctor ${FEATUREEXTRACTION_TESTS12}
--compare-image ${EPS}
${BASELINE}/feTvEnergyTextureFunctor.tif
${TEMP}/feTvEnergyTextureFunctor.tif
......@@ -1069,7 +1075,7 @@ ADD_TEST(feTvEnergyTextureFunctor ${FEATUREEXTRACTION_TESTS11}
)
# ------- otb::EntropyTextureFunctor -------------
ADD_TEST(feTvEntropyTextureFunctor ${FEATUREEXTRACTION_TESTS11}
ADD_TEST(feTvEntropyTextureFunctor ${FEATUREEXTRACTION_TESTS12}
--compare-image ${EPS}
${BASELINE}/feTvEntropyTextureFunctor.tif
${TEMP}/feTvEntropyTextureFunctor.tif
......@@ -1083,7 +1089,7 @@ ADD_TEST(feTvEntropyTextureFunctor ${FEATUREEXTRACTION_TESTS11}
)
# ------- otb::InverseDifferenceMomentTextureFunctor -------------
ADD_TEST(feTvInverseDifferenceMomentTextureFunctor ${FEATUREEXTRACTION_TESTS11}
ADD_TEST(feTvInverseDifferenceMomentTextureFunctor ${FEATUREEXTRACTION_TESTS12}
--compare-image ${EPS}
${BASELINE}/feTvInverseDifferenceMomentTextureFunctor.tif
${TEMP}/feTvInverseDifferenceMomentTextureFunctor.tif
......@@ -1097,7 +1103,7 @@ ADD_TEST(feTvInverseDifferenceMomentTextureFunctor ${FEATUREEXTRACTION_TESTS11}
)
# ------- otb::AngularSecondMomentumTextureFunctor -------------
ADD_TEST(feTvAngularSecondMomentumTextureFunctor ${FEATUREEXTRACTION_TESTS11}
ADD_TEST(feTvAngularSecondMomentumTextureFunctor ${FEATUREEXTRACTION_TESTS12}
--compare-image ${EPS}
${BASELINE}/feTvAngularSecondMomentumTextureFunctor.tif
${TEMP}/feTvAngularSecondMomentumTextureFunctor.tif
......@@ -1111,7 +1117,7 @@ ADD_TEST(feTvAngularSecondMomentumTextureFunctor ${FEATUREEXTRACTION_TESTS11}
)
# ------- otb::VarianceTextureFunctor -------------
ADD_TEST(feTvVarianceTextureFunctor ${FEATUREEXTRACTION_TESTS11}
ADD_TEST(feTvVarianceTextureFunctor ${FEATUREEXTRACTION_TESTS12}
--compare-image ${EPS}
${BASELINE}/feTvVarianceTextureFunctor.tif
${TEMP}/feTvVarianceTextureFunctor.tif
......@@ -1125,7 +1131,7 @@ ADD_TEST(feTvVarianceTextureFunctor ${FEATUREEXTRACTION_TESTS11}
)
# ------- otb::CorrelationTextureFunctor -------------
ADD_TEST(feTvCorrelationTextureFunctor ${FEATUREEXTRACTION_TESTS11}
ADD_TEST(feTvCorrelationTextureFunctor ${FEATUREEXTRACTION_TESTS12}
--compare-image ${EPS}
${BASELINE}/feTvCorrelationTextureFunctor.tif
${TEMP}/feTvCorrelationTextureFunctor.tif
......@@ -1139,7 +1145,7 @@ ADD_TEST(feTvCorrelationTextureFunctor ${FEATUREEXTRACTION_TESTS11}
)
# ------- otb::ContrastTextureFunctor -------------
ADD_TEST(feTvContrastTextureFunctor ${FEATUREEXTRACTION_TESTS11}
ADD_TEST(feTvContrastTextureFunctor ${FEATUREEXTRACTION_TESTS12}
--compare-image ${EPS}
${BASELINE}/feTvContrastTextureFunctor.tif
${TEMP}/feTvContrastTextureFunctor.tif
......@@ -1152,8 +1158,27 @@ ADD_TEST(feTvContrastTextureFunctor ${FEATUREEXTRACTION_TESTS11}
2 # offset[1]
)
# ------- otb::SumAverageTextureFunctor -------------
ADD_TEST(feTvSumAverageTextureFunctor ${FEATUREEXTRACTION_TESTS12}
--compare-image ${EPS}
${BASELINE}/feTvSumAverageTexture.tif
${TEMP}/feTvSumAverageTextureFunctor.tif
otbTextureFunctor
SAV #sum average
${INPUTDATA}/poupees_sub.png
${TEMP}/feTvSumAverageTextureFunctor.tif
5 # radius
-2 # offset[0]
2 # offset[1]
)
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ otbFeatureExtractionTests13 ~~~~~~~~~~~~~~~~~~~~~
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ------- otb::EnergyTextureImageFunction -------------
ADD_TEST(feTvEnergyTextureImageFunction ${FEATUREEXTRACTION_TESTS12}
ADD_TEST(feTvEnergyTextureImageFunction ${FEATUREEXTRACTION_TESTS13}
--compare-image ${EPS}
${BASELINE}/feTvEnergyTextureImageFunction.tif
${TEMP}/feTvEnergyTextureImageFunction.tif
......@@ -1169,7 +1194,7 @@ ADD_TEST(feTvEnergyTextureImageFunction ${FEATUREEXTRACTION_TESTS12}
# ------- otb::EntropyTextureImageFunction -------------
ADD_TEST(feTvEntropyTextureImageFunction ${FEATUREEXTRACTION_TESTS12}
ADD_TEST(feTvEntropyTextureImageFunction ${FEATUREEXTRACTION_TESTS13}
--compare-image ${EPS}
${BASELINE}/feTvEntropyTextureImageFunction.tif
${TEMP}/feTvEntropyTextureImageFunction.tif
......@@ -1185,7 +1210,7 @@ ADD_TEST(feTvEntropyTextureImageFunction ${FEATUREEXTRACTION_TESTS12}
# ------- otb::InverseDifferenceMomentTextureImageFunction -------------
ADD_TEST(feTvInverseDifferenceMomentTextureImageFunction ${FEATUREEXTRACTION_TESTS12}
ADD_TEST(feTvInverseDifferenceMomentTextureImageFunction ${FEATUREEXTRACTION_TESTS13}
--compare-image ${EPS}
${BASELINE}/feTvInverseDifferenceMomentTextureImageFunction.tif
${TEMP}/feTvInverseDifferenceMomentTextureImageFunction.tif
......@@ -1200,7 +1225,7 @@ ADD_TEST(feTvInverseDifferenceMomentTextureImageFunction ${FEATUREEXTRACTION_TES
)
# ------- otb::AngularSecondMomentumTextureImageFunction -------------
ADD_TEST(feTvAngularSecondMomentumTextureImageFunction ${FEATUREEXTRACTION_TESTS12}
ADD_TEST(feTvAngularSecondMomentumTextureImageFunction ${FEATUREEXTRACTION_TESTS13}
--compare-image ${EPS}
${BASELINE}/feTvAngularSecondMomentumTextureImageFunction.tif
${TEMP}/feTvAngularSecondMomentumTextureImageFunction.tif
......@@ -1215,7 +1240,7 @@ ADD_TEST(feTvAngularSecondMomentumTextureImageFunction ${FEATUREEXTRACTION_TESTS
)
# ------- otb::VarianceTextureImageFunction -------------
ADD_TEST(feTvVarianceTextureImageFunction ${FEATUREEXTRACTION_TESTS12}
ADD_TEST(feTvVarianceTextureImageFunction ${FEATUREEXTRACTION_TESTS13}
--compare-image ${EPS}
${BASELINE}/feTvVarianceTextureImageFunction.tif
${TEMP}/feTvVarianceTextureImageFunction.tif
......@@ -1230,7 +1255,7 @@ ADD_TEST(feTvVarianceTextureImageFunction ${FEATUREEXTRACTION_TESTS12}
)
# ------- otb::CorrelationTextureImageFunction -------------
ADD_TEST(feTvCorrelationTextureImageFunction ${FEATUREEXTRACTION_TESTS12}
ADD_TEST(feTvCorrelationTextureImageFunction ${FEATUREEXTRACTION_TESTS13}
--compare-image ${EPS}
${BASELINE}/feTvCorrelationTextureImageFunction.tif
${TEMP}/feTvCorrelationTextureImageFunction.tif
......@@ -1245,7 +1270,7 @@ ADD_TEST(feTvCorrelationTextureImageFunction ${FEATUREEXTRACTION_TESTS12}
)
# ------- otb::ContrastTextureImageFunction -------------
ADD_TEST(feTvContrastTextureImageFunction ${FEATUREEXTRACTION_TESTS12}
ADD_TEST(feTvContrastTextureImageFunction ${FEATUREEXTRACTION_TESTS13}
--compare-image ${EPS}
${BASELINE}/feTvContrastTextureImageFunction.tif
${TEMP}/feTvContrastTextureImageFunction.tif
......@@ -1259,6 +1284,20 @@ ADD_TEST(feTvContrastTextureImageFunction ${FEATUREEXTRACTION_TESTS12}
2 # offset[1]
)
# ------- otb::SumAverageTextureImageFunction -------------
ADD_TEST(feTvSumAverageTextureImageFunction ${FEATUREEXTRACTION_TESTS13}
--compare-image ${EPS}
${BASELINE}/feTvSumAverageTextureImageFunction.tif
${TEMP}/feTvSumAverageTextureImageFunction.tif
otbTextureImageFunction
SAV #sum average
${INPUTDATA}/poupees_sub_c1.png
${TEMP}/feTvSumAverageTextureImageFunction.tif
5 # radius[0]
5 # radius[1]
-2 # offset[0]
2 # offset[1]
)
# A enrichir
SET(BasicFeatureExtraction_SRCS1
......@@ -1390,11 +1429,13 @@ otbCloudEstimatorFilter.cxx
otbCloudDetectionFilterNew.cxx
otbCloudDetectionFilter.cxx
otbSimplifyManyPathListFilter.cxx
)
SET(BasicFeatureExtraction_SRCS12
otbTextureFunctorBase.cxx
otbTextureFunctor.cxx
)
SET(BasicFeatureExtraction_SRCS12
SET(BasicFeatureExtraction_SRCS13
otbTextureImageFunction.cxx
)
......@@ -1424,6 +1465,8 @@ ADD_EXECUTABLE(otbFeatureExtractionTests11 otbFeatureExtractionTests11.cxx ${Bas
TARGET_LINK_LIBRARIES(otbFeatureExtractionTests11 OTBFeatureExtraction OTBIO)
ADD_EXECUTABLE(otbFeatureExtractionTests12 otbFeatureExtractionTests12.cxx ${BasicFeatureExtraction_SRCS12})
TARGET_LINK_LIBRARIES(otbFeatureExtractionTests12 OTBFeatureExtraction OTBIO)
ADD_EXECUTABLE(otbFeatureExtractionTests13 otbFeatureExtractionTests13.cxx ${BasicFeatureExtraction_SRCS13})
TARGET_LINK_LIBRARIES(otbFeatureExtractionTests13 OTBFeatureExtraction OTBIO)
# ADD_EXECUTABLE(roadDetect roadDetect.cxx)
# TARGET_LINK_LIBRARIES(roadDetect OTBFeatureExtraction OTBIO)
......
......@@ -33,6 +33,4 @@ REGISTER_TEST(otbCloudEstimatorFilter);
REGISTER_TEST(otbCloudDetectionFilterNew);
REGISTER_TEST(otbCloudDetectionFilter);
REGISTER_TEST(otbSimplifyManyPathListFilter);
REGISTER_TEST(otbTextureFunctorBase);
REGISTER_TEST(otbTextureFunctor);
}
......@@ -27,5 +27,6 @@
void RegisterTests()
{
REGISTER_TEST(otbTextureImageFunction);
REGISTER_TEST(otbTextureFunctorBase);
REGISTER_TEST(otbTextureFunctor);
}
/*=========================================================================
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.
=========================================================================*/
// this file defines the otbCommonTest for the test driver
// and all it expects is that you have a function called RegisterTests
#if defined(_MSC_VER)
#pragma warning ( disable : 4786 )
#endif
#include <iostream>
#include "otbTestMain.h"
void RegisterTests()
{
REGISTER_TEST(otbTextureImageFunction);
}
......@@ -31,6 +31,7 @@
#include "otbVarianceTextureFunctor.h"
#include "otbCorrelationTextureFunctor.h"
#include "otbContrastTextureFunctor.h"
#include "otbSumAverageTextureFunctor.h"
template<class TInputImage, class TOutputImage, class TFunctor>
......@@ -114,6 +115,11 @@ int otbTextureFunctor(int argc, char * argv[])
typedef otb::Functor::ContrastTextureFunctor<IteratorType, IteratorType, PixelType> FunctorType;
return( generic_TextureFunctor<ImageType, ImageType, FunctorType>(argc,argv) );
}
else if ( strArgv == "SAV" )
{
typedef otb::Functor::SumAverageTextureFunctor<IteratorType, IteratorType, PixelType> FunctorType;
return( generic_TextureFunctor<ImageType, ImageType, FunctorType>(argc,argv) );
}
else
{
return EXIT_FAILURE;
......
......@@ -34,6 +34,7 @@
#include "otbVarianceTextureFunctor.h"
#include "otbCorrelationTextureFunctor.h"
#include "otbContrastTextureFunctor.h"
#include "otbSumAverageTextureFunctor.h"
template<class TInputImage, class TOutputImage, class TFunctor>
......@@ -130,6 +131,11 @@ int otbTextureImageFunction(int argc, char * argv[])
typedef otb::Functor::ContrastTextureFunctor<IteratorType, IteratorType, VectorType> FunctorType;
return( generic_TextureImageFunction<ImageType, ImageType, FunctorType>(argc,argv) );
}
else if ( strArgv == "SAV" )
{
typedef otb::Functor::SumAverageTextureFunctor<IteratorType, IteratorType, VectorType> FunctorType;
return( generic_TextureImageFunction<ImageType, ImageType, FunctorType>(argc,argv) );
}
else
{
return EXIT_FAILURE;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment