File failed to load: https://isis.astrogeology.usgs.gov/8.3.0/Object/assets/jax/output/NativeMML/config.js
Isis 3 Programmer Reference
Reduce.cpp
1
6/* SPDX-License-Identifier: CC0-1.0 */
7#include "Reduce.h"
8#include "IString.h"
9#include "SpecialPixel.h"
10#include "SubArea.h"
11
12using namespace std;
13
14namespace Isis {
32 Reduce::Reduce(Isis::Cube *pInCube, const double sampleScale, const double lineScale)
33 {
34 // Input Cube
35 mInCube = pInCube;
36
37 mdLine = 1;
38 miBandIndex = 1;
39 // Set input image area to defaults
40 miStartSample = 1;
42 miStartLine = 1;
44
48
49 // Save off the sample and mdLine magnification
50 mdSampleScale = sampleScale;
51 mdLineScale = lineScale;
52
53 // Calculate output size based on the sample and line scales
54 miOutputSamples = (int)((double)miInputSamples / mdSampleScale + 0.5);
55 miOutputLines = (int)((double)miInputLines / mdLineScale + 0.5);
56
57 // Initialize the input portal
59 }
60
67 delete(m_iPortal);
68 }
69
87 void Reduce::setInputBoundary(int startSample, int endSample, int startLine, int endLine){
88 miStartSample = startSample;
89 miEndSample = endSample;
90 miInputSamples = endSample - startSample + 1;
91
92 miStartLine = startLine;
93 miEndLine = endLine;
94 miInputLines = endLine - startLine + 1;
96
97 // Calculate output size based on the sample and line scales
98 miOutputSamples = (int)((double)miInputSamples / mdSampleScale + 0.5);
99 miOutputLines = (int)((double)miInputLines / mdLineScale + 0.5);
100 }
101
113 {
114 // Construct a label with the results
115 // This is the Results group that will go into the application
116 // log file. This group must be created by the calling application.
117 // Information will be added to it if the Mapping or Instrument
118 // groups are deleted from the output image label
119 PvlGroup resultsGrp("Results");
120 resultsGrp += PvlKeyword("InputLines", toString(miInputLines));
121 resultsGrp += PvlKeyword("InputSamples", toString(miInputSamples));
122 resultsGrp += PvlKeyword("StartingLine", toString(miStartLine));
123 resultsGrp += PvlKeyword("StartingSample", toString(miStartSample));
124 resultsGrp += PvlKeyword("EndingLine", toString(miEndLine));
125 resultsGrp += PvlKeyword("EndingSample", toString(miEndSample));
126 resultsGrp += PvlKeyword("LineIncrement", toString(mdLineScale));
127 resultsGrp += PvlKeyword("SampleIncrement", toString(mdSampleScale));
128 resultsGrp += PvlKeyword("OutputLines", toString(miOutputLines));
129 resultsGrp += PvlKeyword("OutputSamples", toString(miOutputSamples));
130
131 Isis::SubArea subArea;
134 subArea.UpdateLabel(mInCube, pOutCube, resultsGrp);
135
136 return resultsGrp;
137 }
138
146 {
147 int readLine = (int)(mdLine + 0.5);
148
151
152 // Scale down buffer
153 for(int os = 0; os < miOutputSamples; os++) {
154 out[os] = (*m_iPortal)[(int)((double) os * mdSampleScale)];
155 }
156
157 if(out.Line() == miOutputLines) {
158 miBandIndex++;
159 mdLine = 1;
160 }
161 else {
163 }
164 }
165
173 {
174 double rline = (double)out.Line() * mdLineScale;
175
176 if(out.Line() == 1 && out.Band() == 1) {
177 mdIncTab = new double[miOutputSamples];
178 mdSum = new double[miOutputSamples];
179 mdNpts = new double[miOutputSamples];
180 mdSum2 = new double[miOutputSamples];
181 mdNpts2 = new double[miOutputSamples];
182
183 // Fill mdIncTab and Initialize buffers for first band
184 for(int osamp = 0; osamp < miOutputSamples; osamp++) {
185 mdIncTab[osamp] = ((double)osamp + 1.) * mdSampleScale;
186 mdSum[osamp] = 0.0;
187 mdNpts[osamp] = 0.0;
188 mdSum2[osamp] = 0.0;
189 mdNpts2[osamp] = 0.0;
190 }
191 mdIncTab[miOutputSamples-1] = miInputSamples;
192 }
193
194 while(mdLine <= rline) {
195 if((int)mdLine <= miInputLines) {
198 }
199 int isamp = 1;
200 for(int osamp = 0; osamp < out.size(); osamp++) {
201 while((double)isamp <= mdIncTab[osamp]) {
202 // If Pixel is valid add it to mdSum
203 if(IsValidPixel((*m_iPortal)[isamp-1])) {
204 mdSum[osamp] += (*m_iPortal)[isamp-1];
205 mdNpts[osamp] += 1.0;
206 }
207 isamp++;
208 }
209
210 double sdel = (double) isamp - mdIncTab[osamp];
211 if(isamp > miInputSamples) continue;
212
213 if(IsValidPixel((*m_iPortal)[isamp-1])) {
214 mdSum[osamp] += (*m_iPortal)[isamp-1] * (1.0 - sdel);
215 mdNpts[osamp] += (1.0 - sdel);
216 if(osamp + 1 < miOutputSamples) {
217 mdSum[osamp+1] += (*m_iPortal)[isamp-1] * sdel;
218 mdNpts[osamp+1] += sdel;
219 }
220 }
221 isamp++;
222 }
223 mdLine++;
224 }
225
226 if(mdLine <= miInputLines) {
229 }
230 double ldel = (double)mdLine - rline;
231 double ldel2 = 1.0 - ldel;
232 int isamp = 1;
233 for(int osamp = 0; osamp < miOutputSamples; osamp++) {
234 while(isamp <= mdIncTab[osamp]) {
235 if(IsValidPixel((*m_iPortal)[isamp-1])) {
236 mdSum[osamp] += (*m_iPortal)[isamp-1] * ldel2;
237 mdNpts[osamp] += ldel2;
238 mdSum2[osamp] += (*m_iPortal)[isamp-1] * ldel;
239 mdNpts2[osamp] += ldel;
240 }
241 isamp++;
242 }
243
244 double sdel = (double) isamp - mdIncTab[osamp];
245 if(isamp > miInputSamples) continue;
246 if(IsValidPixel((*m_iPortal)[isamp-1])) {
247 mdSum[osamp] += (*m_iPortal)[isamp-1] * (1.0 - sdel) * ldel2;
248 mdNpts[osamp] += (1.0 - sdel) * ldel2;
249 if(osamp + 1 < miOutputSamples) {
250 mdSum[osamp+1] += (*m_iPortal)[isamp-1] * sdel * ldel2;
251 mdNpts[osamp+1] += sdel * ldel2;
252 }
253 mdSum2[osamp] += (*m_iPortal)[isamp-1] * (1.0 - sdel) * ldel;
254 mdNpts2[osamp] += (1.0 - sdel) * ldel;
255 if(osamp + 1 < miOutputSamples) {
256 mdSum2[osamp+1] += (*m_iPortal)[isamp-1] * sdel * ldel;
257 mdNpts2[osamp+1] += sdel * ldel;
258 }
259 }
260 isamp++;
261 }
262
263 if(mdLine < miInputLines) mdLine++;
264
265 double npix = mdSampleScale * mdLineScale;
266 for(int osamp = 0; osamp < miOutputSamples; osamp++) {
267 if(mdNpts[osamp] > npix * mdValidPer) {
268 out[osamp] = mdSum[osamp] / mdNpts[osamp];
269 }
270 else {
271 if(msReplaceMode == "NEAREST") {
272 out[osamp] = (*m_iPortal)[(int)(mdIncTab[osamp] + 0.5) - 1];
273 }
274 else {
275 out[osamp] = Isis::Null;
276 }
277 }
278 mdSum[osamp] = mdSum2[osamp];
279 mdNpts[osamp] = mdNpts2[osamp];
280 mdSum2[osamp] = 0.0;
281 mdNpts2[osamp] = 0.0;
282 }
283
284 if(out.Line() == miOutputLines && out.Band() != miInputBands) {
285 miBandIndex++;
286 mdLine = 1;
287 for(int osamp = 0; osamp < miOutputSamples; osamp++) {
288 mdSum[osamp] = 0.0;
289 mdNpts[osamp] = 0.0;
290 mdSum2[osamp] = 0.0;
291 mdNpts2[osamp] = 0.0;
292 }
293 }
294
295 if(out.Line() == miOutputLines && out.Band() == miInputBands) {
296 delete [] mdIncTab;
297 delete [] mdSum;
298 delete [] mdNpts;
299 delete [] mdSum2;
300 delete [] mdNpts2;
301 }
302 }
303}
void operator()(Isis::Buffer &out) const
Operator () overload.
Definition Reduce.cpp:172
double mdValidPer
Valid Percentage.
Definition Reduce.h:121
QString msReplaceMode
Replace Mode (scale/total)
Definition Reduce.h:122
Buffer for reading and writing cube data.
Definition Buffer.h:53
IO Handler for Isis Cubes.
Definition Cube.h:168
int lineCount() const
Definition Cube.cpp:1741
int sampleCount() const
Definition Cube.cpp:1814
PixelType pixelType() const
Definition Cube.cpp:1765
void read(Blob &blob, const std::vector< PvlKeyword > keywords=std::vector< PvlKeyword >()) const
This method will read data from the specified Blob object.
Definition Cube.cpp:814
virtual int bandCount() const
Returns the number of virtual bands for the cube.
Definition Cube.cpp:1417
void operator()(Isis::Buffer &out) const
Operator () overload.
Definition Reduce.cpp:145
Buffer for containing a two dimensional section of an image.
Definition Portal.h:36
void SetPosition(const double sample, const double line, const int band)
Sets the line and sample position of the buffer.
Definition Portal.h:93
Contains multiple PvlContainers.
Definition PvlGroup.h:41
A single keyword-value pair.
Definition PvlKeyword.h:87
double mdSampleScale
Sample scale.
Definition Reduce.h:64
int miInputSamples
Input Samples.
Definition Reduce.h:73
~Reduce()
Destructor.
Definition Reduce.cpp:66
int miEndSample
Input end sample.
Definition Reduce.h:67
int miStartSample
Input start sample.
Definition Reduce.h:66
int miInputLines
Input Lines.
Definition Reduce.h:74
Reduce(Isis::Cube *pInCube, const double sampleScale, const double lineScale)
Constructor.
Definition Reduce.cpp:32
int miStartLine
Input start line.
Definition Reduce.h:68
int miEndLine
Input end line.
Definition Reduce.h:69
double mdLine
Line index.
Definition Reduce.h:70
double mdLineScale
Line scale.
Definition Reduce.h:65
Isis::PvlGroup UpdateOutputLabel(Isis::Cube *pOutCube)
Create label for the reduced output image.
Definition Reduce.cpp:112
int miBandIndex
Band Index.
Definition Reduce.h:76
int miOutputSamples
Output Samples.
Definition Reduce.h:71
int miOutputLines
Output Lines.
Definition Reduce.h:72
void setInputBoundary(int startSample, int endSample, int startLine, int endLine)
Parameters to input image sub area.
Definition Reduce.cpp:87
int miInputBands
Input Bands.
Definition Reduce.h:75
Isis::Cube * mInCube
Input image.
Definition Reduce.h:63
Isis::Portal * m_iPortal
Input portal.
Definition Reduce.h:77
Apply corrections to a cube label for subarea extraction.
Definition SubArea.h:47
void SetSubArea(const int orignl, const int origns, const int sl, const int ss, const int el, const int es, const double linc, const double sinc)
Defines the subarea.
Definition SubArea.cpp:60
This is free and unencumbered software released into the public domain.
Definition Apollo.h:16
QString toString(bool boolToConvert)
Global function to convert a boolean to a string.
Definition IString.cpp:211
bool IsValidPixel(const double d)
Returns if the input pixel is valid.
const double Null
Value for an Isis Null pixel.
Namespace for the standard library.

U.S. Department of the Interior | U.S. Geological Survey
ISIS | Privacy & Disclaimers | Astrogeology Research Program
To contact us, please post comments and questions on the USGS Astrogeology Discussion Board
To report a bug, or suggest a feature go to: ISIS Github
File Modified: 02/24/2025 16:15:13