DYT/Tool/OpenSceneGraph-3.6.5/include/gdalpansharpen.h
2024-12-25 07:49:36 +08:00

259 lines
8.6 KiB
C++

/******************************************************************************
* $Id$
*
* Project: GDAL Pansharpening module
* Purpose: Prototypes, and definitions for pansharpening related work.
* Author: Even Rouault <even.rouault at spatialys.com>
*
******************************************************************************
* Copyright (c) 2015, Even Rouault <even.rouault at spatialys.com>
*
* SPDX-License-Identifier: MIT
****************************************************************************/
#ifndef GDALPANSHARPEN_H_INCLUDED
#define GDALPANSHARPEN_H_INCLUDED
#include "gdal.h"
CPL_C_START
/**
* \file gdalpansharpen.h
*
* GDAL pansharpening related entry points and definitions.
*
* @since GDAL 2.1
*/
/** Pansharpening algorithms.
*/
typedef enum
{
/*! Weighted Brovery. */
GDAL_PSH_WEIGHTED_BROVEY
} GDALPansharpenAlg;
/** Pansharpening options.
*/
typedef struct
{
/*! Pan sharpening algorithm/method. Only weighed Brovey for now. */
GDALPansharpenAlg ePansharpenAlg;
/*! Resampling algorithm to upsample spectral bands to pan band resolution.
*/
GDALRIOResampleAlg eResampleAlg;
/*! Bit depth of the spectral bands. Can be let to 0 for default behavior.
*/
int nBitDepth;
/*! Number of weight coefficients in padfWeights. */
int nWeightCount;
/*! Array of nWeightCount weights used by weighted Brovey. */
double *padfWeights;
/*! Panchromatic band. */
GDALRasterBandH hPanchroBand;
/*! Number of input spectral bands. */
int nInputSpectralBands;
/** Array of nInputSpectralBands input spectral bands. The spectral band
* have generally a coarser resolution than the panchromatic band, but they
* are assumed to have the same spatial extent (and projection) at that
* point. Necessary spatial adjustments must be done beforehand, for example
* by wrapping inside a VRT dataset.
*/
GDALRasterBandH *pahInputSpectralBands;
/*! Number of output pansharpened spectral bands. */
int nOutPansharpenedBands;
/*! Array of nOutPansharpendBands values such as panOutPansharpenedBands[k]
* is a value in the range [0,nInputSpectralBands-1] . */
int *panOutPansharpenedBands;
/*! Whether the panchromatic and spectral bands have a noData value. */
int bHasNoData;
/** NoData value of the panchromatic and spectral bands (only taken into
account if bHasNoData = TRUE). This will also be use has the output
nodata value. */
double dfNoData;
/** Number of threads or -1 to mean ALL_CPUS. By default (0), single
* threaded mode is enabled unless the GDAL_NUM_THREADS configuration option
* is set to an integer or ALL_CPUS. */
int nThreads;
} GDALPansharpenOptions;
GDALPansharpenOptions CPL_DLL *GDALCreatePansharpenOptions(void);
void CPL_DLL GDALDestroyPansharpenOptions(GDALPansharpenOptions *);
GDALPansharpenOptions CPL_DLL *
GDALClonePansharpenOptions(const GDALPansharpenOptions *psOptions);
/*! Pansharpening operation handle. */
typedef void *GDALPansharpenOperationH;
GDALPansharpenOperationH CPL_DLL
GDALCreatePansharpenOperation(const GDALPansharpenOptions *);
void CPL_DLL GDALDestroyPansharpenOperation(GDALPansharpenOperationH);
CPLErr CPL_DLL GDALPansharpenProcessRegion(GDALPansharpenOperationH hOperation,
int nXOff, int nYOff, int nXSize,
int nYSize, void *pDataBuf,
GDALDataType eBufDataType);
CPL_C_END
#ifdef __cplusplus
#include <array>
#include <vector>
#include "gdal_priv.h"
#ifdef DEBUG_TIMING
#include <sys/time.h>
#endif
class GDALPansharpenOperation;
//! @cond Doxygen_Suppress
typedef struct
{
GDALPansharpenOperation *poPansharpenOperation;
GDALDataType eWorkDataType;
GDALDataType eBufDataType;
const void *pPanBuffer;
const void *pUpsampledSpectralBuffer;
void *pDataBuf;
size_t nValues;
size_t nBandValues;
GUInt32 nMaxValue;
#ifdef DEBUG_TIMING
struct timeval *ptv;
#endif
CPLErr eErr;
} GDALPansharpenJob;
typedef struct
{
GDALDataset *poMEMDS;
int nXOff;
int nYOff;
int nXSize;
int nYSize;
double dfXOff;
double dfYOff;
double dfXSize;
double dfYSize;
void *pBuffer;
GDALDataType eDT;
int nBufXSize;
int nBufYSize;
int nBandCount;
GDALRIOResampleAlg eResampleAlg;
GSpacing nBandSpace;
#ifdef DEBUG_TIMING
struct timeval *ptv;
#endif
} GDALPansharpenResampleJob;
class CPLWorkerThreadPool;
//! @endcond
/** Pansharpening operation class.
*/
class GDALPansharpenOperation
{
CPL_DISALLOW_COPY_ASSIGN(GDALPansharpenOperation)
GDALPansharpenOptions *psOptions = nullptr;
std::vector<int> anInputBands{};
std::vector<GDALDataset *> aVDS{}; // to destroy
std::vector<GDALRasterBand *> aMSBands{}; // original multispectral bands
// potentially warped into a VRT
int bPositiveWeights = TRUE;
CPLWorkerThreadPool *poThreadPool = nullptr;
int nKernelRadius = 0;
std::array<double, 6> m_adfPanToMSGT = {{0.0, 1.0, 0, 0.0, 0.0, 1.0}};
static void PansharpenJobThreadFunc(void *pUserData);
static void PansharpenResampleJobThreadFunc(void *pUserData);
template <class WorkDataType, class OutDataType>
void WeightedBroveyWithNoData(const WorkDataType *pPanBuffer,
const WorkDataType *pUpsampledSpectralBuffer,
OutDataType *pDataBuf, size_t nValues,
size_t nBandValues,
WorkDataType nMaxValue) const;
template <class WorkDataType, class OutDataType, int bHasBitDepth>
void WeightedBrovey3(const WorkDataType *pPanBuffer,
const WorkDataType *pUpsampledSpectralBuffer,
OutDataType *pDataBuf, size_t nValues,
size_t nBandValues, WorkDataType nMaxValue) const;
// cppcheck-suppress functionStatic
template <class WorkDataType, class OutDataType>
void WeightedBrovey(const WorkDataType *pPanBuffer,
const WorkDataType *pUpsampledSpectralBuffer,
OutDataType *pDataBuf, size_t nValues,
size_t nBandValues, WorkDataType nMaxValue) const;
template <class WorkDataType>
CPLErr WeightedBrovey(const WorkDataType *pPanBuffer,
const WorkDataType *pUpsampledSpectralBuffer,
void *pDataBuf, GDALDataType eBufDataType,
size_t nValues, size_t nBandValues,
WorkDataType nMaxValue) const;
// cppcheck-suppress functionStatic
template <class WorkDataType>
CPLErr WeightedBrovey(const WorkDataType *pPanBuffer,
const WorkDataType *pUpsampledSpectralBuffer,
void *pDataBuf, GDALDataType eBufDataType,
size_t nValues, size_t nBandValues) const;
template <class T>
void WeightedBroveyPositiveWeights(const T *pPanBuffer,
const T *pUpsampledSpectralBuffer,
T *pDataBuf, size_t nValues,
size_t nBandValues, T nMaxValue) const;
template <class T, int NINPUT, int NOUTPUT>
size_t WeightedBroveyPositiveWeightsInternal(
const T *pPanBuffer, const T *pUpsampledSpectralBuffer, T *pDataBuf,
size_t nValues, size_t nBandValues, T nMaxValue) const;
// cppcheck-suppress unusedPrivateFunction
template <class T>
void WeightedBroveyGByteOrUInt16(const T *pPanBuffer,
const T *pUpsampledSpectralBuffer,
T *pDataBuf, size_t nValues,
size_t nBandValues, T nMaxValue) const;
// cppcheck-suppress functionStatic
CPLErr PansharpenChunk(GDALDataType eWorkDataType,
GDALDataType eBufDataType, const void *pPanBuffer,
const void *pUpsampledSpectralBuffer, void *pDataBuf,
size_t nValues, size_t nBandValues,
GUInt32 nMaxValue) const;
public:
GDALPansharpenOperation();
~GDALPansharpenOperation();
CPLErr Initialize(const GDALPansharpenOptions *psOptions);
CPLErr ProcessRegion(int nXOff, int nYOff, int nXSize, int nYSize,
void *pDataBuf, GDALDataType eBufDataType);
GDALPansharpenOptions *GetOptions();
};
#endif /* __cplusplus */
#endif /* GDALPANSHARPEN_H_INCLUDED */