Skip to content
Snippets Groups Projects
Unverified Commit d8fb22f8 authored by Austin Sanders's avatar Austin Sanders Committed by GitHub
Browse files

Add majority replacement option for Reduce (#5670)

* Added option for majority replacement

* Updated changelog
parent c9a429c1
No related branches found
No related tags found
No related merge requests found
...@@ -40,6 +40,7 @@ release. ...@@ -40,6 +40,7 @@ release.
- Added Vectorize to ProcessGroundPolygon library - Added Vectorize to ProcessGroundPolygon library
- Added gtest files for the app and unit test - Added gtest files for the app and unit test
- Added Chandrayaan2 template for isisimport - Added Chandrayaan2 template for isisimport
- Added majority replacement for reduce app [#5101](https://github.com/DOI-USGS/ISIS3/issues/5101).
- Added HRSC support in socetlinescankeywords [#5465](https://github.com/DOI-USGS/ISIS3/issues/5465) - Added HRSC support in socetlinescankeywords [#5465](https://github.com/DOI-USGS/ISIS3/issues/5465)
### Changed ### Changed
......
...@@ -334,6 +334,13 @@ ...@@ -334,6 +334,13 @@
is closest to the center of the window being analyzed. is closest to the center of the window being analyzed.
</description> </description>
</option> </option>
<option value="MAJORITY">
<brief>Majority replacement</brief>
<description>
When VALIDPER is not met, propagate the most commonly occurring special pixel
within the input region to the output pixel.
</description>
</option>
</list> </list>
</parameter> </parameter>
</group> </group>
......
...@@ -171,9 +171,11 @@ namespace Isis { ...@@ -171,9 +171,11 @@ namespace Isis {
*/ */
void Average::operator() (Isis::Buffer & out) const void Average::operator() (Isis::Buffer & out) const
{ {
// Index of the last input line that corresponds to this output line.
double rline = (double)out.Line() * mdLineScale; double rline = (double)out.Line() * mdLineScale;
if(out.Line() == 1 && out.Band() == 1) { if(out.Line() == 1 && out.Band() == 1) {
// Index of the last input sample that corresponds to the output sample.
mdIncTab = new double[miOutputSamples]; mdIncTab = new double[miOutputSamples];
mdSum = new double[miOutputSamples]; mdSum = new double[miOutputSamples];
mdNpts = new double[miOutputSamples]; mdNpts = new double[miOutputSamples];
...@@ -191,7 +193,9 @@ namespace Isis { ...@@ -191,7 +193,9 @@ namespace Isis {
mdIncTab[miOutputSamples-1] = miInputSamples; mdIncTab[miOutputSamples-1] = miInputSamples;
} }
while(mdLine <= rline) { unordered_map<QString, int> specialPixelCounts[miOutputSamples];
while(mdLine < rline) {
if((int)mdLine <= miInputLines) { if((int)mdLine <= miInputLines) {
m_iPortal->SetPosition(miStartSample, mdLine, miBandIndex); m_iPortal->SetPosition(miStartSample, mdLine, miBandIndex);
mInCube->read(*m_iPortal); mInCube->read(*m_iPortal);
...@@ -204,6 +208,9 @@ namespace Isis { ...@@ -204,6 +208,9 @@ namespace Isis {
mdSum[osamp] += (*m_iPortal)[isamp-1]; mdSum[osamp] += (*m_iPortal)[isamp-1];
mdNpts[osamp] += 1.0; mdNpts[osamp] += 1.0;
} }
if (IsSpecial((*m_iPortal)[isamp-1])) {
specialPixelCounts[osamp][PixelToString((*m_iPortal)[isamp-1])]++;
}
isamp++; isamp++;
} }
...@@ -218,6 +225,12 @@ namespace Isis { ...@@ -218,6 +225,12 @@ namespace Isis {
mdNpts[osamp+1] += sdel; mdNpts[osamp+1] += sdel;
} }
} }
if (IsSpecial((*m_iPortal)[isamp-1])) {
specialPixelCounts[osamp][PixelToString((*m_iPortal)[isamp-1])]++;
if(osamp+1 <= miOutputSamples){
specialPixelCounts[osamp+1][PixelToString((*m_iPortal)[isamp-1])]++;
}
}
isamp++; isamp++;
} }
mdLine++; mdLine++;
...@@ -238,6 +251,9 @@ namespace Isis { ...@@ -238,6 +251,9 @@ namespace Isis {
mdSum2[osamp] += (*m_iPortal)[isamp-1] * ldel; mdSum2[osamp] += (*m_iPortal)[isamp-1] * ldel;
mdNpts2[osamp] += ldel; mdNpts2[osamp] += ldel;
} }
if (IsSpecial((*m_iPortal)[isamp-1])) {
specialPixelCounts[osamp][PixelToString((*m_iPortal)[isamp-1])]++;
}
isamp++; isamp++;
} }
...@@ -257,6 +273,12 @@ namespace Isis { ...@@ -257,6 +273,12 @@ namespace Isis {
mdNpts2[osamp+1] += sdel * ldel; mdNpts2[osamp+1] += sdel * ldel;
} }
} }
if (IsSpecial((*m_iPortal)[isamp-1])) {
specialPixelCounts[osamp][PixelToString((*m_iPortal)[isamp-1])]++;
if(osamp+1 <= miOutputSamples){
specialPixelCounts[osamp+1][PixelToString((*m_iPortal)[isamp-1])]++;
}
}
isamp++; isamp++;
} }
...@@ -271,6 +293,14 @@ namespace Isis { ...@@ -271,6 +293,14 @@ namespace Isis {
if(msReplaceMode == "NEAREST") { if(msReplaceMode == "NEAREST") {
out[osamp] = (*m_iPortal)[(int)(mdIncTab[osamp] + 0.5) - 1]; out[osamp] = (*m_iPortal)[(int)(mdIncTab[osamp] + 0.5) - 1];
} }
else if (msReplaceMode == "MAJORITY") {
// Iterate over the map and compare element counts
// Map iterator yields a pair: pair.first == pixel names, pair.second == pixel count.
auto mode = std::max_element(specialPixelCounts[osamp].begin(),
specialPixelCounts[osamp].end(),
[](const pair<QString, int> &a, const pair<QString, int> &b) {return a.second < b.second;});
out[osamp] = StringToPixel(mode->first);
}
else { else {
out[osamp] = Isis::Null; out[osamp] = Isis::Null;
} }
...@@ -281,6 +311,7 @@ namespace Isis { ...@@ -281,6 +311,7 @@ namespace Isis {
mdNpts2[osamp] = 0.0; mdNpts2[osamp] = 0.0;
} }
// If this is the last line of the band, reset stats and increment band
if(out.Line() == miOutputLines && out.Band() != miInputBands) { if(out.Line() == miOutputLines && out.Band() != miInputBands) {
miBandIndex++; miBandIndex++;
mdLine = 1; mdLine = 1;
......
...@@ -111,7 +111,7 @@ namespace Isis { ...@@ -111,7 +111,7 @@ namespace Isis {
double pdValidPer, QString psReplaceMode) double pdValidPer, QString psReplaceMode)
: Reduce(pInCube, pdSampleScale, pdLineScale){ : Reduce(pInCube, pdSampleScale, pdLineScale){
mdValidPer = pdValidPer; mdValidPer = pdValidPer;
msReplaceMode = psReplaceMode; msReplaceMode = psReplaceMode.toUpper();
} }
//! Operator () overload //! Operator () overload
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment