GDAL
gdalpansharpen.h
Go to the documentation of this file.
1/******************************************************************************
2 * $Id$
3 *
4 * Project: GDAL Pansharpening module
5 * Purpose: Prototypes, and definitions for pansharpening related work.
6 * Author: Even Rouault <even.rouault at spatialys.com>
7 *
8 ******************************************************************************
9 * Copyright (c) 2015, Even Rouault <even.rouault at spatialys.com>
10 *
11 * SPDX-License-Identifier: MIT
12 ****************************************************************************/
13
14#ifndef GDALPANSHARPEN_H_INCLUDED
15#define GDALPANSHARPEN_H_INCLUDED
16
17#include "gdal.h"
18
20
31typedef enum
32{
36
39typedef struct
40{
43
47
51
54
56 double *padfWeights;
57
60
63
71
74
78
81
85 double dfNoData;
86
92
97
100
105 int nXOff, int nYOff, int nXSize,
106 int nYSize, void *pDataBuf,
107 GDALDataType eBufDataType);
108
110
111#ifdef __cplusplus
112
113#include <array>
114#include <vector>
115#include "gdal_priv.h"
116
117#ifdef DEBUG_TIMING
118#include <sys/time.h>
119#endif
120
122
124typedef struct
125{
126 GDALPansharpenOperation *poPansharpenOperation;
127 GDALDataType eWorkDataType;
128 GDALDataType eBufDataType;
129 const void *pPanBuffer;
130 const void *pUpsampledSpectralBuffer;
131 void *pDataBuf;
132 size_t nValues;
133 size_t nBandValues;
134 GUInt32 nMaxValue;
135
136#ifdef DEBUG_TIMING
137 struct timeval *ptv;
138#endif
139
140 CPLErr eErr;
141} GDALPansharpenJob;
142
143typedef struct
144{
145 GDALDataset *poMEMDS;
146 int nXOff;
147 int nYOff;
148 int nXSize;
149 int nYSize;
150 double dfXOff;
151 double dfYOff;
152 double dfXSize;
153 double dfYSize;
154 void *pBuffer;
155 GDALDataType eDT;
156 int nBufXSize;
157 int nBufYSize;
158 int nBandCount;
159 GDALRIOResampleAlg eResampleAlg;
160 GSpacing nBandSpace;
161
162#ifdef DEBUG_TIMING
163 struct timeval *ptv;
164#endif
165} GDALPansharpenResampleJob;
166
168
170
174{
176
177 GDALPansharpenOptions *psOptions = nullptr;
178 std::vector<int> anInputBands{};
179 std::vector<GDALDataset *> aVDS{}; // to destroy
180 std::vector<GDALRasterBand *> aMSBands{}; // original multispectral bands
181 // potentially warped into a VRT
182 int bPositiveWeights = TRUE;
183 CPLWorkerThreadPool *poThreadPool = nullptr;
184 int nKernelRadius = 0;
185 std::array<double, 6> m_adfPanToMSGT = {{0.0, 1.0, 0, 0.0, 0.0, 1.0}};
186
187 static void PansharpenJobThreadFunc(void *pUserData);
188 static void PansharpenResampleJobThreadFunc(void *pUserData);
189
190 template <class WorkDataType, class OutDataType>
191 void WeightedBroveyWithNoData(const WorkDataType *pPanBuffer,
192 const WorkDataType *pUpsampledSpectralBuffer,
193 OutDataType *pDataBuf, size_t nValues,
194 size_t nBandValues,
195 WorkDataType nMaxValue) const;
196 template <class WorkDataType, class OutDataType, int bHasBitDepth>
197 void WeightedBrovey3(const WorkDataType *pPanBuffer,
198 const WorkDataType *pUpsampledSpectralBuffer,
199 OutDataType *pDataBuf, size_t nValues,
200 size_t nBandValues, WorkDataType nMaxValue) const;
201
202 // cppcheck-suppress functionStatic
203 template <class WorkDataType, class OutDataType>
204 void WeightedBrovey(const WorkDataType *pPanBuffer,
205 const WorkDataType *pUpsampledSpectralBuffer,
206 OutDataType *pDataBuf, size_t nValues,
207 size_t nBandValues, WorkDataType nMaxValue) const;
208 template <class WorkDataType>
209 CPLErr WeightedBrovey(const WorkDataType *pPanBuffer,
210 const WorkDataType *pUpsampledSpectralBuffer,
211 void *pDataBuf, GDALDataType eBufDataType,
212 size_t nValues, size_t nBandValues,
213 WorkDataType nMaxValue) const;
214
215 // cppcheck-suppress functionStatic
216 template <class WorkDataType>
217 CPLErr WeightedBrovey(const WorkDataType *pPanBuffer,
218 const WorkDataType *pUpsampledSpectralBuffer,
219 void *pDataBuf, GDALDataType eBufDataType,
220 size_t nValues, size_t nBandValues) const;
221 template <class T>
222 void WeightedBroveyPositiveWeights(const T *pPanBuffer,
223 const T *pUpsampledSpectralBuffer,
224 T *pDataBuf, size_t nValues,
225 size_t nBandValues, T nMaxValue) const;
226
227 template <class T, int NINPUT, int NOUTPUT>
228 size_t WeightedBroveyPositiveWeightsInternal(
229 const T *pPanBuffer, const T *pUpsampledSpectralBuffer, T *pDataBuf,
230 size_t nValues, size_t nBandValues, T nMaxValue) const;
231
232 // cppcheck-suppress unusedPrivateFunction
233 template <class T>
234 void WeightedBroveyGByteOrUInt16(const T *pPanBuffer,
235 const T *pUpsampledSpectralBuffer,
236 T *pDataBuf, size_t nValues,
237 size_t nBandValues, T nMaxValue) const;
238
239 // cppcheck-suppress functionStatic
240 CPLErr PansharpenChunk(GDALDataType eWorkDataType,
241 GDALDataType eBufDataType, const void *pPanBuffer,
242 const void *pUpsampledSpectralBuffer, void *pDataBuf,
243 size_t nValues, size_t nBandValues,
244 GUInt32 nMaxValue) const;
245
246 public:
249
250 CPLErr Initialize(const GDALPansharpenOptions *psOptions);
251 CPLErr ProcessRegion(int nXOff, int nYOff, int nXSize, int nYSize,
252 void *pDataBuf, GDALDataType eBufDataType);
254};
255
256#endif /* __cplusplus */
257
258#endif /* GDALPANSHARPEN_H_INCLUDED */
Pool of worker threads.
Definition: cpl_worker_thread_pool.h:66
A set of associated raster bands, usually from one file.
Definition: gdal_priv.h:495
Pansharpening operation class.
Definition: gdalpansharpen.h:174
CPLErr ProcessRegion(int nXOff, int nYOff, int nXSize, int nYSize, void *pDataBuf, GDALDataType eBufDataType)
Executes a pansharpening operation on a rectangular region of the resulting dataset.
Definition: gdalpansharpen.cpp:1157
GDALPansharpenOperation()
Pansharpening operation constructor.
~GDALPansharpenOperation()
Pansharpening operation destructor.
Definition: gdalpansharpen.cpp:155
GDALPansharpenOptions * GetOptions()
Return options.
Definition: gdalpansharpen.cpp:1798
CPLErr Initialize(const GDALPansharpenOptions *psOptions)
Initialize the pansharpening operation.
Definition: gdalpansharpen.cpp:174
CPLErr
Error category.
Definition: cpl_error.h:37
#define CPL_C_END
Macro to end a block of C symbols.
Definition: cpl_port.h:283
#define CPL_C_START
Macro to start a block of C symbols.
Definition: cpl_port.h:279
unsigned int GUInt32
Unsigned int32 type.
Definition: cpl_port.h:161
#define CPL_DISALLOW_COPY_ASSIGN(ClassName)
Helper to remove the copy and assignment constructors so that the compiler will not generate the defa...
Definition: cpl_port.h:1030
Public (C callable) GDAL entry points.
GIntBig GSpacing
Type to express pixel, line or band spacing.
Definition: gdal.h:400
GDALDataType
Definition: gdal.h:48
GDALRIOResampleAlg
RasterIO() resampling method.
Definition: gdal.h:128
void * GDALRasterBandH
Opaque type used for the C bindings of the C++ GDALRasterBand class.
Definition: gdal.h:379
C++ GDAL entry points.
CPLErr GDALPansharpenProcessRegion(GDALPansharpenOperationH hOperation, int nXOff, int nYOff, int nXSize, int nYSize, void *pDataBuf, GDALDataType eBufDataType)
Executes a pansharpening operation on a rectangular region of the resulting dataset.
Definition: gdalpansharpen.cpp:1873
GDALPansharpenOperationH GDALCreatePansharpenOperation(const GDALPansharpenOptions *)
Instantiate a pansharpening operation.
Definition: gdalpansharpen.cpp:1819
GDALPansharpenAlg
Pansharpening algorithms.
Definition: gdalpansharpen.h:32
@ GDAL_PSH_WEIGHTED_BROVEY
Definition: gdalpansharpen.h:34
void GDALDestroyPansharpenOptions(GDALPansharpenOptions *)
Destroy pansharpening options.
Definition: gdalpansharpen.cpp:73
void * GDALPansharpenOperationH
Definition: gdalpansharpen.h:99
GDALPansharpenOptions * GDALCreatePansharpenOptions(void)
Create pansharpening options.
Definition: gdalpansharpen.cpp:52
GDALPansharpenOptions * GDALClonePansharpenOptions(const GDALPansharpenOptions *psOptions)
Clone pansharpening options.
Definition: gdalpansharpen.cpp:98
void GDALDestroyPansharpenOperation(GDALPansharpenOperationH)
Destroy a pansharpening operation.
Definition: gdalpansharpen.cpp:1839
Pansharpening options.
Definition: gdalpansharpen.h:40
GDALPansharpenAlg ePansharpenAlg
Definition: gdalpansharpen.h:42
int bHasNoData
Definition: gdalpansharpen.h:80
int nBitDepth
Definition: gdalpansharpen.h:50
double * padfWeights
Definition: gdalpansharpen.h:56
int nThreads
Number of threads or -1 to mean ALL_CPUS.
Definition: gdalpansharpen.h:90
int nWeightCount
Definition: gdalpansharpen.h:53
GDALRasterBandH * pahInputSpectralBands
Array of nInputSpectralBands input spectral bands.
Definition: gdalpansharpen.h:70
int * panOutPansharpenedBands
Definition: gdalpansharpen.h:77
GDALRIOResampleAlg eResampleAlg
Definition: gdalpansharpen.h:46
GDALRasterBandH hPanchroBand
Definition: gdalpansharpen.h:59
int nInputSpectralBands
Definition: gdalpansharpen.h:62
int nOutPansharpenedBands
Definition: gdalpansharpen.h:73
double dfNoData
NoData value of the panchromatic and spectral bands (only taken into account if bHasNoData = TRUE).
Definition: gdalpansharpen.h:85