diff --git a/rtdata/languages/default b/rtdata/languages/default
index db55dde96..4b1b329e9 100644
--- a/rtdata/languages/default
+++ b/rtdata/languages/default
@@ -690,6 +690,16 @@ HISTORY_MSG_455;EvPixelShiftNonGreenVertical
HISTORY_MSG_456;EvPixelShiftNonGreenCross
HISTORY_MSG_457;EvPixelShiftStddevFactorRed
HISTORY_MSG_458;EvPixelShiftStddevFactorBlue
+HISTORY_MSG_459;EvPixelShiftGreenAmaze
+HISTORY_MSG_460;EvPixelShiftNonGreenAmaze
+HISTORY_MSG_461;EvPixelShiftGreen
+HISTORY_MSG_462;EvPixelShiftRedBlueWeight
+HISTORY_MSG_463;EvPixelShiftBlur
+HISTORY_MSG_464;EvPixelShiftSigma
+HISTORY_MSG_465;EvPixelShiftSum
+HISTORY_MSG_466;EvPixelShiftExp0
+HISTORY_MSG_467;EvPixelShiftHoleFill
+HISTORY_MSG_468;EvPixelShiftMedian
HISTORY_NEWSNAPSHOT;Add
HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s
HISTORY_SNAPSHOT;Snapshot
@@ -1671,9 +1681,23 @@ TP_RAW_LMMSE_TOOLTIP;Adds gamma (step 1), median (steps 2-4) and refinement (ste
TP_RAW_PIXELSHIFTADAPTIVE;Adaptive detection
TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Check red/blue horizontal
TP_RAW_PIXELSHIFTNONGREENVERTICAL;Check red/blue vertical
+TP_RAW_PIXELSHIFTMEDIAN;Median
+TP_RAW_PIXELSHIFTMEDIAN3;Exclude selected frame from median
+TP_RAW_PIXELSHIFTHOLEFILL;3x3 new: Fill holes
+TP_RAW_PIXELSHIFTBLUR;3x3 new: Blur
+TP_RAW_PIXELSHIFTEXP0;Experimental
+TP_RAW_PIXELSHIFTGREEN;Check dual green
TP_RAW_PIXELSHIFTNONGREENCROSS;Check red/blue cross
-TP_RAW_PIXELSHIFTMOTION;Pixelshift motion detection
+TP_RAW_PIXELSHIFTNONGREENCROSS2;Check green amaze
+TP_RAW_PIXELSHIFTNONGREENAMAZE;Check red/blue amaze
+TP_RAW_PIXELSHIFTMOTION;Motion detection level (deprecated)
TP_RAW_PIXELSHIFTMOTION_TOOLTIP;0 means no motion detection\n1 - 99 means motion will be detected according to this value. Increase value to increase detection rate\n100 means the Amaze demosaiced frame will be used
+TP_RAW_PIXELSHIFTHOLEFILL_TOOLTIP;Fill holes in motion mask
+TP_RAW_PIXELSHIFTBLUR_TOOLTIP;Blur motion mask
+TP_RAW_PIXELSHIFTMEDIAN_TOOLTIP;Use median of all frames instead of selected frame for regions with motion.\nRemoves objects which are at different places in all frames.\nGives motion effect on slow moving (overlapping) objects.
+TP_RAW_PIXELSHIFTMEDIAN3_TOOLTIP;Excludes selected frame from median.\nUseful if moving objects overlap in frame 2 and 3
+TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a mask showing the regions with motion
+TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY_TOOLTIP;Shows the motion mask without the image
TP_RAW_PIXELSHIFTMOTIONCORRECTION;Green motion correction size
TP_RAW_PIXELSHIFTMOTIONCORRECTION_TOOLTIP;1 = 2 pixels\n3 = 3x3 grid\n5 = 5x5 grid
TP_RAW_PIXELSHIFTSHOWMOTION;Show motion
@@ -1684,6 +1708,9 @@ TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue
TP_RAW_PIXELSHIFTEPERISO;e per ISO
TP_RAW_PIXELSHIFTNREADISO;nRead
TP_RAW_PIXELSHIFTPRNU;PRNU (%)
+TP_RAW_PIXELSHIFTSIGMA;Blur sigma
+TP_RAW_PIXELSHIFTMASKTHRESHOLD;3x3 new threshold
+TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Red&Blue weight
TP_RAW_SENSOR_BAYER_LABEL;Sensor with Bayer Matrix
TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;3-pass gives best results (recommended for low ISO images).\n1-pass is almost undistinguishable from 3-pass for high ISO images and is faster.
TP_RAW_SENSOR_XTRANS_LABEL;Sensor with X-Trans Matrix
diff --git a/rtengine/amaze_demosaic_RT.cc b/rtengine/amaze_demosaic_RT.cc
index c5535493c..3cb0ee8de 100644
--- a/rtengine/amaze_demosaic_RT.cc
+++ b/rtengine/amaze_demosaic_RT.cc
@@ -38,7 +38,7 @@
namespace rtengine
{
-SSEFUNCTION void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh)
+SSEFUNCTION void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, array2D &rawData, array2D &red, array2D &green, array2D &blue)
{
BENCHFUN
diff --git a/rtengine/median.h b/rtengine/median.h
index 971452bc3..30adbacb3 100644
--- a/rtengine/median.h
+++ b/rtengine/median.h
@@ -64,6 +64,15 @@ inline vfloat median(std::array array)
}
#endif
+
+template
+inline T median(std::array array)
+{
+ float val1 = std::max(std::min(array[0], array[1]), std::min(array[2], array[3]));
+ float val2 = std::min(std::max(array[0], array[1]), std::max(array[2], array[3]));
+ return (val1 + val2) / 2.f;
+}
+
template
inline T median(std::array array)
{
diff --git a/rtengine/pixelshift.cc b/rtengine/pixelshift.cc
index e3ababc85..ae2f08fdb 100644
--- a/rtengine/pixelshift.cc
+++ b/rtengine/pixelshift.cc
@@ -30,13 +30,14 @@
#include "rawimagesource.h"
#include "../rtgui/multilangmgr.h"
#include "procparams.h"
+#include "gauss.h"
#define BENCHMARK
#include "StopWatch.h"
namespace
{
-float greenDiff(float a, float b, bool adaptive, float stddevFactor, float eperIso, float nreadIso, float prnu, bool showMotion)
+float greenDiff(float a, float b, bool adaptive, float stddevFactor, float eperIso, float nreadIso, float prnu, bool showMotion, int x, int y)
{
// calculate the difference between two green samples
if(adaptive) {
@@ -47,6 +48,12 @@ float greenDiff(float a, float b, bool adaptive, float stddevFactor, float eperI
avg *= eperIso;
prnu *= avg;
float stddev = stddevFactor * (avg + nreadIso + prnu * prnu);
+
+// if(x >= 4294 && x <= 4303 && y >= 3056 && y <= 3058) {
+// #pragma omp critical
+// std::cout << "x : " << x << " y : " << y << " stddev : " << stddev << " avg : " << avg << " gDiff : " << gDiff << std::endl;
+// }
+
float result = gDiff - stddev;
if(!showMotion) {
@@ -122,11 +129,166 @@ void paintMotionMask(int index, bool showMotion, float gridMax, bool showOnlyMas
}
}
+void invertMask(int xStart, int xEnd, int yStart, int yEnd, array2D &maskIn, array2D &maskOut)
+{
+ #pragma omp parallel for schedule(dynamic,16)
+
+ for(int i = yStart; i < yEnd; ++i) {
+ #pragma omp simd
+
+ for(int j = xStart; j < xEnd; ++j) {
+ maskOut[i][j] = ~maskIn[i][j];
+ }
+ }
+}
+
+void xorMasks(int xStart, int xEnd, int yStart, int yEnd, array2D &maskIn, array2D &maskOut)
+{
+ #pragma omp parallel for schedule(dynamic,16)
+
+ for(int i = yStart; i < yEnd; ++i) {
+ #pragma omp simd
+
+ for(int j = xStart; j < xEnd; ++j) {
+ maskOut[i][j] ^= maskIn[i][j];
+ }
+ }
+}
+
+void floodFill4Impl(int y, int x, int xStart, int xEnd, int yStart, int yEnd, array2D &mask, std::stack, std::vector>> &coordStack)
+{
+ coordStack.emplace(x, y);
+
+ while(!coordStack.empty()) {
+ auto coord = coordStack.top();
+ coordStack.pop();
+ auto x = coord.first, y = coord.second;
+
+ if (mask[y][x] == 255) {
+ auto yUp = y - 1, yDown = y + 1;
+ bool lastXUp = false, lastXDown = false, firstXUp = false, firstXDown = false;
+ mask[y][x] = 0;
+ if(yUp >= yStart && mask[yUp][x] == 255) {
+ coordStack.emplace(x, yUp);
+ firstXUp = lastXUp = true;
+ }
+ if(yDown < yEnd && mask[yDown][x] == 255) {
+ coordStack.emplace(x, yDown);
+ firstXDown = lastXDown = true;
+ }
+ auto xr = x + 1;
+
+ while(xr < xEnd && mask[y][xr] == 255) {
+ mask[y][xr] = 0;
+ if(yUp >= yStart && mask[yUp][xr] == 255) {
+ if(!lastXUp) {
+ coordStack.emplace(xr, yUp);
+ lastXUp = true;
+ }
+ } else {
+ lastXUp = false;
+ }
+ if(yDown < yEnd && mask[yDown][xr] == 255) {
+ if(!lastXDown) {
+ coordStack.emplace(xr, yDown);
+ lastXDown = true;
+ }
+ } else {
+ lastXDown = false;
+ }
+ xr++;
+ }
+
+ auto xl = x - 1;
+ lastXUp = firstXUp;
+ lastXDown = firstXDown;
+ while(xl >= xStart && mask[y][xl] == 255) {
+ mask[y][xl] = 0;
+ if(yUp >= yStart && mask[yUp][xl] == 255) {
+ if(!lastXUp) {
+ coordStack.emplace(xl, yUp);
+ lastXUp = true;
+ }
+ } else {
+ lastXUp = false;
+ }
+ if(yDown < yEnd && mask[yDown][xl] == 255) {
+ if(!lastXDown) {
+ coordStack.emplace(xl, yDown);
+ lastXDown = true;
+ }
+ } else {
+ lastXDown = false;
+ }
+ xl--;
+ }
+ mask[y][x] = 0;
+ }
+ }
+}
+
+void floodFill4(int xStart, int xEnd, int yStart, int yEnd, array2D &mask)
+{
+ #pragma omp parallel
+ {
+ std::stack, std::vector>> coordStack;
+
+ #pragma omp for schedule(dynamic,128) nowait
+ for(uint16_t i = yStart;i= 0 ;i--)
+ floodFill4Impl(i, xEnd - 1, xStart, xEnd, yStart, yEnd, mask, coordStack);
+
+ #pragma omp sections nowait
+ {
+ #pragma omp section
+ {
+ uint16_t i = yStart;
+
+ for(uint16_t j = xStart; j < xEnd; j++)
+ {
+ floodFill4Impl(i, j, xStart, xEnd, yStart, yEnd, mask, coordStack);
+ }
+ }
+ #pragma omp section
+ {
+ uint16_t i = yStart;
+
+ for(uint16_t j = xEnd - 1; j >= xStart; j--)
+ {
+ floodFill4Impl(i, j, xStart, xEnd, yStart, yEnd, mask, coordStack);
+ }
+ }
+ #pragma omp section
+ {
+ uint16_t i = yEnd;
+
+ for(uint16_t j = xStart; j < xEnd; j++)
+ {
+ floodFill4Impl(i, j, xStart, xEnd, yStart, yEnd, mask, coordStack);
+ }
+ }
+ #pragma omp section
+ {
+ uint16_t i = yEnd;
+
+ for(uint16_t j = xEnd - 1; j >= xStart; j--)
+ {
+ floodFill4Impl(i, j, xStart, xEnd, yStart, yEnd, mask, coordStack);
+ }
+ }
+ }
+ }
+}
+
+
}
using namespace std;
using namespace rtengine;
-
+#ifdef __OLDPS__
void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, bool detectMotion, int motion, bool showMotion, bool showOnlyMask, unsigned int frame, RAWParams::BayerSensor::ePSMotionCorrection gridSize_, bool adaptive, float stddevFactorGreen, float stddevFactorRed, float stddevFactorBlue, float eperIso, float nreadIso, float prnu, const std::string &model, float rawWpCorrection, bool checkNonGreenHorizontal, bool checkNonGreenVertical, bool checkNonGreenCross)
{
@@ -276,6 +438,7 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, bool det
float eperIsoModel;
int nReadIndex = static_cast(round(log2(idata->getISOSpeed() / 100.f) * 3.f));
+
if(model.find("K-3") != string::npos) {
nRead = nReadK3II[nReadIndex];
eperIsoModel = ePerIsoK3II;
@@ -292,7 +455,7 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, bool det
eperIso = eperIsoModel * (100.f / (rawWpCorrection * idata->getISOSpeed()));
float eperIsoGreen = eperIso * scaleGreen;
- printf("Pixelshift parameters : gridSize %d\tadaptive %d\tstdDevFactorGreen %f\telectrons %1.8f\tnread %f\tprnu %1.1f%%\n", gridSize, adaptive, stddevFactorGreen, eperIso, nRead, prnu);
+// printf("Pixelshift parameters : gridSize %d\tadaptive %d\tstdDevFactorGreen %f\telectrons %1.8f\tnread %f\tprnu %1.1f%%\n", gridSize, adaptive, stddevFactorGreen, eperIso, nRead, prnu);
prnu /= 100.f;
stddevFactorGreen *= stddevFactorGreen;
@@ -347,9 +510,11 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, bool det
float eperIsoNonGreen2 = eperIso / scale_mul[2];
float stddevFactorNonGreen0 = stddevFactorRed;
float stddevFactorNonGreen2 = stddevFactorBlue;
+ bool blueRow = false;
if (c == 2 || ((c & 1) && FC(i, j + 1) == 2)) {
// row with blue pixels => swap destination pointers for non green pixels
+ blueRow = true;
std::swap(nonGreenDest0, nonGreenDest1);
std::swap(scaleNonGreen0, scaleNonGreen2);
std::swap(eperIsoNonGreen0, eperIsoNonGreen2);
@@ -365,90 +530,90 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, bool det
if(detectMotion || adaptive) {
if(gridSize == 3) {
// compute maximum of differences for first two columns of 3x3 grid
- greenDifMax[0] = std::max({greenDiff((*rawDataFrames[1 - offset])[i - offset][j - 1], (*rawDataFrames[3 - offset])[i + offset - 1][j], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[0 + offset])[i + offset][j - 1], (*rawDataFrames[2 + offset])[i - offset + 1][j], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[1 - offset])[i - offset + 2][j - 1], (*rawDataFrames[3 - offset])[i + offset + 1][j], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion)
- });
- greenDifMax[1] = std::max({greenDiff((*rawDataFrames[0 + offset])[i + offset - 1][j], (*rawDataFrames[2 + offset])[i - offset][j + 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[1 - offset])[i - offset + 1][j], (*rawDataFrames[3 - offset])[i + offset][j + 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[0 + offset])[i + offset + 1][j], (*rawDataFrames[2 + offset])[i - offset + 2][j + 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion)
- });
+ greenDifMax[0] = std::max({greenDiff((*rawDataFrames[1 - offset])[i - offset][j - 1], (*rawDataFrames[3 - offset])[i + offset - 1][j], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[0 + offset])[i + offset][j - 1], (*rawDataFrames[2 + offset])[i - offset + 1][j], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[1 - offset])[i - offset + 2][j - 1], (*rawDataFrames[3 - offset])[i + offset + 1][j], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i)
+ });
+ greenDifMax[1] = std::max({greenDiff((*rawDataFrames[0 + offset])[i + offset - 1][j], (*rawDataFrames[2 + offset])[i - offset][j + 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[1 - offset])[i - offset + 1][j], (*rawDataFrames[3 - offset])[i + offset][j + 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[0 + offset])[i + offset + 1][j], (*rawDataFrames[2 + offset])[i - offset + 2][j + 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i)
+ });
} else if(gridSize == 5) {
// compute maximum of differences for first four columns of 5x5 grid
- greenDifMax[0] = std::max({greenDiff((*rawDataFrames[1 - offset])[i - offset - 1][j - 2], (*rawDataFrames[3 - offset])[i + offset - 2][j - 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[0 + offset])[i + offset - 1][j - 2], (*rawDataFrames[2 + offset])[i - offset][j - 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[1 - offset])[i - offset + 1][j - 2], (*rawDataFrames[3 - offset])[i + offset][j - 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[0 + offset])[i + offset + 1][j - 2], (*rawDataFrames[2 + offset])[i - offset + 2][j - 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[1 - offset])[i - offset + 3][j - 2], (*rawDataFrames[3 - offset])[i + offset + 2][j - 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion)
- });
- greenDifMax[1] = std::max({greenDiff((*rawDataFrames[0 + offset])[i + offset - 2][j - 1], (*rawDataFrames[2 + offset])[i - offset - 1][j], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[1 - offset])[i - offset][j - 1], (*rawDataFrames[3 - offset])[i + offset - 1][j], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[0 + offset])[i + offset][j - 1], (*rawDataFrames[2 + offset])[i - offset + 1][j], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[1 - offset])[i - offset + 2][j - 1], (*rawDataFrames[3 - offset])[i + offset + 1][j], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[0 + offset])[i + offset + 2][j - 1], (*rawDataFrames[2 + offset])[i - offset + 3][j], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion)
- });
- greenDifMax[2] = std::max({greenDiff((*rawDataFrames[1 - offset])[i - offset - 1][j], (*rawDataFrames[3 - offset])[i + offset - 2][j + 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[0 + offset])[i + offset - 1][j], (*rawDataFrames[2 + offset])[i - offset][j + 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[1 - offset])[i - offset + 1][j], (*rawDataFrames[3 - offset])[i + offset][j + 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[0 + offset])[i + offset + 1][j], (*rawDataFrames[2 + offset])[i - offset + 2][j + 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[1 - offset])[i - offset + 3][j], (*rawDataFrames[3 - offset])[i + offset + 2][j + 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion)
- });
- greenDifMax[3] = std::max({greenDiff((*rawDataFrames[0 + offset])[i + offset - 2][j + 1], (*rawDataFrames[2 + offset])[i - offset - 1][j + 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[1 - offset])[i - offset][j + 1], (*rawDataFrames[3 - offset])[i + offset - 1][j + 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[0 + offset])[i + offset][j + 1], (*rawDataFrames[2 + offset])[i - offset + 1][j + 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[1 - offset])[i - offset + 2][j + 1], (*rawDataFrames[3 - offset])[i + offset + 1][j + 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[0 + offset])[i + offset + 2][j + 1], (*rawDataFrames[2 + offset])[i - offset + 3][j + 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion)
- });
+ greenDifMax[0] = std::max({greenDiff((*rawDataFrames[1 - offset])[i - offset - 1][j - 2], (*rawDataFrames[3 - offset])[i + offset - 2][j - 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[0 + offset])[i + offset - 1][j - 2], (*rawDataFrames[2 + offset])[i - offset][j - 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[1 - offset])[i - offset + 1][j - 2], (*rawDataFrames[3 - offset])[i + offset][j - 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[0 + offset])[i + offset + 1][j - 2], (*rawDataFrames[2 + offset])[i - offset + 2][j - 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[1 - offset])[i - offset + 3][j - 2], (*rawDataFrames[3 - offset])[i + offset + 2][j - 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i)
+ });
+ greenDifMax[1] = std::max({greenDiff((*rawDataFrames[0 + offset])[i + offset - 2][j - 1], (*rawDataFrames[2 + offset])[i - offset - 1][j], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[1 - offset])[i - offset][j - 1], (*rawDataFrames[3 - offset])[i + offset - 1][j], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[0 + offset])[i + offset][j - 1], (*rawDataFrames[2 + offset])[i - offset + 1][j], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[1 - offset])[i - offset + 2][j - 1], (*rawDataFrames[3 - offset])[i + offset + 1][j], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[0 + offset])[i + offset + 2][j - 1], (*rawDataFrames[2 + offset])[i - offset + 3][j], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i)
+ });
+ greenDifMax[2] = std::max({greenDiff((*rawDataFrames[1 - offset])[i - offset - 1][j], (*rawDataFrames[3 - offset])[i + offset - 2][j + 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[0 + offset])[i + offset - 1][j], (*rawDataFrames[2 + offset])[i - offset][j + 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[1 - offset])[i - offset + 1][j], (*rawDataFrames[3 - offset])[i + offset][j + 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[0 + offset])[i + offset + 1][j], (*rawDataFrames[2 + offset])[i - offset + 2][j + 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[1 - offset])[i - offset + 3][j], (*rawDataFrames[3 - offset])[i + offset + 2][j + 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i)
+ });
+ greenDifMax[3] = std::max({greenDiff((*rawDataFrames[0 + offset])[i + offset - 2][j + 1], (*rawDataFrames[2 + offset])[i - offset - 1][j + 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[1 - offset])[i - offset][j + 1], (*rawDataFrames[3 - offset])[i + offset - 1][j + 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[0 + offset])[i + offset][j + 1], (*rawDataFrames[2 + offset])[i - offset + 1][j + 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[1 - offset])[i - offset + 2][j + 1], (*rawDataFrames[3 - offset])[i + offset + 1][j + 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[0 + offset])[i + offset + 2][j + 1], (*rawDataFrames[2 + offset])[i - offset + 3][j + 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i)
+ });
} else if(gridSize == 7) {
// compute maximum of differences for first six columns of 7x7 grid
- greenDifMax[0] = std::max({greenDiff((*rawDataFrames[1 - offset])[i - offset - 2][j - 3], (*rawDataFrames[3 - offset])[i + offset - 3][j - 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[0 + offset])[i + offset - 2][j - 3], (*rawDataFrames[2 + offset])[i - offset - 1][j - 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[1 - offset])[i - offset][j - 3], (*rawDataFrames[3 - offset])[i + offset - 1][j - 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[0 + offset])[i + offset][j - 3], (*rawDataFrames[2 + offset])[i - offset + 1][j - 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[1 - offset])[i - offset + 2][j - 3], (*rawDataFrames[3 - offset])[i + offset + 1][j - 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[0 + offset])[i + offset + 2][j - 3], (*rawDataFrames[2 + offset])[i - offset + 3][j - 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[1 - offset])[i - offset + 4][j - 3], (*rawDataFrames[3 - offset])[i + offset + 3][j - 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion)
- });
- greenDifMax[1] = std::max({greenDiff((*rawDataFrames[0 + offset])[i + offset - 3][j - 2], (*rawDataFrames[2 + offset])[i - offset - 2][j - 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[1 - offset])[i - offset - 1][j - 2], (*rawDataFrames[3 - offset])[i + offset - 2][j - 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[0 + offset])[i + offset - 1][j - 2], (*rawDataFrames[2 + offset])[i - offset][j - 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[1 - offset])[i - offset + 1][j - 2], (*rawDataFrames[3 - offset])[i + offset][j - 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[0 + offset])[i + offset + 1][j - 2], (*rawDataFrames[2 + offset])[i - offset + 2][j - 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[1 - offset])[i - offset + 3][j - 2], (*rawDataFrames[3 - offset])[i + offset + 2][j - 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[0 + offset])[i + offset + 3][j - 2], (*rawDataFrames[2 + offset])[i - offset + 4][j - 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion)
- });
- greenDifMax[2] = std::max({greenDiff((*rawDataFrames[1 - offset])[i - offset - 2][j - 1], (*rawDataFrames[3 - offset])[i + offset - 3][j], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[0 + offset])[i + offset - 2][j - 1], (*rawDataFrames[2 + offset])[i - offset - 1][j], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[1 - offset])[i - offset][j - 1], (*rawDataFrames[3 - offset])[i + offset - 1][j], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[0 + offset])[i + offset][j - 1], (*rawDataFrames[2 + offset])[i - offset + 1][j], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[1 - offset])[i - offset + 2][j - 1], (*rawDataFrames[3 - offset])[i + offset + 1][j], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[0 + offset])[i + offset + 2][j - 1], (*rawDataFrames[2 + offset])[i - offset + 3][j], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[1 - offset])[i - offset + 4][j - 1], (*rawDataFrames[3 - offset])[i + offset + 3][j], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion)
- });
- greenDifMax[3] = std::max({greenDiff((*rawDataFrames[0 + offset])[i + offset - 3][j], (*rawDataFrames[2 + offset])[i - offset - 2][j + 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[1 - offset])[i - offset - 1][j], (*rawDataFrames[3 - offset])[i + offset - 2][j + 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[0 + offset])[i + offset - 1][j], (*rawDataFrames[2 + offset])[i - offset][j + 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[1 - offset])[i - offset + 1][j], (*rawDataFrames[3 - offset])[i + offset][j + 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[0 + offset])[i + offset + 1][j], (*rawDataFrames[2 + offset])[i - offset + 2][j + 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[1 - offset])[i - offset + 3][j], (*rawDataFrames[3 - offset])[i + offset + 2][j + 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[0 + offset])[i + offset + 3][j], (*rawDataFrames[2 + offset])[i - offset + 4][j + 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion)
- });
- greenDifMax[4] = std::max({greenDiff((*rawDataFrames[1 - offset])[i - offset - 2][j + 1], (*rawDataFrames[3 - offset])[i + offset - 3][j + 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[0 + offset])[i + offset - 2][j + 1], (*rawDataFrames[2 + offset])[i - offset - 1][j + 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[1 - offset])[i - offset][j + 1], (*rawDataFrames[3 - offset])[i + offset - 1][j + 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[0 + offset])[i + offset][j + 1], (*rawDataFrames[2 + offset])[i - offset + 1][j + 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[1 - offset])[i - offset + 2][j + 1], (*rawDataFrames[3 - offset])[i + offset + 1][j + 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[0 + offset])[i + offset + 2][j + 1], (*rawDataFrames[2 + offset])[i - offset + 3][j + 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[1 - offset])[i - offset + 4][j + 1], (*rawDataFrames[3 - offset])[i + offset + 3][j + 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion)
- });
- greenDifMax[5] = std::max({greenDiff((*rawDataFrames[0 + offset])[i + offset - 3][j + 2], (*rawDataFrames[2 + offset])[i - offset - 2][j + 3], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[1 - offset])[i - offset - 1][j + 2], (*rawDataFrames[3 - offset])[i + offset - 2][j + 3], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[0 + offset])[i + offset - 1][j + 2], (*rawDataFrames[2 + offset])[i - offset][j + 3], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[1 - offset])[i - offset + 1][j + 2], (*rawDataFrames[3 - offset])[i + offset][j + 3], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[0 + offset])[i + offset + 1][j + 2], (*rawDataFrames[2 + offset])[i - offset + 2][j + 3], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[1 - offset])[i - offset + 3][j + 2], (*rawDataFrames[3 - offset])[i + offset + 2][j + 3], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[0 + offset])[i + offset + 3][j + 2], (*rawDataFrames[2 + offset])[i - offset + 4][j + 3], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion)
- });
+ greenDifMax[0] = std::max({greenDiff((*rawDataFrames[1 - offset])[i - offset - 2][j - 3], (*rawDataFrames[3 - offset])[i + offset - 3][j - 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[0 + offset])[i + offset - 2][j - 3], (*rawDataFrames[2 + offset])[i - offset - 1][j - 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[1 - offset])[i - offset][j - 3], (*rawDataFrames[3 - offset])[i + offset - 1][j - 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[0 + offset])[i + offset][j - 3], (*rawDataFrames[2 + offset])[i - offset + 1][j - 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[1 - offset])[i - offset + 2][j - 3], (*rawDataFrames[3 - offset])[i + offset + 1][j - 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[0 + offset])[i + offset + 2][j - 3], (*rawDataFrames[2 + offset])[i - offset + 3][j - 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[1 - offset])[i - offset + 4][j - 3], (*rawDataFrames[3 - offset])[i + offset + 3][j - 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i)
+ });
+ greenDifMax[1] = std::max({greenDiff((*rawDataFrames[0 + offset])[i + offset - 3][j - 2], (*rawDataFrames[2 + offset])[i - offset - 2][j - 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[1 - offset])[i - offset - 1][j - 2], (*rawDataFrames[3 - offset])[i + offset - 2][j - 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[0 + offset])[i + offset - 1][j - 2], (*rawDataFrames[2 + offset])[i - offset][j - 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[1 - offset])[i - offset + 1][j - 2], (*rawDataFrames[3 - offset])[i + offset][j - 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[0 + offset])[i + offset + 1][j - 2], (*rawDataFrames[2 + offset])[i - offset + 2][j - 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[1 - offset])[i - offset + 3][j - 2], (*rawDataFrames[3 - offset])[i + offset + 2][j - 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[0 + offset])[i + offset + 3][j - 2], (*rawDataFrames[2 + offset])[i - offset + 4][j - 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i)
+ });
+ greenDifMax[2] = std::max({greenDiff((*rawDataFrames[1 - offset])[i - offset - 2][j - 1], (*rawDataFrames[3 - offset])[i + offset - 3][j], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[0 + offset])[i + offset - 2][j - 1], (*rawDataFrames[2 + offset])[i - offset - 1][j], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[1 - offset])[i - offset][j - 1], (*rawDataFrames[3 - offset])[i + offset - 1][j], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[0 + offset])[i + offset][j - 1], (*rawDataFrames[2 + offset])[i - offset + 1][j], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[1 - offset])[i - offset + 2][j - 1], (*rawDataFrames[3 - offset])[i + offset + 1][j], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[0 + offset])[i + offset + 2][j - 1], (*rawDataFrames[2 + offset])[i - offset + 3][j], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[1 - offset])[i - offset + 4][j - 1], (*rawDataFrames[3 - offset])[i + offset + 3][j], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i)
+ });
+ greenDifMax[3] = std::max({greenDiff((*rawDataFrames[0 + offset])[i + offset - 3][j], (*rawDataFrames[2 + offset])[i - offset - 2][j + 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[1 - offset])[i - offset - 1][j], (*rawDataFrames[3 - offset])[i + offset - 2][j + 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[0 + offset])[i + offset - 1][j], (*rawDataFrames[2 + offset])[i - offset][j + 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[1 - offset])[i - offset + 1][j], (*rawDataFrames[3 - offset])[i + offset][j + 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[0 + offset])[i + offset + 1][j], (*rawDataFrames[2 + offset])[i - offset + 2][j + 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[1 - offset])[i - offset + 3][j], (*rawDataFrames[3 - offset])[i + offset + 2][j + 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[0 + offset])[i + offset + 3][j], (*rawDataFrames[2 + offset])[i - offset + 4][j + 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i)
+ });
+ greenDifMax[4] = std::max({greenDiff((*rawDataFrames[1 - offset])[i - offset - 2][j + 1], (*rawDataFrames[3 - offset])[i + offset - 3][j + 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[0 + offset])[i + offset - 2][j + 1], (*rawDataFrames[2 + offset])[i - offset - 1][j + 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[1 - offset])[i - offset][j + 1], (*rawDataFrames[3 - offset])[i + offset - 1][j + 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[0 + offset])[i + offset][j + 1], (*rawDataFrames[2 + offset])[i - offset + 1][j + 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[1 - offset])[i - offset + 2][j + 1], (*rawDataFrames[3 - offset])[i + offset + 1][j + 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[0 + offset])[i + offset + 2][j + 1], (*rawDataFrames[2 + offset])[i - offset + 3][j + 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[1 - offset])[i - offset + 4][j + 1], (*rawDataFrames[3 - offset])[i + offset + 3][j + 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i)
+ });
+ greenDifMax[5] = std::max({greenDiff((*rawDataFrames[0 + offset])[i + offset - 3][j + 2], (*rawDataFrames[2 + offset])[i - offset - 2][j + 3], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[1 - offset])[i - offset - 1][j + 2], (*rawDataFrames[3 - offset])[i + offset - 2][j + 3], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[0 + offset])[i + offset - 1][j + 2], (*rawDataFrames[2 + offset])[i - offset][j + 3], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[1 - offset])[i - offset + 1][j + 2], (*rawDataFrames[3 - offset])[i + offset][j + 3], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[0 + offset])[i + offset + 1][j + 2], (*rawDataFrames[2 + offset])[i - offset + 2][j + 3], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[1 - offset])[i - offset + 3][j + 2], (*rawDataFrames[3 - offset])[i + offset + 2][j + 3], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[0 + offset])[i + offset + 3][j + 2], (*rawDataFrames[2 + offset])[i - offset + 4][j + 3], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i)
+ });
}
}
@@ -468,34 +633,34 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, bool det
if(gridSize < 2) {
// compute difference for current pixel and skip next pixel, that's the method from dcrawps
- gridMax = greenDiff((*rawDataFrames[1 - offset])[i - offset + 1][j], (*rawDataFrames[3 - offset])[i + offset][j + 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion);
+ gridMax = greenDiff((*rawDataFrames[1 - offset])[i - offset + 1][j], (*rawDataFrames[3 - offset])[i + offset][j + 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i);
skipNext = skip;
} else if(gridSize == 3) {
// compute maximum of differences for third column of 3x3 grid and save at position lastIndex
- greenDifMax[lastIndex] = std::max({greenDiff((*rawDataFrames[1 - offset])[i - offset][j + 1], (*rawDataFrames[3 - offset])[i + offset - 1][j + 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[0 + offset])[i + offset][j + 1], (*rawDataFrames[2 + offset])[i - offset + 1][j + 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[1 - offset])[i - offset + 2][j + 1], (*rawDataFrames[3 - offset])[i + offset + 1][j + 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion)
- });
+ greenDifMax[lastIndex] = std::max({greenDiff((*rawDataFrames[1 - offset])[i - offset][j + 1], (*rawDataFrames[3 - offset])[i + offset - 1][j + 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[0 + offset])[i + offset][j + 1], (*rawDataFrames[2 + offset])[i - offset + 1][j + 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[1 - offset])[i - offset + 2][j + 1], (*rawDataFrames[3 - offset])[i + offset + 1][j + 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i)
+ });
gridMax = std::max({greenDifMax[0], greenDifMax[1], greenDifMax[2]});
} else if(gridSize == 5) {
// compute maximum of differences for fifth column of 5x5 grid and save at position lastIndex
- greenDifMax[lastIndex] = std::max({greenDiff((*rawDataFrames[1 - offset])[i - offset - 1][j + 2], (*rawDataFrames[3 - offset])[i + offset - 2][j + 3], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[0 + offset])[i + offset - 1][j + 2], (*rawDataFrames[2 + offset])[i - offset][j + 3], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[1 - offset])[i - offset + 1][j + 2], (*rawDataFrames[3 - offset])[i + offset][j + 3], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[0 + offset])[i + offset + 1][j + 2], (*rawDataFrames[2 + offset])[i - offset + 2][j + 3], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[1 - offset])[i - offset + 3][j + 2], (*rawDataFrames[3 - offset])[i + offset + 2][j + 3], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion)
- });
+ greenDifMax[lastIndex] = std::max({greenDiff((*rawDataFrames[1 - offset])[i - offset - 1][j + 2], (*rawDataFrames[3 - offset])[i + offset - 2][j + 3], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[0 + offset])[i + offset - 1][j + 2], (*rawDataFrames[2 + offset])[i - offset][j + 3], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[1 - offset])[i - offset + 1][j + 2], (*rawDataFrames[3 - offset])[i + offset][j + 3], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[0 + offset])[i + offset + 1][j + 2], (*rawDataFrames[2 + offset])[i - offset + 2][j + 3], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[1 - offset])[i - offset + 3][j + 2], (*rawDataFrames[3 - offset])[i + offset + 2][j + 3], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i)
+ });
gridMax = std::max({greenDifMax[0], greenDifMax[1], greenDifMax[2], greenDifMax[3], greenDifMax[4]});
} else if(gridSize == 7) {
// compute maximum of differences for 7th column of 7x7 grid and save at position lastIndex
- greenDifMax[lastIndex] = std::max({greenDiff((*rawDataFrames[1 - offset])[i - offset - 2][j + 3], (*rawDataFrames[3 - offset])[i + offset - 3][j + 4], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[0 + offset])[i + offset - 2][j + 3], (*rawDataFrames[2 + offset])[i - offset - 1][j + 4], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[1 - offset])[i - offset][j + 3], (*rawDataFrames[3 - offset])[i + offset - 1][j + 4], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[0 + offset])[i + offset][j + 3], (*rawDataFrames[2 + offset])[i - offset + 1][j + 4], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[1 - offset])[i - offset + 2][j + 3], (*rawDataFrames[3 - offset])[i + offset + 1][j + 4], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[0 + offset])[i + offset + 2][j + 3], (*rawDataFrames[2 + offset])[i - offset + 3][j + 4], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion),
- greenDiff((*rawDataFrames[1 - offset])[i - offset + 4][j + 3], (*rawDataFrames[3 - offset])[i + offset + 3][j + 4], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion)
- });
+ greenDifMax[lastIndex] = std::max({greenDiff((*rawDataFrames[1 - offset])[i - offset - 2][j + 3], (*rawDataFrames[3 - offset])[i + offset - 3][j + 4], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[0 + offset])[i + offset - 2][j + 3], (*rawDataFrames[2 + offset])[i - offset - 1][j + 4], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[1 - offset])[i - offset][j + 3], (*rawDataFrames[3 - offset])[i + offset - 1][j + 4], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[0 + offset])[i + offset][j + 3], (*rawDataFrames[2 + offset])[i - offset + 1][j + 4], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[1 - offset])[i - offset + 2][j + 3], (*rawDataFrames[3 - offset])[i + offset + 1][j + 4], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[0 + offset])[i + offset + 2][j + 3], (*rawDataFrames[2 + offset])[i - offset + 3][j + 4], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff((*rawDataFrames[1 - offset])[i - offset + 4][j + 3], (*rawDataFrames[3 - offset])[i + offset + 3][j + 4], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i)
+ });
gridMax = std::max({greenDifMax[0], greenDifMax[1], greenDifMax[2], greenDifMax[3], greenDifMax[4], greenDifMax[5], greenDifMax[6]});
}
@@ -528,29 +693,102 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, bool det
float ngCentre = (*rawDataFrames[(offset << 1) + offset])[i][j + offset];
float ngRight = (*rawDataFrames[((offset ^ 1) << 1) + (offset ^ 1)])[i][j + (offset ^ 1) + 1];
float ngLeft = (*rawDataFrames[((offset ^ 1) << 1) + (offset ^ 1)])[i][j + (offset ^ 1) - 1];
- float ngTop = (*rawDataFrames[((offset << 1) + offset) ^ 1])[i][j + offset];
- float ngBottom = (*rawDataFrames[((offset << 1) + offset) ^ 1])[i + 2][j + offset];
- float diff = nonGreenDiffCross(ngRight, ngLeft, ngTop, ngBottom, ngCentre, stddevFactorNonGreen0, eperIsoNonGreen0, nRead, prnu, showMotion);
+ float diffRight = ngRight - ngCentre;
+ float diffLeft = ngLeft - ngCentre;
+ float diffHorNg0 = -1.f;
- if(diff > 0.f) {
- paintMotionMask(j + offsX, showMotion, diff, showOnlyMask, nonGreenDest0, nonGreenDest1, greenDest);
- continue;
+ if(diffRight * diffLeft >= 0.f) {
+ float avg = (ngRight + ngLeft) / 2.f;
+ diffHorNg0 = nonGreenDiff(ngCentre, avg, stddevFactorNonGreen0, eperIsoNonGreen0, nRead, prnu, showMotion);
+
+// if(diff > 0.f) {
+// paintMotionMask(j + offsX, showMotion, diff, showOnlyMask, nonGreenDest0, nonGreenDest1, greenDest);
+// continue;
+// }
}
+ float diffHorNg1 = -1.f;
ngCentre = (*rawDataFrames[2 - offset])[i + 1][j - offset + 1];
ngRight = (*rawDataFrames[2 - (offset ^ 1)])[i + 1][j - (offset ^ 1) + 2];
ngLeft = (*rawDataFrames[2 - (offset ^ 1)])[i + 1][j - (offset ^ 1)];
- ngTop = (*rawDataFrames[3 - ((offset << 1) + offset)])[i - 1][j - offset + 1];
- ngBottom = (*rawDataFrames[3 - ((offset << 1) + offset)])[i + 1][j - offset + 1];
- diff = nonGreenDiffCross(ngRight, ngLeft, ngTop, ngBottom, ngCentre, stddevFactorNonGreen2, eperIsoNonGreen2, nRead, prnu, showMotion);
+ diffRight = ngRight - ngCentre;
+ diffLeft = ngLeft - ngCentre;
- if(diff > 0.f) {
- paintMotionMask(j + offsX, showMotion, diff, showOnlyMask, nonGreenDest1, nonGreenDest0, greenDest);
- continue;
+ if(diffRight * diffLeft >= 0.f) {
+ float avg = (ngRight + ngLeft) / 2.f;
+ float diffHorNg1 = nonGreenDiff(ngCentre, avg, stddevFactorNonGreen2, eperIsoNonGreen2, nRead, prnu, showMotion);
+
+// if(diff > 0.f) {
+// paintMotionMask(j + offsX, showMotion, diff, showOnlyMask, nonGreenDest1, nonGreenDest0, greenDest);
+// continue;
+// }
}
+
+ if( diffHorNg0 * diffHorNg1 < 0.f) {
+ paintMotionMask(j + offsX, showMotion, 1.f, showOnlyMask, nonGreenDest0, nonGreenDest1, greenDest);
+ continue;
+
+ }
+
+// bool motion = false;
+// float ngCentre = (*rawDataFrames[(offset << 1) + offset])[i][j + offset];
+// float ngRight = (*rawDataFrames[((offset ^ 1) << 1) + (offset ^ 1)])[i][j + (offset ^ 1) + 1];
+// float ngLeft = (*rawDataFrames[((offset ^ 1) << 1) + (offset ^ 1)])[i][j + (offset ^ 1) - 1];
+// float ngTop = (*rawDataFrames[((offset << 1) + offset) ^ 1])[i][j + offset];
+// float ngBottom = (*rawDataFrames[((offset << 1) + offset) ^ 1])[i + 2][j + offset];
+// float diff = nonGreenDiffCross(ngRight, ngLeft, ngTop, ngBottom, ngCentre, stddevFactorNonGreen0, eperIsoNonGreen0, nRead, prnu, showMotion);
+//
+// if(diff > 0.f) {
+// motion = true;
+// paintMotionMask(j + offsX, showMotion, diff, showOnlyMask, nonGreenDest0, nonGreenDest1, greenDest);
+// continue;
+// }
+//
+// ngCentre = (*rawDataFrames[2 - offset])[i + 1][j - offset + 1];
+// ngRight = (*rawDataFrames[2 - (offset ^ 1)])[i + 1][j - (offset ^ 1) + 2];
+// ngLeft = (*rawDataFrames[2 - (offset ^ 1)])[i + 1][j - (offset ^ 1)];
+// ngTop = (*rawDataFrames[3 - ((offset << 1) + offset)])[i - 1][j - offset + 1];
+// ngBottom = (*rawDataFrames[3 - ((offset << 1) + offset)])[i + 1][j - offset + 1];
+// diff = nonGreenDiffCross(ngRight, ngLeft, ngTop, ngBottom, ngCentre, stddevFactorNonGreen2, eperIsoNonGreen2, nRead, prnu, showMotion);
+//
+//// if(diff > 0.f) {
+// if((diff > 0.f && !motion) || (diff <= 0.f && motion) ) {
+// paintMotionMask(j + offsX, showMotion, diff, showOnlyMask, nonGreenDest1, nonGreenDest0, greenDest);
+// continue;
+// }
}
if(adaptive && checkNonGreenHorizontal) {
+// float lg = ((*rawDataFrames[1 - (offset^1)])[i - (offset^1) + 1][j - 1] + (*rawDataFrames[3 - (offset^1)])[i + (offset^1)][j]) / 2.f;
+// float cg = ((*rawDataFrames[1 - offset])[i - offset + 1][j] + (*rawDataFrames[3 - offset])[i + offset][j + 1]) / 2.f;
+// float rg = ((*rawDataFrames[1 - (offset^1)])[i - (offset^1) + 1][j + 1] + (*rawDataFrames[3 - (offset^1)])[i + (offset^1)][j + 2]) / 2.f;
+//
+// float lr = (*rawDataFrames[((offset^1) << 1) + (offset^1)])[i][j + (offset^1) - 1];
+// float cr = (*rawDataFrames[(offset << 1) + offset])[i][j + offset];
+// float rr = (*rawDataFrames[((offset^1) << 1) + (offset^1)])[i][j + (offset^1) + 1];
+//
+// float lb = (*rawDataFrames[2 - (offset^1)])[i + 1][j - (offset^1)];
+// float cb = (*rawDataFrames[2 - offset])[i + 1][j - offset + 1];
+// float rb = (*rawDataFrames[2 - (offset^1)])[i + 1][j - (offset^1) + 2];
+//
+// if(blueRow) {
+// std::swap(lr, lb);
+// std::swap(cr, cb);
+// std::swap(rr, rb);
+// }
+//
+// float lh = Color::rgb2h(lr, lg, lb);
+// float ch = Color::rgb2h(cr, cg, cb);
+// float rh = Color::rgb2h(rr, rg, rb);
+//
+// float lHueDiff = lh - ch;
+// float rHueDiff = rh - ch;
+// if(lHueDiff * rHueDiff > 0.f) {
+// if(std::fabs(lHueDiff) > 0.5f && std::fabs(rHueDiff) > 0.5f/* && std::fabs(lHueDiff) < 3.f && std::fabs(rHueDiff) < 3.f*/) {
+// paintMotionMask(j + offsX, showMotion, 1.f, showOnlyMask, nonGreenDest0, nonGreenDest1, greenDest);
+// continue;
+// }
+// }
float ngCentre = (*rawDataFrames[(offset << 1) + offset])[i][j + offset];
float ngRight = (*rawDataFrames[((offset ^ 1) << 1) + (offset ^ 1)])[i][j + (offset ^ 1) + 1];
float ngLeft = (*rawDataFrames[((offset ^ 1) << 1) + (offset ^ 1)])[i][j + (offset ^ 1) - 1];
@@ -637,3 +875,764 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, bool det
plistener->setProgress(1.0);
}
}
+#else
+void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RAWParams::BayerSensor &bayerParams, unsigned int frame, const std::string &model, float rawWpCorrection)
+{
+
+ BENCHFUN
+
+ const bool detectMotion = bayerParams.pixelShiftMotion > 0;
+ const int motion = bayerParams.pixelShiftMotion;
+ const bool showMotion = bayerParams.pixelshiftShowMotion;
+ const bool showOnlyMask = bayerParams.pixelshiftShowMotionMaskOnly;
+ const RAWParams::BayerSensor::ePSMotionCorrection gridSize_ = bayerParams.pixelShiftMotionCorrection;
+ const bool adaptive = bayerParams.pixelShiftAutomatic;
+ float stddevFactorGreen = bayerParams.pixelShiftStddevFactorGreen;
+ float stddevFactorRed = bayerParams.pixelShiftStddevFactorRed;
+ float stddevFactorBlue = bayerParams.pixelShiftStddevFactorBlue;
+ float eperIso = bayerParams.pixelShiftEperIso;
+ float nreadIso = bayerParams.pixelShiftNreadIso;
+ float prnu = bayerParams.pixelShiftPrnu;
+ const bool checkNonGreenHorizontal = bayerParams.pixelShiftNonGreenHorizontal;
+ const bool checkNonGreenVertical = bayerParams.pixelShiftNonGreenVertical;
+ const bool checkNonGreenCross = bayerParams.pixelShiftNonGreenCross;
+ const bool checkNonGreenAmaze = bayerParams.pixelShiftNonGreenAmaze;
+ const bool checkNonGreenCross2 = bayerParams.pixelShiftNonGreenCross2;
+ const bool checkGreen = bayerParams.pixelShiftGreen;
+ const float redBlueWeight = bayerParams.pixelShiftRedBlueWeight;
+ const bool blurMap = bayerParams.pixelShiftBlur;
+ const float sigma = bayerParams.pixelShiftSigma;
+ const float threshold = bayerParams.pixelShiftSum;
+ const bool experimental0 = bayerParams.pixelShiftExp0;
+ const bool holeFill = bayerParams.pixelShiftHoleFill;
+
+ static const float nReadK3II[] = { 3.4f, // ISO 100
+ 3.1f, // ISO 125
+ 2.5f, // ISO 160
+ 2.5f, // ISO 200
+ 2.5f, // ISO 250
+ 2.5f, // ISO 320
+ 2.3f, // ISO 400
+ 2.5f, // ISO 500
+ 2.3f, // ISO 640
+ 2.3f, // ISO 800
+ 2.4f, // ISO 1000
+ 2.3f, // ISO 1250
+ 1.75f, // ISO 1600
+ 1.75f, // ISO 2000
+ 1.75f, // ISO 2500
+ 1.75f, // ISO 3200
+ 1.75f, // ISO 4000
+ 1.75f, // ISO 5000
+ 1.75f, // ISO 6400
+ 1.75f, // ISO 8000
+ 1.75f, // ISO 10000
+ 1.5f, // ISO 12800
+ 1.5f, // ISO 16000
+ 1.5f, // ISO 20000
+ 1.5f, // ISO 25600
+ 1.5f, // ISO 32000
+ 1.5f, // ISO 40000
+ 1.5f, // ISO 51200
+ 1.5f // ISO > 51200 (we get a max ISO value of 65535 from dcraw)
+ };
+
+ static const float ePerIsoK3II = 4 * 0.35f;
+
+ static const float nReadK1[] = { 3.45f, // ISO 100
+ 3.15f, // ISO 125
+ 3.45f, // ISO 160
+ 3.0f, // ISO 200
+ 3.0f, // ISO 250
+ 3.0f, // ISO 320
+ 2.7f, // ISO 400
+ 2.7f, // ISO 500
+ 2.7f, // ISO 640
+ 2.5f, // ISO 800
+ 2.5f, // ISO 1000
+ 2.5f, // ISO 1250
+ 2.4f, // ISO 1600
+ 2.4f, // ISO 2000
+ 2.4f, // ISO 2500
+ 2.4f, // ISO 3200
+ 2.4f, // ISO 4000
+ 2.4f, // ISO 5000
+ 2.4f, // ISO 6400
+ 2.4f, // ISO 8000
+ 2.4f, // ISO 10000
+ 2.4f, // ISO 12800
+ 2.4f, // ISO 16000
+ 2.4f, // ISO 20000
+ 2.4f, // ISO 25600
+ 2.4f, // ISO 32000
+ 2.4f, // ISO 40000
+ 2.4f, // ISO 51200
+ 2.4f, // ISO 64000
+ 2.4f, // ISO 80000
+ 2.4f, // ISO 102400
+ 2.4f, // ISO 128000
+ 2.4f, // ISO 160000
+ 2.4f // ISO 204800
+ };
+
+ static const float ePerIsoK1 = 4 * 0.75f;
+
+ static const float nReadK70[] = { 4.0f, // ISO 100
+ 4.0f, // ISO 125
+ 4.0f, // ISO 160
+ 4.0f, // ISO 200
+ 4.0f, // ISO 250
+ 4.0f, // ISO 320
+ 4.0f, // ISO 400
+ 4.0f, // ISO 500
+ 4.0f, // ISO 640
+ 3.0f, // ISO 800
+ 3.0f, // ISO 1000
+ 3.0f, // ISO 1250
+ 3.0f, // ISO 1600
+ 3.0f, // ISO 2000
+ 3.0f, // ISO 2500
+ 3.0f, // ISO 3200
+ 3.0f, // ISO 4000
+ 3.0f, // ISO 5000
+ 3.0f, // ISO 6400
+ 3.0f, // ISO 8000
+ 3.0f, // ISO 10000
+ 3.0f, // ISO 12800
+ 3.0f, // ISO 16000
+ 3.0f, // ISO 20000
+ 3.0f, // ISO 25600
+ 3.0f, // ISO 32000
+ 3.0f, // ISO 40000
+ 3.0f, // ISO 51200
+ 3.0f // ISO > 51200 (we get a max ISO value of 65535 from dcraw)
+ };
+
+ static const float ePerIsoK70 = 4 * 0.5f;
+
+ if (plistener) {
+ plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::pixelshift]));
+ plistener->setProgress(0.0);
+ }
+
+
+ const bool skip = (gridSize_ == RAWParams::BayerSensor::ePSMotionCorrection::Grid1x2);
+ int gridSize = 1;
+ bool nOf3x3 = false;
+
+ switch (gridSize_) {
+ case RAWParams::BayerSensor::ePSMotionCorrection::Grid1x1:
+ case RAWParams::BayerSensor::ePSMotionCorrection::Grid1x2:
+ gridSize = 1;
+ break;
+
+ case RAWParams::BayerSensor::ePSMotionCorrection::Grid3x3:
+ gridSize = 3;
+ break;
+
+ case RAWParams::BayerSensor::ePSMotionCorrection::Grid5x5:
+ gridSize = 5;
+ break;
+
+ case RAWParams::BayerSensor::ePSMotionCorrection::Grid7x7:
+ gridSize = 7;
+ break;
+
+ case RAWParams::BayerSensor::ePSMotionCorrection::Grid3x3New:
+ gridSize = 1;
+ nOf3x3 = true;
+ }
+
+ // Lookup table for non adaptive (slider) mode
+ LUTf log2Lut(32768, LUT_CLIP_BELOW | LUT_CLIP_ABOVE);
+
+ if(detectMotion && !adaptive) {
+ const float lutStrength = 2.f;
+ log2Lut[0] = 0;
+
+ for(int i = 2; i < 65536; i += 2) {
+ log2Lut[i >> 1] = lutStrength * log2(i) / 100.f;
+ }
+ }
+
+ const float scaleGreen = 1.f / scale_mul[1];
+
+ float nRead;
+ float eperIsoModel;
+
+ int nReadIndex = static_cast(round(log2(idata->getISOSpeed() / 100.f) * 3.f));
+
+ if(model.find("K-3") != string::npos) {
+ nRead = nReadK3II[nReadIndex];
+ eperIsoModel = ePerIsoK3II;
+ } else if(model.find("K-1") != string::npos) {
+ nRead = nReadK1[nReadIndex];
+ eperIsoModel = ePerIsoK1;
+ } else {
+ nRead = nReadK70[nReadIndex];
+ eperIsoModel = ePerIsoK70;
+ }
+
+ nRead *= pow(2.f, nreadIso);
+ eperIsoModel *= pow(2.f, eperIso);
+ eperIso = eperIsoModel * (100.f / (rawWpCorrection * idata->getISOSpeed()));
+
+ float eperIsoRed = eperIso / scale_mul[0];
+ float eperIsoGreen = eperIso * scaleGreen;
+ float eperIsoBlue = eperIso / scale_mul[2];
+
+// printf("Pixelshift parameters : gridSize %d\tadaptive %d\tstdDevFactorGreen %f\telectrons %1.8f\tnread %f\tprnu %1.1f%%\n", gridSize, adaptive, stddevFactorGreen, eperIso, nRead, prnu);
+
+ prnu /= 100.f;
+ stddevFactorGreen *= stddevFactorGreen;
+ stddevFactorRed *= stddevFactorRed;
+ stddevFactorBlue *= stddevFactorBlue;
+
+
+ nRead *= nRead;
+
+ // If the values of two corresponding green pixels differ my more then motionThreshold %, the pixel will be treated as a badGreen pixel
+ float motionThreshold = 1.f - (motion / 100.f);
+ // For shades of green motion indicators
+ const float blendFactor = ((adaptive || motion == 0.f) ? 1.f : 1.f / (1.f - motionThreshold));
+
+ unsigned int offsX = 0, offsY = 0;
+
+ if(!bayerParams.pixelShiftMedian || !adaptive) {
+ // We have to adjust the offsets for the selected subframe we use for areas with motion
+ switch (frame) {
+ case 0:
+ offsX = offsY = 0;
+ break;
+
+ case 1:
+ offsX = 0;
+ offsY = 1;
+ break;
+
+ case 2:
+ offsX = offsY = 1;
+ break;
+
+ case 3:
+ offsX = 1;
+ offsY = 0;
+ }
+ }
+
+ const float thresh = adaptive ? 0.f : motionThreshold;
+ array2D psRed(winw + 32, winh); // increase width to avoid cache conflicts
+ array2D psG1(winw + 32, winh);
+ array2D psG2(winw + 32, winh);
+ array2D psBlue(winw + 32, winh);
+
+ array2D psMask(winw, winh, ARRAY2D_CLEAR_DATA);
+// fill channels psRed, psG1, psG2 and psBlue
+#ifdef _OPENMP
+ #pragma omp parallel for schedule(dynamic,16)
+#endif
+
+ for(int i = winy + 1; i < winh - 1; ++i) {
+ float *greenDest1 = psG1[i];
+ float *greenDest2 = psG2[i];
+ float *nonGreenDest0 = psRed[i];
+ float *nonGreenDest1 = psBlue[i];
+ int j = winx + 1;
+ int c = FC(i, j);
+
+ if (c == 2 || ((c & 1) && FC(i, j + 1) == 2)) {
+ // row with blue pixels => swap destination pointers for non green pixels
+ std::swap(nonGreenDest0, nonGreenDest1);
+ std::swap(greenDest1, greenDest2);
+ }
+
+ // offset to keep the code short. It changes its value between 0 and 1 for each iteration of the loop
+ unsigned int offset = (c & 1);
+ offset ^= 1; // 0 => 1 or 1 => 0
+
+ for(; j < winw - 1; ++j) {
+ offset ^= 1; // 0 => 1 or 1 => 0
+
+ // store the values from the 4 frames into 4 different temporary planes
+ greenDest1[j] = (*rawDataFrames[1 - offset])[i - offset + 1][j];
+ greenDest2[j] = (*rawDataFrames[3 - offset])[i + offset][j + 1];
+ nonGreenDest0[j] = (*rawDataFrames[(offset << 1) + offset])[i][j + offset];
+ nonGreenDest1[j] = (*rawDataFrames[2 - offset])[i + 1][j - offset + 1];
+ }
+ }
+
+// now that the temporary planes are filled for easy access we do the motion detection
+
+#ifdef _OPENMP
+ #pragma omp parallel for schedule(dynamic,16)
+#endif
+
+ for(int i = winy + border - offsY; i < winh - (border + offsY); ++i) {
+ float *greenDest = green[i + offsY];
+ float *redDest = red[i + offsY];
+ float *blueDest = blue[i + offsY];
+ int j = winx + border - offsX;
+
+ float greenDifMax[gridSize]; // Here we store the maximum differences per Column
+
+ // green channel motion detection checks the grid around the pixel for differences in green channels
+ if(detectMotion || (adaptive && checkGreen)) {
+ if(gridSize == 3) {
+ // compute maximum of differences for first two columns of 3x3 grid
+ greenDifMax[0] = std::max({greenDiff(psG1[i - 1][j - 1], psG2[i - 1][j - 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[ i ][j - 1], psG2[ i ][j - 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[i + 1][j - 1], psG2[i + 1][j - 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i)
+ });
+ greenDifMax[1] = std::max({greenDiff(psG1[i - 1][ j ], psG2[i - 1][ j ], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[ i ][ j ], psG2[ i ][ j ], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[i + 1][ j ], psG2[i + 1][ j ], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i)
+ });
+ } else if(gridSize == 5) {
+ // compute maximum of differences for first four columns of 5x5 grid
+ greenDifMax[0] = std::max({greenDiff(psG1[i - 2][j - 2], psG2[i - 2][j - 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[i - 1][j - 2], psG2[i - 1][j - 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[ i ][j - 2], psG2[ i ][j - 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[i + 1][j - 2], psG2[i + 1][j - 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[i + 2][j - 2], psG2[i + 2][j - 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i)
+ });
+ greenDifMax[1] = std::max({greenDiff(psG1[i - 2][j - 1], psG2[i - 2][j - 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[i - 1][j - 1], psG2[i - 1][j - 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[ i ][j - 1], psG2[ i ][j - 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[i + 1][j - 1], psG2[i + 1][j - 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[i + 2][j - 1], psG2[i + 2][j - 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i)
+ });
+ greenDifMax[2] = std::max({greenDiff(psG1[i - 2][ j ], psG2[i - 2][ j ], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[i - 1][ j ], psG2[i - 1][ j ], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[ i ][ j ], psG2[ i ][ j ], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[i + 1][ j ], psG2[i + 1][ j ], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[i + 2][ j ], psG2[i + 2][ j ], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i)
+ });
+ greenDifMax[3] = std::max({greenDiff(psG1[i - 2][j + 1], psG2[i - 2][j + 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[i - 1][j + 1], psG2[i - 1][j + 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[ i ][j + 1], psG2[ i ][j + 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[i + 1][j + 1], psG2[i + 1][j + 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[i + 2][j + 1], psG2[i + 2][j + 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i)
+ });
+ } else if(gridSize == 7) {
+ // compute maximum of differences for first six columns of 7x7 grid
+ greenDifMax[0] = std::max({greenDiff(psG1[i - 3][j - 3], psG2[i - 3][j - 3], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[i - 2][j - 3], psG2[i - 2][j - 3], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[i - 1][j - 3], psG2[i - 1][j - 3], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[ i ][j - 3], psG2[ i ][j - 3], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[i + 1][j - 3], psG2[i + 1][j - 3], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[i + 2][j - 3], psG2[i + 2][j - 3], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[i + 3][j - 3], psG2[i + 3][j - 3], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i)
+ });
+ greenDifMax[1] = std::max({greenDiff(psG1[i - 3][j - 2], psG2[i - 3][j - 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[i - 2][j - 2], psG2[i - 2][j - 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[i - 1][j - 2], psG2[i - 1][j - 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[ i ][j - 2], psG2[ i ][j - 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[i + 1][j - 2], psG2[i + 1][j - 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[i + 2][j - 2], psG2[i + 2][j - 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[i + 3][j - 2], psG2[i + 3][j - 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i)
+ });
+ greenDifMax[2] = std::max({greenDiff(psG1[i - 3][j - 1], psG2[i - 3][j - 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[i - 2][j - 1], psG2[i - 2][j - 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[i - 1][j - 1], psG2[i - 1][j - 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[ i ][j - 1], psG2[ i ][j - 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[i + 1][j - 1], psG2[i + 1][j - 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[i + 2][j - 1], psG2[i + 2][j - 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[i + 3][j - 1], psG2[i + 3][j - 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i)
+ });
+ greenDifMax[3] = std::max({greenDiff(psG1[i - 3][ j ], psG2[i - 3][ j ], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[i - 2][ j ], psG2[i - 2][ j ], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[i - 1][ j ], psG2[i - 1][ j ], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[ i ][ j ], psG2[ i ][ j ], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[i + 1][ j ], psG2[i + 1][ j ], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[i + 2][ j ], psG2[i + 2][ j ], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[i + 3][ j ], psG2[i + 3][ j ], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i)
+ });
+ greenDifMax[4] = std::max({greenDiff(psG1[i - 3][j + 1], psG2[i - 3][j + 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[i - 2][j + 1], psG2[i - 2][j + 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[i - 1][j + 1], psG2[i - 1][j + 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[ i ][j + 1], psG2[ i ][j + 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[i + 1][j + 1], psG2[i + 1][j + 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[i + 2][j + 1], psG2[i + 2][j + 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[i + 3][j + 1], psG2[i + 3][j + 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i)
+ });
+ greenDifMax[5] = std::max({greenDiff(psG1[i - 3][j + 2], psG2[i - 3][j + 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[i - 2][j + 2], psG2[i - 2][j + 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[i - 1][j + 2], psG2[i - 1][j + 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[ i ][j + 2], psG2[ i ][j + 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[i + 1][j + 2], psG2[i + 1][j + 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[i + 2][j + 2], psG2[i + 2][j + 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[i + 3][j + 2], psG2[i + 3][j + 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i)
+ });
+ }
+
+ }
+
+
+ // this is the index for the last column of the grid. Obviously we have to start with gridSize - 1
+ int lastIndex = gridSize - 1;
+ float korr = 0.f;
+ int c = FC(i, j);
+ bool blueRow = false;
+
+ if (c == 2 || ((c & 1) && FC(i, j + 1) == 2)) {
+ // row with blue pixels => swap destination pointers for non green pixels
+ blueRow = true;
+ }
+
+ // offset to keep the code short. It changes its value between 0 and 1 for each iteration of the loop
+ unsigned int offset = (c & 1);
+// offset ^= 1; // 0 => 1 or 1 => 0
+
+ for(; j < winw - (border + offsX); ++j) {
+ bool greenFromPs = false;
+ offset ^= 1; // 0 => 1 or 1 => 0
+
+ if(detectMotion || (adaptive && checkGreen)) {
+ bool skipNext = false;
+ float gridMax;
+
+ if(gridSize < 2) {
+ // compute difference for current pixel and skip next pixel, that's roughly the method from dcrawps
+ gridMax = greenDiff(psG1[i][j], psG2[i][j], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i);
+ skipNext = skip;
+ } else if(gridSize == 3) {
+ // compute maximum of differences for third column of 3x3 grid and save at position lastIndex
+ greenDifMax[lastIndex] = std::max({greenDiff(psG1[i - 1][j + 1], psG2[i - 1][j + 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[ i ][j + 1], psG2[ i ][j + 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[i + 1][j + 1], psG2[i + 1][j + 1], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i)
+ });
+ // calculate maximum of whole grid by calculating maximum of grid column max values
+ gridMax = std::max({greenDifMax[0], greenDifMax[1], greenDifMax[2]});
+ } else if(gridSize == 5) {
+ // compute maximum of differences for fifth column of 5x5 grid and save at position lastIndex
+ greenDifMax[lastIndex] = std::max({greenDiff(psG1[i - 2][j + 2], psG2[i - 2][j + 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[i - 1][j + 2], psG2[i - 1][j + 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[ i ][j + 2], psG2[ i ][j + 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[i + 1][j + 2], psG2[i + 1][j + 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[i + 2][j + 2], psG2[i + 2][j + 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i)
+ });
+ // calculate maximum of whole grid by calculating maximum of grid column max values
+ gridMax = std::max({greenDifMax[0], greenDifMax[1], greenDifMax[2], greenDifMax[3], greenDifMax[4]});
+ } else if(gridSize == 7) {
+ // compute maximum of differences for 7th column of 7x7 grid and save at position lastIndex
+ greenDifMax[lastIndex] = std::max({greenDiff(psG1[i - 3][j + 3], psG2[i - 3][j + 3], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[i - 2][j + 3], psG2[i - 2][j + 3], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[i - 1][j + 3], psG2[i - 1][j + 3], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[ i ][j + 3], psG2[ i ][j + 3], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[i + 1][j + 3], psG2[i + 1][j + 3], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[i + 2][j + 3], psG2[i + 2][j + 3], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ greenDiff(psG1[i + 3][j + 3], psG2[i + 3][j + 3], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
+ });
+ // calculate maximum of whole grid by calculating maximum of grid column max values
+ gridMax = std::max({greenDifMax[0], greenDifMax[1], greenDifMax[2], greenDifMax[3], greenDifMax[4], greenDifMax[5], greenDifMax[6]});
+ }
+
+
+ // adjust index for next column
+ lastIndex ++;
+ lastIndex = lastIndex == gridSize ? 0 : lastIndex;
+
+ // increase motion detection dependent on brightness
+ if(!adaptive) {
+ korr = log2Lut[((int)(psG1[i][j] * scaleGreen)) >> 1];
+ }
+
+ if (gridMax > thresh - korr) {
+ if(nOf3x3) {
+ psMask[i][j] = 1.f;
+ } else if((offset == (frame & 1)) && checkNonGreenVertical) {
+ if(frame > 1) {
+ green[i + offsY][j + offsX] = blueRow ? psG1[i][j] : psG2[i][j];
+ } else {
+ green[i + offsY][j + offsX] = blueRow ? psG2[i][j] : psG1[i][j];;
+ }
+
+ continue;
+ } else {
+ // at least one of the tested green pixels of the grid is detected as motion
+ paintMotionMask(j + offsX, showMotion, (gridMax - thresh + korr) * blendFactor, showOnlyMask, greenDest, redDest, blueDest);
+
+ if(skipNext) {
+ // treat the horizontally next pixel also as motion
+ j++;
+ paintMotionMask(j + offsX, showMotion, (gridMax - thresh + korr) * blendFactor, showOnlyMask, greenDest, redDest, blueDest);
+ }
+
+ // do not set the motion pixel values. They have already been set by demosaicer or showMotion
+ continue;
+ }
+ }
+ }
+
+ if(adaptive && checkNonGreenCross) {
+ // check red cross
+ float redTop = psRed[i - 1][ j ];
+ float redLeft = psRed[ i ][j - 1];
+ float redCentre = psRed[ i ][ j ];
+ float redRight = psRed[ i ][j + 1];
+ float redBottom = psRed[i + 1][ j ];
+ float redDiff = nonGreenDiffCross(redRight, redLeft, redTop, redBottom, redCentre, stddevFactorRed, eperIsoRed, nRead, prnu, showMotion);
+
+ if(redDiff > 0.f) {
+ if(nOf3x3) {
+ psMask[i][j] = redBlueWeight;
+ } else {
+ paintMotionMask(j + offsX, showMotion, redDiff, showOnlyMask, redDest, blueDest, greenDest);
+ }
+
+ continue;
+ }
+
+ // check blue cross
+ float blueTop = psBlue[i - 1][ j ];
+ float blueLeft = psBlue[ i ][j - 1];
+ float blueCentre = psBlue[ i ][ j ];
+ float blueRight = psBlue[ i ][j + 1];
+ float blueBottom = psBlue[i + 1][ j ];
+ float blueDiff = nonGreenDiffCross(blueRight, blueLeft, blueTop, blueBottom, blueCentre, stddevFactorBlue, eperIsoBlue, nRead, prnu, showMotion);
+
+ if(blueDiff > 0.f) {
+ if(nOf3x3) {
+ psMask[i][j] = redBlueWeight;
+ } else {
+ paintMotionMask(j + offsX, showMotion, blueDiff, showOnlyMask, blueDest, redDest, greenDest);
+ }
+
+ continue;
+
+ }
+ }
+
+ if(adaptive && checkNonGreenHorizontal) {
+ float redLeft = psRed[ i ][j - 1];
+ float redCentre = psRed[ i ][ j ];
+ float redRight = psRed[ i ][j + 1];
+
+ float redDiffLeft = redLeft - redCentre;
+ float redDiffRight = redRight - redCentre;
+
+ if(redDiffLeft * redDiffRight >= 0.f) {
+ float redAvg = (redRight + redLeft) / 2.f;
+ float redDiffHor = nonGreenDiff(redCentre, redAvg, stddevFactorRed, eperIsoRed, nRead, prnu, showMotion);
+
+ if(redDiffHor > 0.f) {
+ if(nOf3x3) {
+ psMask[i][j] = redBlueWeight;
+ } else {
+ paintMotionMask(j + offsX, showMotion, redDiffHor, showOnlyMask, redDest, blueDest, greenDest);
+ }
+
+ continue;
+ }
+ }
+
+ float blueLeft = psBlue[ i ][j - 1];
+ float blueCentre = psBlue[ i ][ j ];
+ float blueRight = psBlue[ i ][j + 1];
+
+ float blueDiffLeft = blueLeft - blueCentre;
+ float blueDiffRight = blueRight - blueCentre;
+
+ if(blueDiffLeft * blueDiffRight >= 0.f) {
+ float blueAvg = (blueRight + blueLeft) / 2.f;
+ float blueDiffHor = nonGreenDiff(blueCentre, blueAvg, stddevFactorBlue, eperIsoBlue, nRead, prnu, showMotion);
+
+ if(blueDiffHor > 0.f) {
+ if(nOf3x3) {
+ psMask[i][j] = redBlueWeight;
+ } else {
+ paintMotionMask(j + offsX, showMotion, blueDiffHor, showOnlyMask, blueDest, redDest, greenDest);
+ }
+
+ continue;
+ }
+ }
+ }
+
+ if(adaptive && checkNonGreenVertical) {
+ // check red vertically
+ float redTop = psRed[i - 1][ j ];
+ float redCentre = psRed[ i ][ j ];
+ float redBottom = psRed[i + 1][ j ];
+
+ float redDiffTop = redTop - redCentre;
+ float redDiffBottom = redBottom - redCentre;
+
+ if(redDiffTop * redDiffBottom >= 0.f) {
+ float redAvg = (redTop + redBottom) / 2.f;
+ float redDiff = nonGreenDiff(redCentre, redAvg, stddevFactorRed, eperIsoRed, nRead, prnu, showMotion);
+
+ if(redDiff > 0.f) {
+ if(nOf3x3) {
+ psMask[i][j] = redBlueWeight;
+ } else {
+ paintMotionMask(j + offsX, showMotion, redDiff, showOnlyMask, redDest, blueDest, greenDest);
+ }
+
+ continue;
+ }
+ }
+
+ // check blue vertically
+ float blueTop = psBlue[i - 1][ j ];
+ float blueCentre = psBlue[ i ][ j ];
+ float blueBottom = psBlue[i + 1][ j ];
+
+ float blueDiffTop = blueTop - blueCentre;
+ float blueDiffBottom = blueBottom - blueCentre;
+
+ if(blueDiffTop * blueDiffBottom >= 0.f) {
+ float blueAvg = (blueTop + blueBottom) / 2.f;
+ float blueDiff = nonGreenDiff(blueCentre, blueAvg, stddevFactorBlue, eperIsoBlue, nRead, prnu, showMotion);
+
+ if(blueDiff > 0.f) {
+ if(nOf3x3) {
+ psMask[i][j] = redBlueWeight;
+ } else {
+ paintMotionMask(j + offsX, showMotion, blueDiff, showOnlyMask, blueDest, redDest, greenDest);
+ }
+
+ continue;
+ }
+ }
+ }
+
+ if(adaptive && checkNonGreenAmaze) {
+ // check current pixel against amaze
+ float redCentre = psRed[ i ][ j ];
+ float redAmaze = red[i + offsY][j + offsX];
+
+ float redDiffAmaze = nonGreenDiff(redCentre, redAmaze, stddevFactorRed, eperIsoRed, nRead, prnu, showMotion);
+
+ if(redDiffAmaze > 0.f) {
+ if(nOf3x3) {
+ psMask[i][j] = redBlueWeight;
+ } else {
+ paintMotionMask(j + offsX, showMotion, redDiffAmaze, showOnlyMask, redDest, blueDest, greenDest);
+ }
+
+ continue;
+ }
+
+ float blueCentre = psBlue[ i ][ j ];
+ float blueAmaze = blue[i + offsY][j + offsX];
+
+ float blueDiffAmaze = nonGreenDiff(blueCentre, blueAmaze, stddevFactorBlue, eperIsoBlue, nRead, prnu, showMotion);
+
+ if(blueDiffAmaze > 0.f) {
+ if(nOf3x3) {
+ psMask[i][j] = redBlueWeight;
+ } else {
+ paintMotionMask(j + offsX, showMotion, blueDiffAmaze, showOnlyMask, blueDest, redDest, greenDest);
+ }
+
+ continue;
+ }
+ }
+
+ if(adaptive && checkNonGreenCross2) { // for green amaze
+ float greenCentre = (psG1[ i ][ j ] + psG2[ i ][ j ]) / 2.f;
+ float greenAmaze = green[i + offsY][j + offsX];
+ float greenDiffAmaze = nonGreenDiff(greenCentre, greenAmaze, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion);
+
+ if(greenDiffAmaze > 0.f) {
+ if(nOf3x3) {
+ psMask[i][j] = 1.f;
+ } else {
+ paintMotionMask(j + offsX, showMotion, greenDiffAmaze, showOnlyMask, greenDest, redDest, blueDest);
+ }
+
+ continue;
+ }
+ }
+
+ if(adaptive && experimental0) { // for experiments
+
+ }
+
+ if(showMotion && showOnlyMask) { // we want only motion mask => paint areas without motion in pure black
+ red[i + offsY][j + offsX] = green[i + offsY][j + offsX] = blue[i + offsY][j + offsX] = 0.f;
+ } else if(!(adaptive && nOf3x3)) {
+ // no motion detected, replace the a priori demosaiced values by the pixelshift combined values
+ red[i + offsY][j + offsX] = psRed[i][j];
+ green[i + offsY][j + offsX] = (psG1[i][j] + psG2[i][j]) / 2.f;
+ blue[i + offsY][j + offsX] = psBlue[i][j];
+ }
+ }
+ }
+
+ if(adaptive && nOf3x3) {
+ if(blurMap) {
+ #pragma omp parallel
+ {
+ gaussianBlur(psMask, psMask, winw, winh, sigma);
+ }
+ }
+
+ array2D mask(W, H, ARRAY2D_CLEAR_DATA);
+ array2D maskInv(W, H, ARRAY2D_CLEAR_DATA);
+ #pragma omp parallel for schedule(dynamic,16)
+
+ for(int i = winy + border - offsY; i < winh - (border + offsY); ++i) {
+ float *greenDest = green[i + offsY];
+ float *redDest = red[i + offsY];
+ float *blueDest = blue[i + offsY];
+ int j = winx + border - offsX;
+ float v3sum[3] = {0.f};
+
+ for(int v = -1; v <= 1; v++) {
+ for(int h = -1; h < 1; h++) {
+ v3sum[1 + h] += psMask[i + v][j + h];
+ }
+ }
+
+ float blocksum = v3sum[0] + v3sum[1];
+
+ for(int voffset = 2; j < winw - (border + offsX); ++j, ++voffset) {
+ float colSum = psMask[i - 1][j + 1] + psMask[i][j + 1] + psMask[i + 1][j + 1];
+ voffset = voffset == 3 ? 0 : voffset; // faster than voffset %= 3;
+ blocksum -= v3sum[voffset];
+ blocksum += colSum;
+ v3sum[voffset] = colSum;
+
+ if(blocksum >= threshold) {
+ mask[i][j] = 255;
+ }
+ }
+ }
+
+ if(holeFill) {
+ invertMask(winx + border - offsX, winw - (border + offsX), winy + border - offsY, winh - (border + offsY), mask, maskInv);
+ floodFill4(winx + border - offsX, winw - (border + offsX), winy + border - offsY, winh - (border + offsY), maskInv);
+ xorMasks(winx + border - offsX, winw - (border + offsX), winy + border - offsY, winh - (border + offsY), maskInv, mask);
+ }
+
+ #pragma omp parallel for schedule(dynamic,16)
+
+ for(int i = winy + border - offsY; i < winh - (border + offsY); ++i) {
+ float *greenDest = green[i + offsY];
+ float *redDest = red[i + offsY];
+ float *blueDest = blue[i + offsY];
+
+ for(int j = winx + border - offsX; j < winw - (border + offsX); ++j) {
+ if(mask[i][j] == 255 ) {
+ paintMotionMask(j + offsX, showMotion, 0.5f, showOnlyMask, greenDest, redDest, blueDest);
+ continue;
+ }
+
+ if(showMotion && showOnlyMask) { // we want only motion mask => paint areas without motion in pure black
+ red[i + offsY][j + offsX] = green[i + offsY][j + offsX] = blue[i + offsY][j + offsX] = 0.f;
+ } else {
+ red[i + offsY][j + offsX] = psRed[i][j];
+ green[i + offsY][j + offsX] = (psG1[i][j] + psG2[i][j]) / 2.f;
+ blue[i + offsY][j + offsX] = psBlue[i][j];
+ }
+ }
+ }
+ }
+
+ if(plistener) {
+ plistener->setProgress(1.0);
+ }
+}
+#endif
\ No newline at end of file
diff --git a/rtengine/procevents.h b/rtengine/procevents.h
index 747d60cb4..4526b13f3 100644
--- a/rtengine/procevents.h
+++ b/rtengine/procevents.h
@@ -485,6 +485,17 @@ enum ProcEvent {
EvPixelShiftNonGreenCross = 455,
EvPixelShiftStddevFactorRed = 456,
EvPixelShiftStddevFactorBlue = 457,
+ EvPixelShiftGreenAmaze = 458,
+ EvPixelShiftNonGreenAmaze = 459,
+ EvPixelShiftGreen = 460,
+ EvPixelShiftRedBlueWeight = 461,
+ EvPixelShiftBlur = 462,
+ EvPixelShiftSigma = 463,
+ EvPixelShiftSum = 464,
+ EvPixelShiftExp0 = 465,
+ EvPixelShiftHoleFill = 466,
+ EvPixelShiftMedian = 467,
+ EvPixelShiftMedian3 = 468,
NUMOFEVENTS
};
diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc
index 5fd8b17ff..a7443a87c 100644
--- a/rtengine/procparams.cc
+++ b/rtengine/procparams.cc
@@ -886,19 +886,30 @@ void RAWParams::setDefaults()
//bayersensor.all_enhance = false;
bayersensor.lmmse_iterations = 2;
bayersensor.pixelShiftMotion = 0;
- bayersensor.pixelShiftMotionCorrection = RAWParams::BayerSensor::Grid1x2;
- bayersensor.pixelShiftStddevFactorGreen = 3.0;
- bayersensor.pixelShiftStddevFactorRed = 3.0;
- bayersensor.pixelShiftStddevFactorBlue = 3.0;
+ bayersensor.pixelShiftMotionCorrection = RAWParams::BayerSensor::Grid3x3New;
+ bayersensor.pixelShiftStddevFactorGreen = 5.0;
+ bayersensor.pixelShiftStddevFactorRed = 5.0;
+ bayersensor.pixelShiftStddevFactorBlue = 5.0;
bayersensor.pixelShiftEperIso = 0.0;
bayersensor.pixelShiftNreadIso = 0.0;
bayersensor.pixelShiftPrnu = 1.0;
+ bayersensor.pixelShiftSigma = 1.0;
+ bayersensor.pixelShiftSum = 3.0;
+ bayersensor.pixelShiftRedBlueWeight = 0.7;
bayersensor.pixelshiftShowMotion = false;
bayersensor.pixelshiftShowMotionMaskOnly = false;
bayersensor.pixelShiftAutomatic = true;
bayersensor.pixelShiftNonGreenHorizontal = false;
bayersensor.pixelShiftNonGreenVertical = false;
- bayersensor.pixelShiftNonGreenCross = false;
+ bayersensor.pixelShiftHoleFill = true;
+ bayersensor.pixelShiftMedian = false;
+ bayersensor.pixelShiftMedian3 = false;
+ bayersensor.pixelShiftGreen = true;
+ bayersensor.pixelShiftBlur = true;
+ bayersensor.pixelShiftExp0 = false;
+ bayersensor.pixelShiftNonGreenCross = true;
+ bayersensor.pixelShiftNonGreenCross2 = false;
+ bayersensor.pixelShiftNonGreenAmaze = false;
bayersensor.black0 = 0.0;
bayersensor.black1 = 0.0;
bayersensor.black2 = 0.0;
@@ -3410,6 +3421,18 @@ int ProcParams::save (const Glib::ustring &fname, const Glib::ustring &fname2, b
keyFile.set_double ("RAW Bayer", "PixelShiftPrnu", raw.bayersensor.pixelShiftPrnu );
}
+ if (!pedited || pedited->raw.bayersensor.pixelShiftSigma) {
+ keyFile.set_double ("RAW Bayer", "PixelShiftSigma", raw.bayersensor.pixelShiftSigma );
+ }
+
+ if (!pedited || pedited->raw.bayersensor.pixelShiftSum) {
+ keyFile.set_double ("RAW Bayer", "PixelShiftSum", raw.bayersensor.pixelShiftSum );
+ }
+
+ if (!pedited || pedited->raw.bayersensor.pixelShiftRedBlueWeight) {
+ keyFile.set_double ("RAW Bayer", "PixelShiftRedBlueWeight", raw.bayersensor.pixelShiftRedBlueWeight );
+ }
+
if (!pedited || pedited->raw.bayersensor.pixelshiftShowMotion) {
keyFile.set_boolean ("RAW Bayer", "PixelShiftShowMotion", raw.bayersensor.pixelshiftShowMotion );
}
@@ -3430,11 +3453,41 @@ int ProcParams::save (const Glib::ustring &fname, const Glib::ustring &fname2, b
keyFile.set_boolean ("RAW Bayer", "pixelShiftNonGreenVertical", raw.bayersensor.pixelShiftNonGreenVertical );
}
+ if (!pedited || pedited->raw.bayersensor.pixelShiftHoleFill) {
+ keyFile.set_boolean ("RAW Bayer", "pixelShiftHoleFill", raw.bayersensor.pixelShiftHoleFill );
+ }
+
+ if (!pedited || pedited->raw.bayersensor.pixelShiftMedian) {
+ keyFile.set_boolean ("RAW Bayer", "pixelShiftMedian", raw.bayersensor.pixelShiftMedian );
+ }
+
+ if (!pedited || pedited->raw.bayersensor.pixelShiftMedian3) {
+ keyFile.set_boolean ("RAW Bayer", "pixelShiftMedian", raw.bayersensor.pixelShiftMedian3 );
+ }
+
+ if (!pedited || pedited->raw.bayersensor.pixelShiftGreen) {
+ keyFile.set_boolean ("RAW Bayer", "pixelShiftGreen", raw.bayersensor.pixelShiftGreen );
+ }
+
+ if (!pedited || pedited->raw.bayersensor.pixelShiftBlur) {
+ keyFile.set_boolean ("RAW Bayer", "pixelShiftBlur", raw.bayersensor.pixelShiftBlur );
+ }
+
+ if (!pedited || pedited->raw.bayersensor.pixelShiftExp0) {
+ keyFile.set_boolean ("RAW Bayer", "pixelShiftExp0", raw.bayersensor.pixelShiftExp0 );
+ }
+
if (!pedited || pedited->raw.bayersensor.pixelShiftNonGreenCross) {
keyFile.set_boolean ("RAW Bayer", "pixelShiftNonGreenCross", raw.bayersensor.pixelShiftNonGreenCross );
}
- //if (!pedited || pedited->raw.bayersensor.allEnhance) keyFile.set_boolean ("RAW Bayer", "ALLEnhance", raw.bayersensor.all_enhance );
+ if (!pedited || pedited->raw.bayersensor.pixelShiftNonGreenCross2) {
+ keyFile.set_boolean ("RAW Bayer", "pixelShiftNonGreenCross2", raw.bayersensor.pixelShiftNonGreenCross2 );
+ }
+
+ if (!pedited || pedited->raw.bayersensor.pixelShiftNonGreenAmaze) {
+ keyFile.set_boolean ("RAW Bayer", "pixelShiftNonGreenAmaze", raw.bayersensor.pixelShiftNonGreenAmaze );
+ }
if (!pedited || pedited->raw.xtranssensor.method) {
keyFile.set_string ("RAW X-Trans", "Method", raw.xtranssensor.method );
@@ -7556,6 +7609,30 @@ int ProcParams::load (const Glib::ustring &fname, ParamsEdited* pedited)
}
}
+ if (keyFile.has_key ("RAW Bayer", "PixelShiftSigma")) {
+ raw.bayersensor.pixelShiftSigma = keyFile.get_double("RAW Bayer", "PixelShiftSigma");
+
+ if (pedited) {
+ pedited->raw.bayersensor.pixelShiftSigma = true;
+ }
+ }
+
+ if (keyFile.has_key ("RAW Bayer", "PixelShiftSum")) {
+ raw.bayersensor.pixelShiftSum = keyFile.get_double("RAW Bayer", "PixelShiftSum");
+
+ if (pedited) {
+ pedited->raw.bayersensor.pixelShiftSum = true;
+ }
+ }
+
+ if (keyFile.has_key ("RAW Bayer", "PixelShiftRedBlueWeight")) {
+ raw.bayersensor.pixelShiftRedBlueWeight = keyFile.get_double("RAW Bayer", "PixelShiftRedBlueWeight");
+
+ if (pedited) {
+ pedited->raw.bayersensor.pixelShiftRedBlueWeight = true;
+ }
+ }
+
if (keyFile.has_key ("RAW Bayer", "PixelShiftShowMotion")) {
raw.bayersensor.pixelshiftShowMotion = keyFile.get_boolean("RAW Bayer", "PixelShiftShowMotion");
@@ -7596,6 +7673,54 @@ int ProcParams::load (const Glib::ustring &fname, ParamsEdited* pedited)
}
}
+ if (keyFile.has_key ("RAW Bayer", "pixelShiftHoleFill")) {
+ raw.bayersensor.pixelShiftHoleFill = keyFile.get_boolean("RAW Bayer", "pixelShiftHoleFill");
+
+ if (pedited) {
+ pedited->raw.bayersensor.pixelShiftHoleFill = true;
+ }
+ }
+
+ if (keyFile.has_key ("RAW Bayer", "pixelShiftMedian")) {
+ raw.bayersensor.pixelShiftMedian = keyFile.get_boolean("RAW Bayer", "pixelShiftMedian");
+
+ if (pedited) {
+ pedited->raw.bayersensor.pixelShiftMedian = true;
+ }
+ }
+
+ if (keyFile.has_key ("RAW Bayer", "pixelShiftMedian3")) {
+ raw.bayersensor.pixelShiftMedian3 = keyFile.get_boolean("RAW Bayer", "pixelShiftMedian3");
+
+ if (pedited) {
+ pedited->raw.bayersensor.pixelShiftMedian3 = true;
+ }
+ }
+
+ if (keyFile.has_key ("RAW Bayer", "pixelShiftGreen")) {
+ raw.bayersensor.pixelShiftGreen = keyFile.get_boolean("RAW Bayer", "pixelShiftGreen");
+
+ if (pedited) {
+ pedited->raw.bayersensor.pixelShiftGreen = true;
+ }
+ }
+
+ if (keyFile.has_key ("RAW Bayer", "pixelShiftBlur")) {
+ raw.bayersensor.pixelShiftBlur = keyFile.get_boolean("RAW Bayer", "pixelShiftBlur");
+
+ if (pedited) {
+ pedited->raw.bayersensor.pixelShiftBlur = true;
+ }
+ }
+
+ if (keyFile.has_key ("RAW Bayer", "pixelShiftExp0")) {
+ raw.bayersensor.pixelShiftExp0 = keyFile.get_boolean("RAW Bayer", "pixelShiftExp0");
+
+ if (pedited) {
+ pedited->raw.bayersensor.pixelShiftExp0 = true;
+ }
+ }
+
if (keyFile.has_key ("RAW Bayer", "pixelShiftNonGreenCross")) {
raw.bayersensor.pixelShiftNonGreenCross = keyFile.get_boolean("RAW Bayer", "pixelShiftNonGreenCross");
@@ -7604,7 +7729,21 @@ int ProcParams::load (const Glib::ustring &fname, ParamsEdited* pedited)
}
}
- //if (keyFile.has_key ("RAW Bayer", "ALLEnhance")) { raw.bayersensor.all_enhance = keyFile.get_boolean("RAW Bayer", "ALLEnhance"); if (pedited) pedited->raw.bayersensor.allEnhance = true; }
+ if (keyFile.has_key ("RAW Bayer", "pixelShiftNonGreenCross2")) {
+ raw.bayersensor.pixelShiftNonGreenCross2 = keyFile.get_boolean("RAW Bayer", "pixelShiftNonGreenCross2");
+
+ if (pedited) {
+ pedited->raw.bayersensor.pixelShiftNonGreenCross2 = true;
+ }
+ }
+
+ if (keyFile.has_key ("RAW Bayer", "pixelShiftNonGreenAmaze")) {
+ raw.bayersensor.pixelShiftNonGreenAmaze = keyFile.get_boolean("RAW Bayer", "pixelShiftNonGreenAmaze");
+
+ if (pedited) {
+ pedited->raw.bayersensor.pixelShiftNonGreenAmaze = true;
+ }
+ }
}
// load X-Trans sensors' raw settings
@@ -8051,14 +8190,24 @@ bool ProcParams::operator== (const ProcParams& other)
&& raw.bayersensor.pixelShiftEperIso == other.raw.bayersensor.pixelShiftEperIso
&& raw.bayersensor.pixelShiftNreadIso == other.raw.bayersensor.pixelShiftNreadIso
&& raw.bayersensor.pixelShiftPrnu == other.raw.bayersensor.pixelShiftPrnu
+ && raw.bayersensor.pixelShiftSigma == other.raw.bayersensor.pixelShiftSigma
+ && raw.bayersensor.pixelShiftSum == other.raw.bayersensor.pixelShiftSum
+ && raw.bayersensor.pixelShiftRedBlueWeight == other.raw.bayersensor.pixelShiftRedBlueWeight
&& raw.bayersensor.pixelshiftShowMotion == other.raw.bayersensor.pixelshiftShowMotion
&& raw.bayersensor.pixelshiftShowMotionMaskOnly == other.raw.bayersensor.pixelshiftShowMotionMaskOnly
&& raw.bayersensor.pixelShiftAutomatic == other.raw.bayersensor.pixelShiftAutomatic
&& raw.bayersensor.pixelShiftNonGreenHorizontal == other.raw.bayersensor.pixelShiftNonGreenHorizontal
&& raw.bayersensor.pixelShiftNonGreenVertical == other.raw.bayersensor.pixelShiftNonGreenVertical
+ && raw.bayersensor.pixelShiftHoleFill == other.raw.bayersensor.pixelShiftHoleFill
+ && raw.bayersensor.pixelShiftMedian == other.raw.bayersensor.pixelShiftMedian
+ && raw.bayersensor.pixelShiftMedian3 == other.raw.bayersensor.pixelShiftMedian3
+ && raw.bayersensor.pixelShiftGreen == other.raw.bayersensor.pixelShiftGreen
+ && raw.bayersensor.pixelShiftBlur == other.raw.bayersensor.pixelShiftBlur
+ && raw.bayersensor.pixelShiftExp0 == other.raw.bayersensor.pixelShiftExp0
&& raw.bayersensor.pixelShiftNonGreenCross == other.raw.bayersensor.pixelShiftNonGreenCross
+ && raw.bayersensor.pixelShiftNonGreenCross2 == other.raw.bayersensor.pixelShiftNonGreenCross2
+ && raw.bayersensor.pixelShiftNonGreenAmaze == other.raw.bayersensor.pixelShiftNonGreenAmaze
&& raw.bayersensor.dcb_enhance == other.raw.bayersensor.dcb_enhance
- //&& raw.bayersensor.all_enhance == other.raw.bayersensor.all_enhance
&& raw.xtranssensor.method == other.raw.xtranssensor.method
&& raw.xtranssensor.ccSteps == other.raw.xtranssensor.ccSteps
&& raw.xtranssensor.blackred == other.raw.xtranssensor.blackred
diff --git a/rtengine/procparams.h b/rtengine/procparams.h
index 0c06fa315..c3c8296b7 100644
--- a/rtengine/procparams.h
+++ b/rtengine/procparams.h
@@ -1188,7 +1188,7 @@ public:
numMethods
}; // This MUST be the last enum
enum ePSMotionCorrection {
- Grid1x1, Grid1x2, Grid3x3, Grid5x5, Grid7x7
+ Grid1x1, Grid1x2, Grid3x3, Grid5x5, Grid7x7, Grid3x3New
};
static const char *methodstring[numMethods];
@@ -1212,12 +1212,23 @@ public:
double pixelShiftEperIso;
double pixelShiftNreadIso;
double pixelShiftPrnu;
+ double pixelShiftSigma;
+ double pixelShiftSum;
+ double pixelShiftRedBlueWeight;
bool pixelshiftShowMotion;
bool pixelshiftShowMotionMaskOnly;
bool pixelShiftAutomatic;
bool pixelShiftNonGreenHorizontal;
bool pixelShiftNonGreenVertical;
+ bool pixelShiftHoleFill;
+ bool pixelShiftMedian;
+ bool pixelShiftMedian3;
+ bool pixelShiftGreen;
+ bool pixelShiftBlur;
+ bool pixelShiftExp0;
bool pixelShiftNonGreenCross;
+ bool pixelShiftNonGreenCross2;
+ bool pixelShiftNonGreenAmaze;
bool dcb_enhance;
//bool all_enhance;
};
diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc
index 36b78aa20..566fc77a3 100644
--- a/rtengine/rawimagesource.cc
+++ b/rtengine/rawimagesource.cc
@@ -2022,13 +2022,107 @@ void RawImageSource::demosaic(const RAWParams &raw)
} else if (raw.bayersensor.method == RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::ahd] ) {
ahd_demosaic (0, 0, W, H);
} else if (raw.bayersensor.method == RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::amaze] ) {
- amaze_demosaic_RT (0, 0, W, H);
+ amaze_demosaic_RT (0, 0, W, H, rawData, red, green, blue);
} else if (raw.bayersensor.method == RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::pixelshift] ) {
- if(raw.bayersensor.pixelShiftMotion > 0 || raw.bayersensor.pixelShiftAutomatic) {
- amaze_demosaic_RT (0, 0, W, H); // for non pixelshift files use amaze if pixelshift is selected. We need it also for motion correction
- }
- if(numFrames == 4) {
- pixelshift(0, 0, W, H, raw.bayersensor.pixelShiftMotion > 0, raw.bayersensor.pixelShiftMotion, raw.bayersensor.pixelshiftShowMotion, raw.bayersensor.pixelshiftShowMotionMaskOnly, currFrame, raw.bayersensor.pixelShiftMotionCorrection, raw.bayersensor.pixelShiftAutomatic, raw.bayersensor.pixelShiftStddevFactorGreen, raw.bayersensor.pixelShiftStddevFactorRed, raw.bayersensor.pixelShiftStddevFactorBlue, raw.bayersensor.pixelShiftEperIso, raw.bayersensor.pixelShiftNreadIso, raw.bayersensor.pixelShiftPrnu, ri->get_model(), raw.expos, raw.bayersensor.pixelShiftNonGreenHorizontal, raw.bayersensor.pixelShiftNonGreenVertical, raw.bayersensor.pixelShiftNonGreenCross);
+ if(numFrames != 4) { // fallback for non pixelshift files
+ amaze_demosaic_RT (0, 0, W, H, rawData, red, green, blue);
+ } else {
+ if(!raw.bayersensor.pixelshiftShowMotion || raw.bayersensor.pixelShiftNonGreenAmaze || raw.bayersensor.pixelShiftNonGreenCross2) {
+ if((raw.bayersensor.pixelShiftMotion > 0 || raw.bayersensor.pixelShiftAutomatic) && numFrames == 4) {
+ if(raw.bayersensor.pixelShiftMedian) { // We need the amaze demosaiced frames for motion correction
+ if(!raw.bayersensor.pixelShiftMedian3) {
+ amaze_demosaic_RT (0, 0, W, H, *(rawDataFrames[0]), red, green, blue);
+ multi_array2D redTmp(W,H);
+ multi_array2D greenTmp(W,H);
+ multi_array2D blueTmp(W,H);
+ for(int i=0;i<3;i++) {
+ amaze_demosaic_RT (0, 0, W, H, *(rawDataFrames[i+1]), redTmp[i], greenTmp[i], blueTmp[i]);
+ }
+ #pragma omp parallel for schedule(dynamic,16)
+ for(int i=border;i redTmp(W,H);
+ multi_array2D greenTmp(W,H);
+ multi_array2D blueTmp(W,H);
+ for(int i=0, frameIndex = 0;i<4;++i) {
+ if(i != currFrame) {
+ amaze_demosaic_RT (0, 0, W, H, *(rawDataFrames[i]), redTmp[frameIndex], greenTmp[frameIndex], blueTmp[frameIndex]);
+ ++frameIndex;
+ }
+ }
+ unsigned int offsX0 = 0, offsY0 = 0;
+ unsigned int offsX1 = 0, offsY1 = 0;
+ unsigned int offsX2 = 0, offsY2 = 0;
+
+ // We have to adjust the offsets for the selected subframe we exclude from median
+ switch (currFrame) {
+ case 0:
+ offsY0 = 1;
+ offsX0 = 0;
+ offsY1 = 1;
+ offsX1 = 1;
+ offsY2 = 0;
+ offsX2 = 1;
+ break;
+
+ case 1:
+ offsY0 = 0;
+ offsX0 = 0;
+ offsY1 = 1;
+ offsX1 = 1;
+ offsY2 = 0;
+ offsX2 = 1;
+ break;
+
+ case 2:
+ offsY0 = 0;
+ offsX0 = 0;
+ offsY1 = 1;
+ offsX1 = 0;
+ offsY2 = 0;
+ offsX2 = 1;
+ break;
+
+ case 3:
+ offsY0 = 0;
+ offsX0 = 0;
+ offsY1 = 1;
+ offsX1 = 0;
+ offsY2 = 1;
+ offsX2 = 1;
+ }
+
+ #pragma omp parallel for schedule(dynamic,16)
+ for(int i=border;iget_model(), raw.expos);
}
} else if (raw.bayersensor.method == RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::dcb] ) {
dcb_demosaic(raw.bayersensor.dcb_iterations, raw.bayersensor.dcb_enhance);
diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h
index f80efeacf..d54bcd49d 100644
--- a/rtengine/rawimagesource.h
+++ b/rtengine/rawimagesource.h
@@ -237,7 +237,7 @@ protected:
void jdl_interpolate_omp();
void igv_interpolate(int winw, int winh);
void lmmse_interpolate_omp(int winw, int winh, int iterations);
- void amaze_demosaic_RT(int winx, int winy, int winw, int winh);//Emil's code for AMaZE
+ void amaze_demosaic_RT(int winx, int winy, int winw, int winh, array2D &rawData, array2D &red, array2D &green, array2D &blue);//Emil's code for AMaZE
void fast_demosaic(int winx, int winy, int winw, int winh );//Emil's code for fast demosaicing
void dcb_demosaic(int iterations, bool dcb_enhance);
void ahd_demosaic(int winx, int winy, int winw, int winh);
@@ -261,7 +261,7 @@ protected:
void xtransborder_interpolate (int border);
void xtrans_interpolate (const int passes, const bool useCieLab);
void fast_xtrans_interpolate ();
- void pixelshift(int winx, int winy, int winw, int winh, bool detectMotion, int motion, bool showMotion, bool showOnlyMask, unsigned int frame, RAWParams::BayerSensor::ePSMotionCorrection gridSize, bool adaptive, float stddevFactorGreen, float stddevFactorRed, float stddevFactorBlue, float eperIso, float nreadIso, float prnu, const std::string &model, float rawWpCorrection, bool checkNonGreenHorizontal, bool checkNonGreenVertical, bool checkNonGreenCross);
+ void pixelshift(int winx, int winy, int winw, int winh, const RAWParams::BayerSensor &bayerParams, unsigned int frame, const std::string &model, float rawWpCorrection);
void hflip (Imagefloat* im);
void vflip (Imagefloat* im);
diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc
index 08e3d2520..3030a4319 100644
--- a/rtengine/refreshmap.cc
+++ b/rtengine/refreshmap.cc
@@ -484,7 +484,18 @@ int refreshmap[rtengine::NUMOFEVENTS] = {
DEMOSAIC, // EvPixelShiftNonGreenVertical
DEMOSAIC, // EvPixelShiftNonGreenCross
DEMOSAIC, // EvPixelShiftStddevFactorRed
- DEMOSAIC // EvPixelShiftStddevFactorBlue
+ DEMOSAIC, // EvPixelShiftStddevFactorBlue
+ DEMOSAIC, // EvPixelShiftNonGreenCross2
+ DEMOSAIC, // EvPixelShiftNonGreenAmaze
+ DEMOSAIC, // EvPixelShiftGreen
+ DEMOSAIC, // EvPixelShiftRedBlueWeight
+ DEMOSAIC, // EvPixelShiftBlur
+ DEMOSAIC, // EvPixelShiftSigma
+ DEMOSAIC, // EvPixelShiftSum
+ DEMOSAIC, // EvPixelShiftExp0
+ DEMOSAIC, // EvPixelShiftHoleFill
+ DEMOSAIC, // EvPixelShiftMedian
+ DEMOSAIC // EvPixelShiftMedian3
};
diff --git a/rtgui/bayerprocess.cc b/rtgui/bayerprocess.cc
index 297a9b65b..701463ac4 100644
--- a/rtgui/bayerprocess.cc
+++ b/rtgui/bayerprocess.cc
@@ -83,27 +83,58 @@ BayerProcess::BayerProcess () : FoldableToolPanel(this, "bayerprocess", M("TP_RA
pixelShiftOptions = Gtk::manage (new Gtk::VBox ());
pixelShiftOptions->set_border_width(4);
+
pixelShiftShowMotion = Gtk::manage (new Gtk::CheckButton(M("TP_RAW_PIXELSHIFTSHOWMOTION")));
+ pixelShiftShowMotion->set_tooltip_text (M("TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP"));
pixelShiftOptions->pack_start(*pixelShiftShowMotion);
pixelShiftShowMotionMaskOnly = Gtk::manage (new Gtk::CheckButton(M("TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY")));
+ pixelShiftShowMotionMaskOnly->set_tooltip_text (M("TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY_TOOLTIP"));
pixelShiftOptions->pack_start(*pixelShiftShowMotionMaskOnly);
pixelShiftAutomatic = Gtk::manage (new Gtk::CheckButton(M("TP_RAW_PIXELSHIFTADAPTIVE")));
pixelShiftOptions->pack_start(*pixelShiftAutomatic);
+ pixelShiftGreen = Gtk::manage (new Gtk::CheckButton(M("TP_RAW_PIXELSHIFTGREEN")));
+ pixelShiftOptions->pack_start(*pixelShiftGreen);
+
+ pixelShiftBlur = Gtk::manage (new Gtk::CheckButton(M("TP_RAW_PIXELSHIFTBLUR")));
+ pixelShiftBlur->set_tooltip_text (M("TP_RAW_PIXELSHIFTBLUR_TOOLTIP"));
+ pixelShiftOptions->pack_start(*pixelShiftBlur);
+
+ pixelShiftHoleFill = Gtk::manage (new Gtk::CheckButton(M("TP_RAW_PIXELSHIFTHOLEFILL")));
+ pixelShiftHoleFill->set_tooltip_text (M("TP_RAW_PIXELSHIFTHOLEFILL_TOOLTIP"));
+ pixelShiftOptions->pack_start(*pixelShiftHoleFill);
+
+ pixelShiftMedian = Gtk::manage (new Gtk::CheckButton(M("TP_RAW_PIXELSHIFTMEDIAN")));
+ pixelShiftMedian->set_tooltip_text (M("TP_RAW_PIXELSHIFTMEDIAN_TOOLTIP"));
+ pixelShiftOptions->pack_start(*pixelShiftMedian);
+
+ pixelShiftMedian3 = Gtk::manage (new Gtk::CheckButton(M("TP_RAW_PIXELSHIFTMEDIAN3")));
+ pixelShiftMedian3->set_tooltip_text (M("TP_RAW_PIXELSHIFTMEDIAN3_TOOLTIP"));
+ pixelShiftOptions->pack_start(*pixelShiftMedian3);
+
pixelShiftNonGreenCross = Gtk::manage (new Gtk::CheckButton(M("TP_RAW_PIXELSHIFTNONGREENCROSS")));
pixelShiftOptions->pack_start(*pixelShiftNonGreenCross);
+ pixelShiftNonGreenCross2 = Gtk::manage (new Gtk::CheckButton(M("TP_RAW_PIXELSHIFTNONGREENCROSS2")));
+ pixelShiftOptions->pack_start(*pixelShiftNonGreenCross2);
+
+ pixelShiftNonGreenAmaze = Gtk::manage (new Gtk::CheckButton(M("TP_RAW_PIXELSHIFTNONGREENAMAZE")));
+ pixelShiftOptions->pack_start(*pixelShiftNonGreenAmaze);
+
pixelShiftNonGreenHorizontal = Gtk::manage (new Gtk::CheckButton(M("TP_RAW_PIXELSHIFTNONGREENHORIZONTAL")));
pixelShiftOptions->pack_start(*pixelShiftNonGreenHorizontal);
pixelShiftNonGreenVertical = Gtk::manage (new Gtk::CheckButton(M("TP_RAW_PIXELSHIFTNONGREENVERTICAL")));
pixelShiftOptions->pack_start(*pixelShiftNonGreenVertical);
+ pixelShiftExp0 = Gtk::manage (new Gtk::CheckButton(M("TP_RAW_PIXELSHIFTEXP0")));
+ pixelShiftOptions->pack_start(*pixelShiftExp0);
+
pixelShiftMotion = Gtk::manage (new Adjuster (M("TP_RAW_PIXELSHIFTMOTION"), 0, 100, 1, 70));
pixelShiftMotion->setAdjusterListener (this);
- pixelShiftMotion->set_tooltip_markup (M("TP_RAW_PIXELSHIFTMOTION_TOOLTIP"));
+ pixelShiftMotion->set_tooltip_text (M("TP_RAW_PIXELSHIFTMOTION_TOOLTIP"));
if (pixelShiftMotion->delay < options.adjusterMaxDelay) {
pixelShiftMotion->delay = options.adjusterMaxDelay;
@@ -119,13 +150,14 @@ BayerProcess::BayerProcess () : FoldableToolPanel(this, "bayerprocess", M("TP_RA
pixelShiftMotionCorrection->append_text("3x3");
pixelShiftMotionCorrection->append_text("5x5");
pixelShiftMotionCorrection->append_text("7x7");
+ pixelShiftMotionCorrection->append_text("3x3 new");
pixelShiftMotionCorrection->set_active(0);
// pixelShiftMotionCorrection->set_tooltip_markup (M("TP_RAW_PIXELSHIFTMOTIONCORRECTION_TOOLTIP"));
pixelShiftMotionCorrection->show();
hb2->pack_start(*pixelShiftMotionCorrection);
pixelShiftOptions->pack_start(*hb2);
- pixelShiftStddevFactorGreen = Gtk::manage (new Adjuster (M("TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN"), 2, 8, 0.1, 3));
+ pixelShiftStddevFactorGreen = Gtk::manage (new Adjuster (M("TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN"), 2, 8, 0.1, 5));
pixelShiftStddevFactorGreen->setAdjusterListener (this);
if (pixelShiftStddevFactorGreen->delay < options.adjusterMaxDelay) {
@@ -135,7 +167,7 @@ BayerProcess::BayerProcess () : FoldableToolPanel(this, "bayerprocess", M("TP_RA
pixelShiftStddevFactorGreen->show();
pixelShiftOptions->pack_start(*pixelShiftStddevFactorGreen);
- pixelShiftStddevFactorRed = Gtk::manage (new Adjuster (M("TP_RAW_PIXELSHIFTSTDDEVFACTORRED"), 1, 8, 0.1, 3));
+ pixelShiftStddevFactorRed = Gtk::manage (new Adjuster (M("TP_RAW_PIXELSHIFTSTDDEVFACTORRED"), 1, 8, 0.1, 5));
pixelShiftStddevFactorRed->setAdjusterListener (this);
if (pixelShiftStddevFactorRed->delay < options.adjusterMaxDelay) {
@@ -145,7 +177,7 @@ BayerProcess::BayerProcess () : FoldableToolPanel(this, "bayerprocess", M("TP_RA
pixelShiftStddevFactorRed->show();
pixelShiftOptions->pack_start(*pixelShiftStddevFactorRed);
- pixelShiftStddevFactorBlue = Gtk::manage (new Adjuster (M("TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE"), 1, 8, 0.1, 3));
+ pixelShiftStddevFactorBlue = Gtk::manage (new Adjuster (M("TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE"), 1, 8, 0.1, 5));
pixelShiftStddevFactorBlue->setAdjusterListener (this);
if (pixelShiftStddevFactorBlue->delay < options.adjusterMaxDelay) {
@@ -186,6 +218,36 @@ BayerProcess::BayerProcess () : FoldableToolPanel(this, "bayerprocess", M("TP_RA
pixelShiftPrnu->show();
pixelShiftOptions->pack_start(*pixelShiftPrnu);
+ pixelShiftSigma = Gtk::manage (new Adjuster (M("TP_RAW_PIXELSHIFTSIGMA"), 0.5, 2.5, 0.1, 1.0));
+ pixelShiftSigma->setAdjusterListener (this);
+
+ if (pixelShiftSigma->delay < options.adjusterMaxDelay) {
+ pixelShiftSigma->delay = options.adjusterMaxDelay;
+ }
+
+ pixelShiftSigma->show();
+ pixelShiftOptions->pack_start(*pixelShiftSigma);
+
+ pixelShiftSum = Gtk::manage (new Adjuster (M("TP_RAW_PIXELSHIFTMASKTHRESHOLD"), 1.0, 8.0, 0.1, 3.0));
+ pixelShiftSum->setAdjusterListener (this);
+
+ if (pixelShiftSum->delay < options.adjusterMaxDelay) {
+ pixelShiftSum->delay = options.adjusterMaxDelay;
+ }
+
+ pixelShiftSum->show();
+ pixelShiftOptions->pack_start(*pixelShiftSum);
+
+ pixelShiftRedBlueWeight = Gtk::manage (new Adjuster (M("TP_RAW_PIXELSHIFTREDBLUEWEIGHT"), 0.1, 1.0, 0.1, 0.7));
+ pixelShiftRedBlueWeight->setAdjusterListener (this);
+
+ if (pixelShiftRedBlueWeight->delay < options.adjusterMaxDelay) {
+ pixelShiftRedBlueWeight->delay = options.adjusterMaxDelay;
+ }
+
+ pixelShiftRedBlueWeight->show();
+ pixelShiftOptions->pack_start(*pixelShiftRedBlueWeight);
+
pack_start( *pixelShiftOptions, Gtk::PACK_SHRINK, 4);
@@ -216,8 +278,15 @@ BayerProcess::BayerProcess () : FoldableToolPanel(this, "bayerprocess", M("TP_RA
pixelShiftAutomaticconn = pixelShiftAutomatic->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftAutomaticChanged), true);
pixelShiftNonGreenHorizontalconn = pixelShiftNonGreenHorizontal->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftNonGreenHorizontalChanged), true);
pixelShiftNonGreenVerticalconn = pixelShiftNonGreenVertical->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftNonGreenVerticalChanged), true);
+ pixelShiftHoleFillconn = pixelShiftHoleFill->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftHoleFillChanged), true);
+ pixelShiftMedianconn = pixelShiftMedian->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftMedianChanged), true);
+ pixelShiftMedian3conn = pixelShiftMedian3->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftMedian3Changed), true);
+ pixelShiftGreenconn = pixelShiftGreen->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftGreenChanged), true);
+ pixelShiftBlurconn = pixelShiftBlur->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftBlurChanged), true);
+ pixelShiftExp0conn = pixelShiftExp0->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftExp0Changed), true);
pixelShiftNonGreenCrossconn = pixelShiftNonGreenCross->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftNonGreenCrossChanged), true);
- //allEnhconn = allEnhance->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::allEnhanceChanged), true);
+ pixelShiftNonGreenCross2conn = pixelShiftNonGreenCross2->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftNonGreenCross2Changed), true);
+ pixelShiftNonGreenAmazeconn = pixelShiftNonGreenAmaze->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftNonGreenAmazeChanged), true);
}
@@ -250,8 +319,15 @@ void BayerProcess::read(const rtengine::procparams::ProcParams* pp, const Params
pixelShiftAutomatic->set_inconsistent(!pedited->raw.bayersensor.pixelShiftAutomatic);
pixelShiftNonGreenHorizontal->set_inconsistent(!pedited->raw.bayersensor.pixelShiftNonGreenHorizontal);
pixelShiftNonGreenVertical->set_inconsistent(!pedited->raw.bayersensor.pixelShiftNonGreenVertical);
+ pixelShiftHoleFill->set_inconsistent(!pedited->raw.bayersensor.pixelShiftHoleFill);
+ pixelShiftMedian->set_inconsistent(!pedited->raw.bayersensor.pixelShiftMedian);
+ pixelShiftMedian3->set_inconsistent(!pedited->raw.bayersensor.pixelShiftMedian3);
+ pixelShiftGreen->set_inconsistent(!pedited->raw.bayersensor.pixelShiftGreen);
+ pixelShiftBlur->set_inconsistent(!pedited->raw.bayersensor.pixelShiftBlur);
+ pixelShiftExp0->set_inconsistent(!pedited->raw.bayersensor.pixelShiftExp0);
pixelShiftNonGreenCross->set_inconsistent(!pedited->raw.bayersensor.pixelShiftNonGreenCross);
- //allEnhance->set_inconsistent(!pedited->raw.bayersensor.allEnhance);
+ pixelShiftNonGreenCross2->set_inconsistent(!pedited->raw.bayersensor.pixelShiftNonGreenCross2);
+ pixelShiftNonGreenAmaze->set_inconsistent(!pedited->raw.bayersensor.pixelShiftNonGreenAmaze);
lmmseIterations->setEditedState ( pedited->raw.bayersensor.lmmseIterations ? Edited : UnEdited);
pixelShiftMotion->setEditedState ( pedited->raw.bayersensor.pixelShiftMotion ? Edited : UnEdited);
pixelShiftStddevFactorGreen->setEditedState ( pedited->raw.bayersensor.pixelShiftStddevFactorGreen ? Edited : UnEdited);
@@ -260,6 +336,9 @@ void BayerProcess::read(const rtengine::procparams::ProcParams* pp, const Params
pixelShiftEperIso->setEditedState ( pedited->raw.bayersensor.pixelShiftEperIso ? Edited : UnEdited);
pixelShiftNreadIso->setEditedState ( pedited->raw.bayersensor.pixelShiftNreadIso ? Edited : UnEdited);
pixelShiftPrnu->setEditedState ( pedited->raw.bayersensor.pixelShiftPrnu ? Edited : UnEdited);
+ pixelShiftSigma->setEditedState ( pedited->raw.bayersensor.pixelShiftSigma ? Edited : UnEdited);
+ pixelShiftSum->setEditedState ( pedited->raw.bayersensor.pixelShiftSum ? Edited : UnEdited);
+ pixelShiftRedBlueWeight->setEditedState ( pedited->raw.bayersensor.pixelShiftRedBlueWeight ? Edited : UnEdited);
if(!pedited->raw.bayersensor.method) {
method->set_active(procparams::RAWParams::BayerSensor::numMethods); // No name
@@ -281,7 +360,15 @@ void BayerProcess::read(const rtengine::procparams::ProcParams* pp, const Params
pixelShiftAutomatic->set_active(pp->raw.bayersensor.pixelShiftAutomatic);
pixelShiftNonGreenHorizontal->set_active(pp->raw.bayersensor.pixelShiftNonGreenHorizontal);
pixelShiftNonGreenVertical->set_active(pp->raw.bayersensor.pixelShiftNonGreenVertical);
+ pixelShiftHoleFill->set_active(pp->raw.bayersensor.pixelShiftHoleFill);
+ pixelShiftMedian->set_active(pp->raw.bayersensor.pixelShiftMedian);
+ pixelShiftMedian3->set_active(pp->raw.bayersensor.pixelShiftMedian3);
+ pixelShiftGreen->set_active(pp->raw.bayersensor.pixelShiftGreen);
+ pixelShiftBlur->set_active(pp->raw.bayersensor.pixelShiftBlur);
+ pixelShiftExp0->set_active(pp->raw.bayersensor.pixelShiftExp0);
pixelShiftNonGreenCross->set_active(pp->raw.bayersensor.pixelShiftNonGreenCross);
+ pixelShiftNonGreenCross2->set_active(pp->raw.bayersensor.pixelShiftNonGreenCross2);
+ pixelShiftNonGreenAmaze->set_active(pp->raw.bayersensor.pixelShiftNonGreenAmaze);
ccSteps->setValue (pp->raw.bayersensor.ccSteps);
lmmseIterations->setValue (pp->raw.bayersensor.lmmse_iterations);
pixelShiftMotion->setValue (pp->raw.bayersensor.pixelShiftMotion);
@@ -292,6 +379,9 @@ void BayerProcess::read(const rtengine::procparams::ProcParams* pp, const Params
pixelShiftEperIso->setValue (pp->raw.bayersensor.pixelShiftEperIso);
pixelShiftNreadIso->setValue (pp->raw.bayersensor.pixelShiftNreadIso);
pixelShiftPrnu->setValue (pp->raw.bayersensor.pixelShiftPrnu);
+ pixelShiftSigma->setValue (pp->raw.bayersensor.pixelShiftSigma);
+ pixelShiftSum->setValue (pp->raw.bayersensor.pixelShiftSum);
+ pixelShiftRedBlueWeight->setValue (pp->raw.bayersensor.pixelShiftRedBlueWeight);
if (!batchMode) {
if (pp->raw.bayersensor.method == procparams::RAWParams::BayerSensor::methodstring[procparams::RAWParams::BayerSensor::dcb] ||
@@ -349,12 +439,23 @@ void BayerProcess::write( rtengine::procparams::ProcParams* pp, ParamsEdited* pe
pp->raw.bayersensor.pixelShiftEperIso = pixelShiftEperIso->getValue();
pp->raw.bayersensor.pixelShiftNreadIso = pixelShiftNreadIso->getValue();
pp->raw.bayersensor.pixelShiftPrnu = pixelShiftPrnu->getValue();
+ pp->raw.bayersensor.pixelShiftSigma = pixelShiftSigma->getValue();
+ pp->raw.bayersensor.pixelShiftSum = pixelShiftSum->getValue();
+ pp->raw.bayersensor.pixelShiftRedBlueWeight = pixelShiftRedBlueWeight->getValue();
pp->raw.bayersensor.pixelshiftShowMotion = pixelShiftShowMotion->get_active();
pp->raw.bayersensor.pixelshiftShowMotionMaskOnly = pixelShiftShowMotionMaskOnly->get_active();
pp->raw.bayersensor.pixelShiftAutomatic = pixelShiftAutomatic->get_active();
pp->raw.bayersensor.pixelShiftNonGreenHorizontal = pixelShiftNonGreenHorizontal->get_active();
pp->raw.bayersensor.pixelShiftNonGreenVertical = pixelShiftNonGreenVertical->get_active();
+ pp->raw.bayersensor.pixelShiftHoleFill = pixelShiftHoleFill->get_active();
+ pp->raw.bayersensor.pixelShiftMedian = pixelShiftMedian->get_active();
+ pp->raw.bayersensor.pixelShiftMedian3 = pixelShiftMedian3->get_active();
+ pp->raw.bayersensor.pixelShiftGreen = pixelShiftGreen->get_active();
+ pp->raw.bayersensor.pixelShiftBlur = pixelShiftBlur->get_active();
+ pp->raw.bayersensor.pixelShiftExp0 = pixelShiftExp0->get_active();
pp->raw.bayersensor.pixelShiftNonGreenCross = pixelShiftNonGreenCross->get_active();
+ pp->raw.bayersensor.pixelShiftNonGreenCross2 = pixelShiftNonGreenCross2->get_active();
+ pp->raw.bayersensor.pixelShiftNonGreenAmaze = pixelShiftNonGreenAmaze->get_active();
int currentRow = method->get_active_row_number();
if( currentRow >= 0 && currentRow < procparams::RAWParams::BayerSensor::numMethods) {
@@ -383,12 +484,23 @@ void BayerProcess::write( rtengine::procparams::ProcParams* pp, ParamsEdited* pe
pedited->raw.bayersensor.pixelShiftEperIso = pixelShiftEperIso->getEditedState ();
pedited->raw.bayersensor.pixelShiftNreadIso = pixelShiftNreadIso->getEditedState ();
pedited->raw.bayersensor.pixelShiftPrnu = pixelShiftPrnu->getEditedState ();
+ pedited->raw.bayersensor.pixelShiftSigma = pixelShiftSigma->getEditedState ();
+ pedited->raw.bayersensor.pixelShiftSum = pixelShiftSum->getEditedState ();
+ pedited->raw.bayersensor.pixelShiftRedBlueWeight = pixelShiftRedBlueWeight->getEditedState ();
pedited->raw.bayersensor.pixelshiftShowMotion = !pixelShiftShowMotion->get_inconsistent();
pedited->raw.bayersensor.pixelshiftShowMotionMaskOnly = !pixelShiftShowMotionMaskOnly->get_inconsistent();
pedited->raw.bayersensor.pixelShiftAutomatic = !pixelShiftAutomatic->get_inconsistent();
pedited->raw.bayersensor.pixelShiftNonGreenHorizontal = !pixelShiftNonGreenHorizontal->get_inconsistent();
pedited->raw.bayersensor.pixelShiftNonGreenVertical = !pixelShiftNonGreenVertical->get_inconsistent();
+ pedited->raw.bayersensor.pixelShiftHoleFill = !pixelShiftHoleFill->get_inconsistent();
+ pedited->raw.bayersensor.pixelShiftMedian = !pixelShiftMedian->get_inconsistent();
+ pedited->raw.bayersensor.pixelShiftMedian3 = !pixelShiftMedian3->get_inconsistent();
+ pedited->raw.bayersensor.pixelShiftGreen = !pixelShiftGreen->get_inconsistent();
+ pedited->raw.bayersensor.pixelShiftBlur = !pixelShiftBlur->get_inconsistent();
+ pedited->raw.bayersensor.pixelShiftExp0 = !pixelShiftExp0->get_inconsistent();
pedited->raw.bayersensor.pixelShiftNonGreenCross = !pixelShiftNonGreenCross->get_inconsistent();
+ pedited->raw.bayersensor.pixelShiftNonGreenCross2 = !pixelShiftNonGreenCross2->get_inconsistent();
+ pedited->raw.bayersensor.pixelShiftNonGreenAmaze = !pixelShiftNonGreenAmaze->get_inconsistent();
}
}
@@ -414,6 +526,9 @@ void BayerProcess::setBatchMode(bool batchMode)
pixelShiftEperIso->showEditedCB ();
pixelShiftNreadIso->showEditedCB ();
pixelShiftPrnu->showEditedCB ();
+ pixelShiftSigma->showEditedCB ();
+ pixelShiftSum->showEditedCB ();
+ pixelShiftRedBlueWeight->showEditedCB ();
}
void BayerProcess::setDefaults(const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited)
@@ -427,6 +542,9 @@ void BayerProcess::setDefaults(const rtengine::procparams::ProcParams* defParams
pixelShiftEperIso->setDefault( defParams->raw.bayersensor.pixelShiftEperIso);
pixelShiftNreadIso->setDefault( defParams->raw.bayersensor.pixelShiftNreadIso);
pixelShiftPrnu->setDefault( defParams->raw.bayersensor.pixelShiftPrnu);
+ pixelShiftSigma->setDefault( defParams->raw.bayersensor.pixelShiftSigma);
+ pixelShiftSum->setDefault( defParams->raw.bayersensor.pixelShiftSum);
+ pixelShiftRedBlueWeight->setDefault( defParams->raw.bayersensor.pixelShiftRedBlueWeight);
ccSteps->setDefault (defParams->raw.bayersensor.ccSteps);
if (pedited) {
@@ -439,6 +557,9 @@ void BayerProcess::setDefaults(const rtengine::procparams::ProcParams* defParams
pixelShiftEperIso->setDefaultEditedState( pedited->raw.bayersensor.pixelShiftEperIso ? Edited : UnEdited);
pixelShiftNreadIso->setDefaultEditedState( pedited->raw.bayersensor.pixelShiftNreadIso ? Edited : UnEdited);
pixelShiftPrnu->setDefaultEditedState( pedited->raw.bayersensor.pixelShiftPrnu ? Edited : UnEdited);
+ pixelShiftSigma->setDefaultEditedState( pedited->raw.bayersensor.pixelShiftSigma ? Edited : UnEdited);
+ pixelShiftSum->setDefaultEditedState( pedited->raw.bayersensor.pixelShiftSum ? Edited : UnEdited);
+ pixelShiftRedBlueWeight->setDefaultEditedState( pedited->raw.bayersensor.pixelShiftRedBlueWeight ? Edited : UnEdited);
ccSteps->setDefaultEditedState(pedited->raw.bayersensor.ccSteps ? Edited : UnEdited);
} else {
dcbIterations->setDefaultEditedState( Irrelevant );
@@ -450,6 +571,9 @@ void BayerProcess::setDefaults(const rtengine::procparams::ProcParams* defParams
pixelShiftEperIso->setDefaultEditedState( Irrelevant );
pixelShiftNreadIso->setDefaultEditedState( Irrelevant );
pixelShiftPrnu->setDefaultEditedState( Irrelevant );
+ pixelShiftSigma->setDefaultEditedState( Irrelevant );
+ pixelShiftSum->setDefaultEditedState( Irrelevant );
+ pixelShiftRedBlueWeight->setDefaultEditedState( Irrelevant );
ccSteps->setDefaultEditedState(Irrelevant );
}
}
@@ -477,6 +601,12 @@ void BayerProcess::adjusterChanged (Adjuster* a, double newval)
listener->panelChanged (EvPixelShiftNreadIso, a->getTextValue() );
} else if (a == pixelShiftPrnu) {
listener->panelChanged (EvPixelShiftPrnu, a->getTextValue() );
+ } else if (a == pixelShiftSigma) {
+ listener->panelChanged (EvPixelShiftSigma, a->getTextValue() );
+ } else if (a == pixelShiftSum) {
+ listener->panelChanged (EvPixelShiftSum, a->getTextValue() );
+ } else if (a == pixelShiftRedBlueWeight) {
+ listener->panelChanged (EvPixelShiftRedBlueWeight, a->getTextValue() );
}
}
}
@@ -631,12 +761,23 @@ void BayerProcess::pixelShiftAutomaticChanged ()
pixelShiftEperIso->set_sensitive(pixelShiftAutomatic->get_active ());
pixelShiftNreadIso->set_sensitive(pixelShiftAutomatic->get_active ());
pixelShiftPrnu->set_sensitive(pixelShiftAutomatic->get_active ());
+ pixelShiftSigma->set_sensitive(pixelShiftAutomatic->get_active ());
+ pixelShiftSum->set_sensitive(pixelShiftAutomatic->get_active ());
+ pixelShiftRedBlueWeight->set_sensitive(pixelShiftAutomatic->get_active ());
pixelShiftStddevFactorGreen->set_sensitive(pixelShiftAutomatic->get_active ());
pixelShiftStddevFactorRed->set_sensitive(pixelShiftAutomatic->get_active ());
pixelShiftStddevFactorBlue->set_sensitive(pixelShiftAutomatic->get_active ());
pixelShiftNonGreenHorizontal->set_sensitive(pixelShiftAutomatic->get_active ());
pixelShiftNonGreenVertical->set_sensitive(pixelShiftAutomatic->get_active ());
+ pixelShiftHoleFill->set_sensitive(pixelShiftAutomatic->get_active ());
+ pixelShiftMedian->set_sensitive(pixelShiftAutomatic->get_active ());
+ pixelShiftMedian3->set_sensitive(pixelShiftAutomatic->get_active () && pixelShiftMedian->get_active());
+ pixelShiftGreen->set_sensitive(pixelShiftAutomatic->get_active ());
+ pixelShiftBlur->set_sensitive(pixelShiftAutomatic->get_active ());
+ pixelShiftExp0->set_sensitive(pixelShiftAutomatic->get_active ());
pixelShiftNonGreenCross->set_sensitive(pixelShiftAutomatic->get_active ());
+ pixelShiftNonGreenCross2->set_sensitive(pixelShiftAutomatic->get_active ());
+ pixelShiftNonGreenAmaze->set_sensitive(pixelShiftAutomatic->get_active ());
if (listener) {
listener->panelChanged (EvPixelShiftAutomatic, pixelShiftAutomatic->get_active() ? M("GENERAL_ENABLED") : M("GENERAL_DISABLED"));
@@ -684,6 +825,128 @@ void BayerProcess::pixelShiftNonGreenVerticalChanged ()
}
}
+void BayerProcess::pixelShiftHoleFillChanged ()
+{
+ if (batchMode) {
+ if (pixelShiftHoleFill->get_inconsistent()) {
+ pixelShiftHoleFill->set_inconsistent (false);
+ pixelShiftHoleFillconn.block (true);
+ pixelShiftHoleFill->set_active (false);
+ pixelShiftHoleFillconn.block (false);
+ } else if (lastDCBen) {
+ pixelShiftHoleFill->set_inconsistent (true);
+ }
+
+ lastDCBen = pixelShiftHoleFill->get_active ();
+ }
+
+ if (listener) {
+ listener->panelChanged (EvPixelShiftHoleFill, pixelShiftHoleFill->get_active() ? M("GENERAL_ENABLED") : M("GENERAL_DISABLED"));
+ }
+}
+
+void BayerProcess::pixelShiftMedianChanged ()
+{
+ if (batchMode) {
+ if (pixelShiftMedian->get_inconsistent()) {
+ pixelShiftMedian->set_inconsistent (false);
+ pixelShiftMedianconn.block (true);
+ pixelShiftMedian->set_active (false);
+ pixelShiftMedianconn.block (false);
+ } else if (lastDCBen) {
+ pixelShiftMedian->set_inconsistent (true);
+ }
+
+ lastDCBen = pixelShiftMedian->get_active ();
+ }
+
+ pixelShiftMedian3->set_sensitive(pixelShiftMedian->get_active ());
+
+ if (listener) {
+ listener->panelChanged (EvPixelShiftMedian, pixelShiftMedian->get_active() ? M("GENERAL_ENABLED") : M("GENERAL_DISABLED"));
+ }
+}
+
+void BayerProcess::pixelShiftMedian3Changed ()
+{
+ if (batchMode) {
+ if (pixelShiftMedian3->get_inconsistent()) {
+ pixelShiftMedian3->set_inconsistent (false);
+ pixelShiftMedian3conn.block (true);
+ pixelShiftMedian3->set_active (false);
+ pixelShiftMedian3conn.block (false);
+ } else if (lastDCBen) {
+ pixelShiftMedian3->set_inconsistent (true);
+ }
+
+ lastDCBen = pixelShiftMedian3->get_active ();
+ }
+
+ if (listener) {
+ listener->panelChanged (EvPixelShiftMedian3, pixelShiftMedian3->get_active() ? M("GENERAL_ENABLED") : M("GENERAL_DISABLED"));
+ }
+}
+
+void BayerProcess::pixelShiftGreenChanged ()
+{
+ if (batchMode) {
+ if (pixelShiftGreen->get_inconsistent()) {
+ pixelShiftGreen->set_inconsistent (false);
+ pixelShiftGreenconn.block (true);
+ pixelShiftGreen->set_active (false);
+ pixelShiftGreenconn.block (false);
+ } else if (lastDCBen) {
+ pixelShiftGreen->set_inconsistent (true);
+ }
+
+ lastDCBen = pixelShiftGreen->get_active ();
+ }
+
+ if (listener) {
+ listener->panelChanged (EvPixelShiftGreen, pixelShiftGreen->get_active() ? M("GENERAL_ENABLED") : M("GENERAL_DISABLED"));
+ }
+}
+
+void BayerProcess::pixelShiftBlurChanged ()
+{
+ if (batchMode) {
+ if (pixelShiftBlur->get_inconsistent()) {
+ pixelShiftBlur->set_inconsistent (false);
+ pixelShiftBlurconn.block (true);
+ pixelShiftBlur->set_active (false);
+ pixelShiftBlurconn.block (false);
+ } else if (lastDCBen) {
+ pixelShiftBlur->set_inconsistent (true);
+ }
+
+ lastDCBen = pixelShiftBlur->get_active ();
+ }
+
+ if (listener) {
+ listener->panelChanged (EvPixelShiftBlur, pixelShiftBlur->get_active() ? M("GENERAL_ENABLED") : M("GENERAL_DISABLED"));
+ }
+}
+
+void BayerProcess::pixelShiftExp0Changed ()
+{
+ if (batchMode) {
+ if (pixelShiftExp0->get_inconsistent()) {
+ pixelShiftExp0->set_inconsistent (false);
+ pixelShiftExp0conn.block (true);
+ pixelShiftExp0->set_active (false);
+ pixelShiftExp0conn.block (false);
+ } else if (lastDCBen) {
+ pixelShiftExp0->set_inconsistent (true);
+ }
+
+ lastDCBen = pixelShiftExp0->get_active ();
+ }
+
+ if (listener) {
+ listener->panelChanged (EvPixelShiftExp0, pixelShiftExp0->get_active() ? M("GENERAL_ENABLED") : M("GENERAL_DISABLED"));
+ }
+}
+
void BayerProcess::pixelShiftNonGreenCrossChanged ()
{
if (batchMode) {
@@ -704,21 +967,42 @@ void BayerProcess::pixelShiftNonGreenCrossChanged ()
}
}
-
-/*void BayerProcess::allEnhanceChanged ()
+void BayerProcess::pixelShiftNonGreenCross2Changed ()
{
if (batchMode) {
- if (allEnhance->get_inconsistent()) {
- allEnhance->set_inconsistent (false);
- allEnhconn.block (true);
- allEnhance->set_active (false);
- allEnhconn.block (false);
+ if (pixelShiftNonGreenCross2->get_inconsistent()) {
+ pixelShiftNonGreenCross2->set_inconsistent (false);
+ pixelShiftNonGreenCross2conn.block (true);
+ pixelShiftNonGreenCross2->set_active (false);
+ pixelShiftNonGreenCross2conn.block (false);
+ } else if (lastDCBen) {
+ pixelShiftNonGreenCross2->set_inconsistent (true);
}
- else if (lastALLen)
- allEnhance->set_inconsistent (true);
- lastALLen = allEnhance->get_active ();
+ lastDCBen = pixelShiftNonGreenCross2->get_active ();
}
- if (listener)
- listener->panelChanged (EvDemosaicALLEnhanced, allEnhance->get_active()?M("GENERAL_ENABLED"):M("GENERAL_DISABLED"));
-}*/
+
+ if (listener) {
+ listener->panelChanged (EvPixelShiftGreenAmaze, pixelShiftNonGreenCross2->get_active() ? M("GENERAL_ENABLED") : M("GENERAL_DISABLED"));
+ }
+}
+
+void BayerProcess::pixelShiftNonGreenAmazeChanged ()
+{
+ if (batchMode) {
+ if (pixelShiftNonGreenAmaze->get_inconsistent()) {
+ pixelShiftNonGreenAmaze->set_inconsistent (false);
+ pixelShiftNonGreenAmazeconn.block (true);
+ pixelShiftNonGreenAmaze->set_active (false);
+ pixelShiftNonGreenAmazeconn.block (false);
+ } else if (lastDCBen) {
+ pixelShiftNonGreenAmaze->set_inconsistent (true);
+ }
+
+ lastDCBen = pixelShiftNonGreenAmaze->get_active ();
+ }
+
+ if (listener) {
+ listener->panelChanged (EvPixelShiftNonGreenAmaze, pixelShiftNonGreenAmaze->get_active() ? M("GENERAL_ENABLED") : M("GENERAL_DISABLED"));
+ }
+}
diff --git a/rtgui/bayerprocess.h b/rtgui/bayerprocess.h
index ca560ad89..79593debf 100644
--- a/rtgui/bayerprocess.h
+++ b/rtgui/bayerprocess.h
@@ -50,16 +50,30 @@ protected:
Gtk::CheckButton* pixelShiftNonGreenHorizontal;
Gtk::CheckButton* pixelShiftNonGreenVertical;
Gtk::CheckButton* pixelShiftNonGreenCross;
+ Gtk::CheckButton* pixelShiftNonGreenCross2;
+ Gtk::CheckButton* pixelShiftNonGreenAmaze;
+ Gtk::CheckButton* pixelShiftGreen;
+ Gtk::CheckButton* pixelShiftBlur;
+ Gtk::CheckButton* pixelShiftExp0;
+ Gtk::CheckButton* pixelShiftHoleFill;
+ Gtk::CheckButton* pixelShiftMedian;
+ Gtk::CheckButton* pixelShiftMedian3;
Adjuster* pixelShiftStddevFactorGreen;
Adjuster* pixelShiftStddevFactorRed;
Adjuster* pixelShiftStddevFactorBlue;
Adjuster* pixelShiftEperIso;
Adjuster* pixelShiftNreadIso;
Adjuster* pixelShiftPrnu;
+ Adjuster* pixelShiftSigma;
+ Adjuster* pixelShiftSum;
+ Adjuster* pixelShiftRedBlueWeight;
bool lastDCBen;
int oldMethod;
//bool lastALLen;
- sigc::connection methodconn, imagenumberconn, psmcconn, dcbEnhconn, pixelShiftShowMotionconn, pixelShiftShowMotionMaskOnlyconn, pixelShiftAutomaticconn, pixelShiftNonGreenHorizontalconn, pixelShiftNonGreenVerticalconn, pixelShiftNonGreenCrossconn; //,allEnhconn;
+ sigc::connection methodconn, imagenumberconn, psmcconn, dcbEnhconn,
+ pixelShiftShowMotionconn, pixelShiftShowMotionMaskOnlyconn, pixelShiftAutomaticconn,
+ pixelShiftNonGreenHorizontalconn, pixelShiftNonGreenVerticalconn, pixelShiftHoleFillconn, pixelShiftMedianconn, pixelShiftMedian3conn, pixelShiftNonGreenCrossconn,
+ pixelShiftNonGreenCross2conn, pixelShiftNonGreenAmazeconn, pixelShiftGreenconn, pixelShiftBlurconn, pixelShiftExp0conn;
public:
BayerProcess ();
@@ -79,8 +93,15 @@ public:
void pixelShiftAutomaticChanged();
void pixelShiftNonGreenHorizontalChanged();
void pixelShiftNonGreenVerticalChanged();
+ void pixelShiftHoleFillChanged();
+ void pixelShiftMedianChanged();
+ void pixelShiftMedian3Changed();
+ void pixelShiftGreenChanged();
+ void pixelShiftBlurChanged();
+ void pixelShiftExp0Changed();
void pixelShiftNonGreenCrossChanged();
- //void allEnhanceChanged();
+ void pixelShiftNonGreenCross2Changed();
+ void pixelShiftNonGreenAmazeChanged();
};
#endif
diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc
index f433ec639..b6127b7d2 100644
--- a/rtgui/paramsedited.cc
+++ b/rtgui/paramsedited.cc
@@ -378,12 +378,23 @@ void ParamsEdited::set (bool v)
raw.bayersensor.pixelShiftEperIso = v;
raw.bayersensor.pixelShiftNreadIso = v;
raw.bayersensor.pixelShiftPrnu = v;
+ raw.bayersensor.pixelShiftSigma = v;
+ raw.bayersensor.pixelShiftSum = v;
+ raw.bayersensor.pixelShiftRedBlueWeight = v;
raw.bayersensor.pixelshiftShowMotion = v;
raw.bayersensor.pixelshiftShowMotionMaskOnly = v;
raw.bayersensor.pixelShiftAutomatic = v;
raw.bayersensor.pixelShiftNonGreenHorizontal = v;
raw.bayersensor.pixelShiftNonGreenVertical = v;
+ raw.bayersensor.pixelShiftHoleFill = v;
+ raw.bayersensor.pixelShiftMedian = v;
+ raw.bayersensor.pixelShiftMedian3 = v;
+ raw.bayersensor.pixelShiftGreen = v;
+ raw.bayersensor.pixelShiftBlur = v;
+ raw.bayersensor.pixelShiftExp0 = v;
raw.bayersensor.pixelShiftNonGreenCross = v;
+ raw.bayersensor.pixelShiftNonGreenCross2 = v;
+ raw.bayersensor.pixelShiftNonGreenAmaze = v;
raw.bayersensor.greenEq = v;
raw.bayersensor.linenoise = v;
raw.xtranssensor.method = v;
@@ -888,12 +899,23 @@ void ParamsEdited::initFrom (const std::vector
raw.bayersensor.pixelShiftEperIso = raw.bayersensor.pixelShiftEperIso && p.raw.bayersensor.pixelShiftEperIso == other.raw.bayersensor.pixelShiftEperIso;
raw.bayersensor.pixelShiftNreadIso = raw.bayersensor.pixelShiftNreadIso && p.raw.bayersensor.pixelShiftNreadIso == other.raw.bayersensor.pixelShiftNreadIso;
raw.bayersensor.pixelShiftPrnu = raw.bayersensor.pixelShiftPrnu && p.raw.bayersensor.pixelShiftPrnu == other.raw.bayersensor.pixelShiftPrnu;
+ raw.bayersensor.pixelShiftSigma = raw.bayersensor.pixelShiftSigma && p.raw.bayersensor.pixelShiftSigma == other.raw.bayersensor.pixelShiftSigma;
+ raw.bayersensor.pixelShiftSum = raw.bayersensor.pixelShiftSum && p.raw.bayersensor.pixelShiftSum == other.raw.bayersensor.pixelShiftSum;
+ raw.bayersensor.pixelShiftRedBlueWeight = raw.bayersensor.pixelShiftRedBlueWeight && p.raw.bayersensor.pixelShiftRedBlueWeight == other.raw.bayersensor.pixelShiftRedBlueWeight;
raw.bayersensor.pixelshiftShowMotion = raw.bayersensor.pixelshiftShowMotion && p.raw.bayersensor.pixelshiftShowMotion == other.raw.bayersensor.pixelshiftShowMotion;
raw.bayersensor.pixelshiftShowMotionMaskOnly = raw.bayersensor.pixelshiftShowMotionMaskOnly && p.raw.bayersensor.pixelshiftShowMotionMaskOnly == other.raw.bayersensor.pixelshiftShowMotionMaskOnly;
raw.bayersensor.pixelShiftAutomatic = raw.bayersensor.pixelShiftAutomatic && p.raw.bayersensor.pixelShiftAutomatic == other.raw.bayersensor.pixelShiftAutomatic;
raw.bayersensor.pixelShiftNonGreenHorizontal = raw.bayersensor.pixelShiftNonGreenHorizontal && p.raw.bayersensor.pixelShiftNonGreenHorizontal == other.raw.bayersensor.pixelShiftNonGreenHorizontal;
raw.bayersensor.pixelShiftNonGreenVertical = raw.bayersensor.pixelShiftNonGreenVertical && p.raw.bayersensor.pixelShiftNonGreenVertical == other.raw.bayersensor.pixelShiftNonGreenVertical;
+ raw.bayersensor.pixelShiftHoleFill = raw.bayersensor.pixelShiftHoleFill && p.raw.bayersensor.pixelShiftHoleFill == other.raw.bayersensor.pixelShiftHoleFill;
+ raw.bayersensor.pixelShiftMedian = raw.bayersensor.pixelShiftMedian && p.raw.bayersensor.pixelShiftMedian == other.raw.bayersensor.pixelShiftMedian;
+ raw.bayersensor.pixelShiftMedian3 = raw.bayersensor.pixelShiftMedian3 && p.raw.bayersensor.pixelShiftMedian3 == other.raw.bayersensor.pixelShiftMedian3;
+ raw.bayersensor.pixelShiftGreen = raw.bayersensor.pixelShiftGreen && p.raw.bayersensor.pixelShiftGreen == other.raw.bayersensor.pixelShiftGreen;
+ raw.bayersensor.pixelShiftBlur = raw.bayersensor.pixelShiftBlur && p.raw.bayersensor.pixelShiftBlur == other.raw.bayersensor.pixelShiftBlur;
+ raw.bayersensor.pixelShiftExp0 = raw.bayersensor.pixelShiftExp0 && p.raw.bayersensor.pixelShiftExp0 == other.raw.bayersensor.pixelShiftExp0;
raw.bayersensor.pixelShiftNonGreenCross = raw.bayersensor.pixelShiftNonGreenCross && p.raw.bayersensor.pixelShiftNonGreenCross == other.raw.bayersensor.pixelShiftNonGreenCross;
+ raw.bayersensor.pixelShiftNonGreenCross2 = raw.bayersensor.pixelShiftNonGreenCross2 && p.raw.bayersensor.pixelShiftNonGreenCross2 == other.raw.bayersensor.pixelShiftNonGreenCross2;
+ raw.bayersensor.pixelShiftNonGreenAmaze = raw.bayersensor.pixelShiftNonGreenAmaze && p.raw.bayersensor.pixelShiftNonGreenAmaze == other.raw.bayersensor.pixelShiftNonGreenAmaze;
raw.bayersensor.greenEq = raw.bayersensor.greenEq && p.raw.bayersensor.greenthresh == other.raw.bayersensor.greenthresh;
raw.bayersensor.linenoise = raw.bayersensor.linenoise && p.raw.bayersensor.linenoise == other.raw.bayersensor.linenoise;
raw.xtranssensor.method = raw.xtranssensor.method && p.raw.xtranssensor.method == other.raw.xtranssensor.method;
@@ -2338,6 +2360,18 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten
toEdit.raw.bayersensor.pixelShiftPrnu = mods.raw.bayersensor.pixelShiftPrnu;
}
+ if (raw.bayersensor.pixelShiftSigma) {
+ toEdit.raw.bayersensor.pixelShiftSigma = mods.raw.bayersensor.pixelShiftSigma;
+ }
+
+ if (raw.bayersensor.pixelShiftSum) {
+ toEdit.raw.bayersensor.pixelShiftSum = mods.raw.bayersensor.pixelShiftSum;
+ }
+
+ if (raw.bayersensor.pixelShiftRedBlueWeight) {
+ toEdit.raw.bayersensor.pixelShiftRedBlueWeight = mods.raw.bayersensor.pixelShiftRedBlueWeight;
+ }
+
if (raw.bayersensor.pixelshiftShowMotion) {
toEdit.raw.bayersensor.pixelshiftShowMotion = mods.raw.bayersensor.pixelshiftShowMotion;
}
@@ -2358,11 +2392,42 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten
toEdit.raw.bayersensor.pixelShiftNonGreenVertical = mods.raw.bayersensor.pixelShiftNonGreenVertical;
}
+ if (raw.bayersensor.pixelShiftHoleFill) {
+ toEdit.raw.bayersensor.pixelShiftHoleFill = mods.raw.bayersensor.pixelShiftHoleFill;
+ }
+
+ if (raw.bayersensor.pixelShiftMedian) {
+ toEdit.raw.bayersensor.pixelShiftMedian = mods.raw.bayersensor.pixelShiftMedian;
+ }
+
+ if (raw.bayersensor.pixelShiftMedian3) {
+ toEdit.raw.bayersensor.pixelShiftMedian3 = mods.raw.bayersensor.pixelShiftMedian3;
+ }
+
+ if (raw.bayersensor.pixelShiftGreen) {
+ toEdit.raw.bayersensor.pixelShiftGreen = mods.raw.bayersensor.pixelShiftGreen;
+ }
+
+ if (raw.bayersensor.pixelShiftBlur) {
+ toEdit.raw.bayersensor.pixelShiftBlur = mods.raw.bayersensor.pixelShiftBlur;
+ }
+
+ if (raw.bayersensor.pixelShiftExp0) {
+ toEdit.raw.bayersensor.pixelShiftExp0 = mods.raw.bayersensor.pixelShiftExp0;
+ }
+
if (raw.bayersensor.pixelShiftNonGreenCross) {
toEdit.raw.bayersensor.pixelShiftNonGreenCross = mods.raw.bayersensor.pixelShiftNonGreenCross;
}
- //if (raw.bayersensor.allEnhance) toEdit.raw.bayersensor.all_enhance = mods.raw.bayersensor.all_enhance;
+ if (raw.bayersensor.pixelShiftNonGreenCross2) {
+ toEdit.raw.bayersensor.pixelShiftNonGreenCross2 = mods.raw.bayersensor.pixelShiftNonGreenCross2;
+ }
+
+ if (raw.bayersensor.pixelShiftNonGreenAmaze) {
+ toEdit.raw.bayersensor.pixelShiftNonGreenAmaze = mods.raw.bayersensor.pixelShiftNonGreenAmaze;
+ }
+
if (raw.bayersensor.greenEq) {
toEdit.raw.bayersensor.greenthresh = dontforceSet && options.baBehav[ADDSET_PREPROCESS_GREENEQUIL] ? toEdit.raw.bayersensor.greenthresh + mods.raw.bayersensor.greenthresh : mods.raw.bayersensor.greenthresh;
}
@@ -2874,8 +2939,8 @@ bool RAWParamsEdited::BayerSensor::isUnchanged() const
{
return method && imageNum && dcbIterations && dcbEnhance && lmmseIterations/*&& allEnhance*/ && greenEq
&& pixelShiftMotion && pixelShiftMotionCorrection && pixelShiftStddevFactorGreen && pixelShiftStddevFactorRed && pixelShiftStddevFactorBlue && pixelShiftEperIso
- && pixelShiftNreadIso && pixelShiftPrnu && pixelshiftShowMotion && pixelshiftShowMotionMaskOnly
- && pixelShiftAutomatic && pixelShiftNonGreenHorizontal && pixelShiftNonGreenVertical && pixelShiftNonGreenCross
+ && pixelShiftNreadIso && pixelShiftPrnu && pixelShiftSigma && pixelShiftSum && pixelShiftRedBlueWeight && pixelshiftShowMotion && pixelshiftShowMotionMaskOnly
+ && pixelShiftAutomatic && pixelShiftNonGreenHorizontal && pixelShiftNonGreenVertical && pixelShiftHoleFill && pixelShiftMedian && pixelShiftMedian3 && pixelShiftNonGreenCross && pixelShiftNonGreenCross2 && pixelShiftNonGreenAmaze && pixelShiftGreen && pixelShiftBlur && pixelShiftExp0
&& linenoise && exBlack0 && exBlack1 && exBlack2 && exBlack3 && exTwoGreen;
}
diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h
index b4af2ad05..6a72f9ffa 100644
--- a/rtgui/paramsedited.h
+++ b/rtgui/paramsedited.h
@@ -700,12 +700,23 @@ public:
bool pixelShiftEperIso;
bool pixelShiftNreadIso;
bool pixelShiftPrnu;
+ bool pixelShiftSigma;
+ bool pixelShiftSum;
+ bool pixelShiftRedBlueWeight;
bool pixelshiftShowMotion;
bool pixelshiftShowMotionMaskOnly;
bool pixelShiftAutomatic;
bool pixelShiftNonGreenHorizontal;
bool pixelShiftNonGreenVertical;
+ bool pixelShiftHoleFill;
+ bool pixelShiftMedian;
+ bool pixelShiftMedian3;
+ bool pixelShiftGreen;
+ bool pixelShiftBlur;
+ bool pixelShiftExp0;
bool pixelShiftNonGreenCross;
+ bool pixelShiftNonGreenCross2;
+ bool pixelShiftNonGreenAmaze;
//bool allEnhance;
bool greenEq;