pixelshift: optional red/blue check

This commit is contained in:
heckflosse 2016-11-27 18:42:58 +01:00
parent 9bcb347a3b
commit ac5bad2de1
14 changed files with 218 additions and 121 deletions

View File

@ -1655,6 +1655,7 @@ TP_RAW_LABEL;Demosaicing
TP_RAW_LMMSEITERATIONS;LMMSE enhancement steps TP_RAW_LMMSEITERATIONS;LMMSE enhancement steps
TP_RAW_LMMSE_TOOLTIP;Adds gamma (step 1), median (steps 2-4) and refinement (steps 5-6) to reduce artifacts and improve the signal-to-noise ratio. TP_RAW_LMMSE_TOOLTIP;Adds gamma (step 1), median (steps 2-4) and refinement (steps 5-6) to reduce artifacts and improve the signal-to-noise ratio.
TP_RAW_PIXELSHIFTADAPTIVE;Adaptive detection TP_RAW_PIXELSHIFTADAPTIVE;Adaptive detection
TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Check red/blue horizontal
TP_RAW_PIXELSHIFTMOTION;Pixelshift motion detection TP_RAW_PIXELSHIFTMOTION;Pixelshift motion detection
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_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_PIXELSHIFTMOTIONCORRECTION;Pixelshift motion correction TP_RAW_PIXELSHIFTMOTIONCORRECTION;Pixelshift motion correction

View File

@ -144,7 +144,7 @@ void dfInfo::updateRawImage()
} else { } else {
int H = ri->get_height(); int H = ri->get_height();
int W = ri->get_width(); int W = ri->get_width();
ri->compress_image(); ri->compress_image(0);
int rSize = W * ((ri->getSensorType() == ST_BAYER || ri->getSensorType() == ST_FUJI_XTRANS) ? 1 : 3); int rSize = W * ((ri->getSensorType() == ST_BAYER || ri->getSensorType() == ST_FUJI_XTRANS) ? 1 : 3);
acc_t **acc = new acc_t*[H]; acc_t **acc = new acc_t*[H];
@ -164,7 +164,7 @@ void dfInfo::updateRawImage()
RawImage* temp = new RawImage(*iName); RawImage* temp = new RawImage(*iName);
if( !temp->loadRaw(true)) { if( !temp->loadRaw(true)) {
temp->compress_image(); //\ TODO would be better working on original, because is temporary temp->compress_image(0); //\ TODO would be better working on original, because is temporary
nFiles++; nFiles++;
if( ri->getSensorType() == ST_BAYER || ri->getSensorType() == ST_FUJI_XTRANS ) { if( ri->getSensorType() == ST_BAYER || ri->getSensorType() == ST_FUJI_XTRANS ) {
@ -204,7 +204,7 @@ void dfInfo::updateRawImage()
delete ri; delete ri;
ri = nullptr; ri = nullptr;
} else { } else {
ri->compress_image(); ri->compress_image(0);
} }
} }
} }

View File

@ -136,7 +136,7 @@ void ffInfo::updateRawImage()
} else { } else {
int H = ri->get_height(); int H = ri->get_height();
int W = ri->get_width(); int W = ri->get_width();
ri->compress_image(); ri->compress_image(0);
int rSize = W * ((ri->getSensorType() == ST_BAYER || ri->getSensorType() == ST_FUJI_XTRANS) ? 1 : 3); int rSize = W * ((ri->getSensorType() == ST_BAYER || ri->getSensorType() == ST_FUJI_XTRANS) ? 1 : 3);
acc_t **acc = new acc_t*[H]; acc_t **acc = new acc_t*[H];
@ -156,7 +156,7 @@ void ffInfo::updateRawImage()
RawImage* temp = new RawImage(*iName); RawImage* temp = new RawImage(*iName);
if( !temp->loadRaw(true)) { if( !temp->loadRaw(true)) {
temp->compress_image(); //\ TODO would be better working on original, because is temporary temp->compress_image(0); //\ TODO would be better working on original, because is temporary
nFiles++; nFiles++;
if( ri->getSensorType() == ST_BAYER || ri->getSensorType() == ST_FUJI_XTRANS ) { if( ri->getSensorType() == ST_BAYER || ri->getSensorType() == ST_FUJI_XTRANS ) {
@ -195,7 +195,7 @@ void ffInfo::updateRawImage()
delete ri; delete ri;
ri = nullptr; ri = nullptr;
} else { } else {
ri->compress_image(); ri->compress_image(0);
} }
} }

View File

@ -36,7 +36,7 @@
namespace namespace
{ {
float greenDiff(float a, float b, bool adaptive, float stddevFactor, float eperIso, float nreadIso, float prnu, bool showMotion) float colourDiff(float a, float b, bool adaptive, float stddevFactor, float eperIso, float nreadIso, float prnu, bool showMotion)
{ {
// calculate the difference between to green samples // calculate the difference between to green samples
if(adaptive) { if(adaptive) {
@ -68,7 +68,7 @@ float greenDiff(float a, float b, bool adaptive, float stddevFactor, float eperI
using namespace std; using namespace std;
using namespace rtengine; using namespace rtengine;
void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, bool detectMotion, int motion, bool showMotion, bool showOnlyMask, unsigned int frame, unsigned int gridSize, bool adaptive, float stddevFactor, float eperIso, float nreadIso, float prnu) void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, bool detectMotion, int motion, bool showMotion, bool showOnlyMask, unsigned int frame, unsigned int gridSize, bool adaptive, float stddevFactor, float eperIso, float nreadIso, float prnu, bool checkNonGreenHorizontal)
{ {
BENCHFUN BENCHFUN
@ -93,7 +93,8 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, bool det
const float scaleGreen = 1.f / scale_mul[1]; const float scaleGreen = 1.f / scale_mul[1];
eperIso *= (100.f / idata->getISOSpeed()); eperIso *= (100.f / idata->getISOSpeed());
eperIso *= scaleGreen;
float eperIsoGreen = eperIso * scaleGreen;
prnu /= 100.f; prnu /= 100.f;
stddevFactor *= stddevFactor; stddevFactor *= stddevFactor;
@ -104,9 +105,7 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, bool det
// For shades of green motion indicators // For shades of green motion indicators
const float blendFactor = (motion == 0.f ? 1.f : 1.f / (1.f - motionThreshold)); const float blendFactor = (motion == 0.f ? 1.f : 1.f / (1.f - motionThreshold));
// bool showOnlyMask = showMotion; bool checkNonGreen = true;
// bool checkRedBlue = (gridSize == 5);
// bool checkRedBlue = false;
unsigned int offsX = 0, offsY = 0; unsigned int offsX = 0, offsY = 0;
// We have to adjust the offsets for the selected subframe we use for areas with motion // We have to adjust the offsets for the selected subframe we use for areas with motion
switch (frame) { switch (frame) {
@ -128,6 +127,8 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, bool det
offsY = 0; offsY = 0;
} }
const float thresh = adaptive ? 0.f : motionThreshold;
#ifdef _OPENMP #ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16) #pragma omp parallel for schedule(dynamic,16)
#endif #endif
@ -138,10 +139,16 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, bool det
float *nonGreenDest1 = blue[i + offsY]; float *nonGreenDest1 = blue[i + offsY];
int j = winx + border - offsX; int j = winx + border - offsX;
int c = FC(i, j); int c = FC(i, j);
float scaleNonGreen0 = 1.f / scale_mul[0];
float scaleNonGreen2 = 1.f / scale_mul[2];
float eperIsoNonGreen0 = eperIso / scale_mul[0];
float eperIsoNonGreen2 = eperIso / scale_mul[2];
if (c == 2 || ((c & 1) && FC(i, j + 1) == 2)) { if (c == 2 || ((c & 1) && FC(i, j + 1) == 2)) {
// row with blue pixels => swap destination pointers for non green pixels // row with blue pixels => swap destination pointers for non green pixels
std::swap(nonGreenDest0, nonGreenDest1); std::swap(nonGreenDest0, nonGreenDest1);
std::swap(scaleNonGreen0, scaleNonGreen2);
std::swap(eperIsoNonGreen0, eperIsoNonGreen2);
} }
// offset to keep the code short. It changes its value between 0 and 1 for each iteration of the loop // offset to keep the code short. It changes its value between 0 and 1 for each iteration of the loop
@ -152,39 +159,39 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, bool det
if(detectMotion || adaptive) { if(detectMotion || adaptive) {
if(gridSize == 3) { if(gridSize == 3) {
// compute maximum of differences for first two columns of 3x3 grid // compute maximum of differences for first two columns of 3x3 grid
greenDifMax[0] = max(greenDiff(riFrames[0 + offset]->data[i + offset][j - 1], riFrames[2 + offset]->data[i - offset + 1][j], adaptive, stddevFactor, eperIso, nreadIso, prnu, showMotion), greenDifMax[0] = max(colourDiff(riFrames[0 + offset]->data[i + offset][j - 1], riFrames[2 + offset]->data[i - offset + 1][j], adaptive, stddevFactor, eperIsoGreen, nreadIso, prnu, showMotion),
greenDiff(riFrames[1 - offset]->data[i - offset][j - 1], riFrames[3 - offset]->data[i + offset - 1][j], adaptive, stddevFactor, eperIso, nreadIso, prnu, showMotion), colourDiff(riFrames[1 - offset]->data[i - offset][j - 1], riFrames[3 - offset]->data[i + offset - 1][j], adaptive, stddevFactor, eperIsoGreen, nreadIso, prnu, showMotion),
greenDiff(riFrames[1 - offset]->data[i - offset + 2][j - 1], riFrames[3 - offset]->data[i + offset + 1][j], adaptive, stddevFactor, eperIso, nreadIso, prnu, showMotion) colourDiff(riFrames[1 - offset]->data[i - offset + 2][j - 1], riFrames[3 - offset]->data[i + offset + 1][j], adaptive, stddevFactor, eperIsoGreen, nreadIso, prnu, showMotion)
); );
greenDifMax[1] = max(greenDiff(riFrames[1 - offset]->data[i - offset + 1][j], riFrames[3 - offset]->data[i + offset][j + 1], adaptive, stddevFactor, eperIso, nreadIso, prnu, showMotion), greenDifMax[1] = max(colourDiff(riFrames[1 - offset]->data[i - offset + 1][j], riFrames[3 - offset]->data[i + offset][j + 1], adaptive, stddevFactor, eperIsoGreen, nreadIso, prnu, showMotion),
greenDiff(riFrames[0 + offset]->data[i + offset - 1][j], riFrames[2 + offset]->data[i - offset][j + 1], adaptive, stddevFactor, eperIso, nreadIso, prnu, showMotion), colourDiff(riFrames[0 + offset]->data[i + offset - 1][j], riFrames[2 + offset]->data[i - offset][j + 1], adaptive, stddevFactor, eperIsoGreen, nreadIso, prnu, showMotion),
greenDiff(riFrames[0 + offset]->data[i + offset + 1][j], riFrames[2 + offset]->data[i - offset + 2][j + 1], adaptive, stddevFactor, eperIso, nreadIso, prnu, showMotion) colourDiff(riFrames[0 + offset]->data[i + offset + 1][j], riFrames[2 + offset]->data[i - offset + 2][j + 1], adaptive, stddevFactor, eperIsoGreen, nreadIso, prnu, showMotion)
); );
} else if(gridSize == 5) { } else if(gridSize == 5) {
// compute maximum of differences for first four columns of 5x5 grid // compute maximum of differences for first four columns of 5x5 grid
greenDifMax[0] = max(greenDiff(riFrames[1 - offset]->data[i - offset - 1][j-2], riFrames[3 - offset]->data[i + offset -2][j - 1], adaptive, stddevFactor, eperIso, nreadIso, prnu, showMotion), greenDifMax[0] = max(colourDiff(riFrames[1 - offset]->data[i - offset - 1][j-2], riFrames[3 - offset]->data[i + offset -2][j - 1], adaptive, stddevFactor, eperIsoGreen, nreadIso, prnu, showMotion),
greenDiff(riFrames[1 - offset]->data[i - offset + 1][j-2], riFrames[3 - offset]->data[i + offset][j - 1], adaptive, stddevFactor, eperIso, nreadIso, prnu, showMotion), colourDiff(riFrames[1 - offset]->data[i - offset + 1][j-2], riFrames[3 - offset]->data[i + offset][j - 1], adaptive, stddevFactor, eperIsoGreen, nreadIso, prnu, showMotion),
greenDiff(riFrames[1 - offset]->data[i - offset + 3][j-2], riFrames[3 - offset]->data[i + offset +2][j - 1], adaptive, stddevFactor, eperIso, nreadIso, prnu, showMotion), colourDiff(riFrames[1 - offset]->data[i - offset + 3][j-2], riFrames[3 - offset]->data[i + offset +2][j - 1], adaptive, stddevFactor, eperIsoGreen, nreadIso, prnu, showMotion),
greenDiff(riFrames[0 + offset]->data[i + offset - 1][j-2], riFrames[2 + offset]->data[i - offset][j - 1], adaptive, stddevFactor, eperIso, nreadIso, prnu, showMotion), colourDiff(riFrames[0 + offset]->data[i + offset - 1][j-2], riFrames[2 + offset]->data[i - offset][j - 1], adaptive, stddevFactor, eperIsoGreen, nreadIso, prnu, showMotion),
greenDiff(riFrames[0 + offset]->data[i + offset + 1][j-2], riFrames[2 + offset]->data[i - offset + 2][j - 1], adaptive, stddevFactor, eperIso, nreadIso, prnu, showMotion) colourDiff(riFrames[0 + offset]->data[i + offset + 1][j-2], riFrames[2 + offset]->data[i - offset + 2][j - 1], adaptive, stddevFactor, eperIsoGreen, nreadIso, prnu, showMotion)
); );
greenDifMax[1] = max(greenDiff(riFrames[0 + offset]->data[i + offset-2][j - 1], riFrames[2 + offset]->data[i - offset - 1][j], adaptive, stddevFactor, eperIso, nreadIso, prnu, showMotion), greenDifMax[1] = max(colourDiff(riFrames[0 + offset]->data[i + offset-2][j - 1], riFrames[2 + offset]->data[i - offset - 1][j], adaptive, stddevFactor, eperIsoGreen, nreadIso, prnu, showMotion),
greenDiff(riFrames[0 + offset]->data[i + offset][j - 1], riFrames[2 + offset]->data[i - offset + 1][j], adaptive, stddevFactor, eperIso, nreadIso, prnu, showMotion), colourDiff(riFrames[0 + offset]->data[i + offset][j - 1], riFrames[2 + offset]->data[i - offset + 1][j], adaptive, stddevFactor, eperIsoGreen, nreadIso, prnu, showMotion),
greenDiff(riFrames[0 + offset]->data[i + offset+2][j - 1], riFrames[2 + offset]->data[i - offset + 3][j], adaptive, stddevFactor, eperIso, nreadIso, prnu, showMotion), colourDiff(riFrames[0 + offset]->data[i + offset+2][j - 1], riFrames[2 + offset]->data[i - offset + 3][j], adaptive, stddevFactor, eperIsoGreen, nreadIso, prnu, showMotion),
greenDiff(riFrames[1 - offset]->data[i - offset][j - 1], riFrames[3 - offset]->data[i + offset - 1][j], adaptive, stddevFactor, eperIso, nreadIso, prnu, showMotion), colourDiff(riFrames[1 - offset]->data[i - offset][j - 1], riFrames[3 - offset]->data[i + offset - 1][j], adaptive, stddevFactor, eperIsoGreen, nreadIso, prnu, showMotion),
greenDiff(riFrames[1 - offset]->data[i - offset + 2][j - 1], riFrames[3 - offset]->data[i + offset + 1][j], adaptive, stddevFactor, eperIso, nreadIso, prnu, showMotion) colourDiff(riFrames[1 - offset]->data[i - offset + 2][j - 1], riFrames[3 - offset]->data[i + offset + 1][j], adaptive, stddevFactor, eperIsoGreen, nreadIso, prnu, showMotion)
); );
greenDifMax[2] = max(greenDiff(riFrames[1 - offset]->data[i - offset - 1][j], riFrames[3 - offset]->data[i + offset -2][j + 1], adaptive, stddevFactor, eperIso, nreadIso, prnu, showMotion), greenDifMax[2] = max(colourDiff(riFrames[1 - offset]->data[i - offset - 1][j], riFrames[3 - offset]->data[i + offset -2][j + 1], adaptive, stddevFactor, eperIsoGreen, nreadIso, prnu, showMotion),
greenDiff(riFrames[1 - offset]->data[i - offset + 1][j], riFrames[3 - offset]->data[i + offset][j + 1], adaptive, stddevFactor, eperIso, nreadIso, prnu, showMotion), colourDiff(riFrames[1 - offset]->data[i - offset + 1][j], riFrames[3 - offset]->data[i + offset][j + 1], adaptive, stddevFactor, eperIsoGreen, nreadIso, prnu, showMotion),
greenDiff(riFrames[1 - offset]->data[i - offset + 3][j], riFrames[3 - offset]->data[i + offset +2][j + 1], adaptive, stddevFactor, eperIso, nreadIso, prnu, showMotion), colourDiff(riFrames[1 - offset]->data[i - offset + 3][j], riFrames[3 - offset]->data[i + offset +2][j + 1], adaptive, stddevFactor, eperIsoGreen, nreadIso, prnu, showMotion),
greenDiff(riFrames[0 + offset]->data[i + offset - 1][j], riFrames[2 + offset]->data[i - offset][j + 1], adaptive, stddevFactor, eperIso, nreadIso, prnu, showMotion), colourDiff(riFrames[0 + offset]->data[i + offset - 1][j], riFrames[2 + offset]->data[i - offset][j + 1], adaptive, stddevFactor, eperIsoGreen, nreadIso, prnu, showMotion),
greenDiff(riFrames[0 + offset]->data[i + offset + 1][j], riFrames[2 + offset]->data[i - offset + 2][j + 1], adaptive, stddevFactor, eperIso, nreadIso, prnu, showMotion) colourDiff(riFrames[0 + offset]->data[i + offset + 1][j], riFrames[2 + offset]->data[i - offset + 2][j + 1], adaptive, stddevFactor, eperIsoGreen, nreadIso, prnu, showMotion)
); );
greenDifMax[3] = max(greenDiff(riFrames[0 + offset]->data[i + offset-2][j + 1], riFrames[2 + offset]->data[i - offset - 1][j+2], adaptive, stddevFactor, eperIso, nreadIso, prnu, showMotion), greenDifMax[3] = max(colourDiff(riFrames[0 + offset]->data[i + offset-2][j + 1], riFrames[2 + offset]->data[i - offset - 1][j+2], adaptive, stddevFactor, eperIsoGreen, nreadIso, prnu, showMotion),
greenDiff(riFrames[0 + offset]->data[i + offset][j + 1], riFrames[2 + offset]->data[i - offset + 1][j+2], adaptive, stddevFactor, eperIso, nreadIso, prnu, showMotion), colourDiff(riFrames[0 + offset]->data[i + offset][j + 1], riFrames[2 + offset]->data[i - offset + 1][j+2], adaptive, stddevFactor, eperIsoGreen, nreadIso, prnu, showMotion),
greenDiff(riFrames[0 + offset]->data[i + offset+2][j + 1], riFrames[2 + offset]->data[i - offset + 3][j+2], adaptive, stddevFactor, eperIso, nreadIso, prnu, showMotion), colourDiff(riFrames[0 + offset]->data[i + offset+2][j + 1], riFrames[2 + offset]->data[i - offset + 3][j+2], adaptive, stddevFactor, eperIsoGreen, nreadIso, prnu, showMotion),
greenDiff(riFrames[1 - offset]->data[i - offset][j + 1], riFrames[3 - offset]->data[i + offset - 1][j+2], adaptive, stddevFactor, eperIso, nreadIso, prnu, showMotion), colourDiff(riFrames[1 - offset]->data[i - offset][j + 1], riFrames[3 - offset]->data[i + offset - 1][j+2], adaptive, stddevFactor, eperIsoGreen, nreadIso, prnu, showMotion),
greenDiff(riFrames[1 - offset]->data[i - offset + 2][j +- 1], riFrames[3 - offset]->data[i + offset + 1][j+2], adaptive, stddevFactor, eperIso, nreadIso, prnu, showMotion) colourDiff(riFrames[1 - offset]->data[i - offset + 2][j +- 1], riFrames[3 - offset]->data[i + offset + 1][j+2], adaptive, stddevFactor, eperIsoGreen, nreadIso, prnu, showMotion)
); );
} }
} }
@ -193,6 +200,7 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, bool det
// this is the index for the last column of the grid. Obviously we have to start with gridSize - 1 // this is the index for the last column of the grid. Obviously we have to start with gridSize - 1
int lastIndex = gridSize - 1; int lastIndex = gridSize - 1;
float korr = 0.f;
for(; j < winw - (border + offsX); ++j) { for(; j < winw - (border + offsX); ++j) {
offset ^= 1; // 0 => 1 or 1 => 0 offset ^= 1; // 0 => 1 or 1 => 0
@ -202,22 +210,22 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, bool det
float gridMax; float gridMax;
if(gridSize == 1) { if(gridSize == 1) {
// compute difference for current pixel and skip next pixel, that's the method from dcrawps // compute difference for current pixel and skip next pixel, that's the method from dcrawps
gridMax = greenDiff(riFrames[1 - offset]->data[i - offset + 1][j], riFrames[3 - offset]->data[i + offset][j + 1], adaptive, stddevFactor, eperIso, nreadIso, prnu, showMotion); gridMax = colourDiff(riFrames[1 - offset]->data[i - offset + 1][j], riFrames[3 - offset]->data[i + offset][j + 1], adaptive, stddevFactor, eperIsoGreen, nreadIso, prnu, showMotion);
skipNext = !showMotion; skipNext = !showMotion;
} else if(gridSize == 3) { } else if(gridSize == 3) {
// compute maximum of differences for third column of 3x3 grid and save at position lastIndex // compute maximum of differences for third column of 3x3 grid and save at position lastIndex
greenDifMax[lastIndex] = max(greenDiff(riFrames[0 + offset]->data[i + offset][j + 1], riFrames[2 + offset]->data[i - offset + 1][j + 2], adaptive, stddevFactor, eperIso, nreadIso, prnu, showMotion), greenDifMax[lastIndex] = max(colourDiff(riFrames[0 + offset]->data[i + offset][j + 1], riFrames[2 + offset]->data[i - offset + 1][j + 2], adaptive, stddevFactor, eperIsoGreen, nreadIso, prnu, showMotion),
greenDiff(riFrames[1 - offset]->data[i - offset][j + 1], riFrames[3 - offset]->data[i + offset - 1][j + 2], adaptive, stddevFactor, eperIso, nreadIso, prnu, showMotion), colourDiff(riFrames[1 - offset]->data[i - offset][j + 1], riFrames[3 - offset]->data[i + offset - 1][j + 2], adaptive, stddevFactor, eperIsoGreen, nreadIso, prnu, showMotion),
greenDiff(riFrames[1 - offset]->data[i - offset + 2][j + 1], riFrames[3 - offset]->data[i + offset + 1][j + 2], adaptive, stddevFactor, eperIso, nreadIso, prnu, showMotion) colourDiff(riFrames[1 - offset]->data[i - offset + 2][j + 1], riFrames[3 - offset]->data[i + offset + 1][j + 2], adaptive, stddevFactor, eperIsoGreen, nreadIso, prnu, showMotion)
); );
gridMax = max(greenDifMax[0],greenDifMax[1],greenDifMax[2]); gridMax = max(greenDifMax[0],greenDifMax[1],greenDifMax[2]);
} else if(gridSize == 5) { } else if(gridSize == 5) {
// compute maximum of differences for fifth column of 5x5 grid and save at position lastIndex // compute maximum of differences for fifth column of 5x5 grid and save at position lastIndex
greenDifMax[lastIndex] = max(greenDiff(riFrames[1 - offset]->data[i - offset - 1][j+2], riFrames[3 - offset]->data[i + offset -2][j + 3], adaptive, stddevFactor, eperIso, nreadIso, prnu, showMotion), greenDifMax[lastIndex] = max(colourDiff(riFrames[1 - offset]->data[i - offset - 1][j+2], riFrames[3 - offset]->data[i + offset -2][j + 3], adaptive, stddevFactor, eperIsoGreen, nreadIso, prnu, showMotion),
greenDiff(riFrames[1 - offset]->data[i - offset + 1][j+2], riFrames[3 - offset]->data[i + offset][j + 3], adaptive, stddevFactor, eperIso, nreadIso, prnu, showMotion), colourDiff(riFrames[1 - offset]->data[i - offset + 1][j+2], riFrames[3 - offset]->data[i + offset][j + 3], adaptive, stddevFactor, eperIsoGreen, nreadIso, prnu, showMotion),
greenDiff(riFrames[1 - offset]->data[i - offset + 3][j+2], riFrames[3 - offset]->data[i + offset +2][j + 3], adaptive, stddevFactor, eperIso, nreadIso, prnu, showMotion), colourDiff(riFrames[1 - offset]->data[i - offset + 3][j+2], riFrames[3 - offset]->data[i + offset +2][j + 3], adaptive, stddevFactor, eperIsoGreen, nreadIso, prnu, showMotion),
greenDiff(riFrames[0 + offset]->data[i + offset - 1][j+2], riFrames[2 + offset]->data[i - offset][j + 3], adaptive, stddevFactor, eperIso, nreadIso, prnu, showMotion), colourDiff(riFrames[0 + offset]->data[i + offset - 1][j+2], riFrames[2 + offset]->data[i - offset][j + 3], adaptive, stddevFactor, eperIsoGreen, nreadIso, prnu, showMotion),
greenDiff(riFrames[0 + offset]->data[i + offset + 1][j+2], riFrames[2 + offset]->data[i - offset + 2][j + 3], adaptive, stddevFactor, eperIso, nreadIso, prnu, showMotion) colourDiff(riFrames[0 + offset]->data[i + offset + 1][j+2], riFrames[2 + offset]->data[i - offset + 2][j + 3], adaptive, stddevFactor, eperIsoGreen, nreadIso, prnu, showMotion)
); );
gridMax = max(greenDifMax[0],greenDifMax[1],greenDifMax[2],greenDifMax[3],greenDifMax[4]); gridMax = max(greenDifMax[0],greenDifMax[1],greenDifMax[2],greenDifMax[3],greenDifMax[4]);
} }
@ -226,14 +234,8 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, bool det
lastIndex = lastIndex == gridSize ? 0 : lastIndex; lastIndex = lastIndex == gridSize ? 0 : lastIndex;
// increase motion detection dependent on brightness // increase motion detection dependent on brightness
float korr; if(!adaptive) {
float thresh;
if(adaptive) {
korr = 0.f;
thresh = 0;
} else {
korr = log2Lut[((int)(riFrames[1 - offset]->data[i - offset + 1][j] * scaleGreen))>>1]; korr = log2Lut[((int)(riFrames[1 - offset]->data[i - offset + 1][j] * scaleGreen))>>1];
thresh = motionThreshold;
} }
if (gridMax > thresh - korr) { if (gridMax > thresh - korr) {
@ -260,6 +262,86 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, bool det
greenDest[j + offsX] = nonGreenDest0[j + offsX] = nonGreenDest1[j + offsX] = 0.f; greenDest[j + offsX] = nonGreenDest0[j + offsX] = nonGreenDest1[j + offsX] = 0.f;
continue; continue;
} }
if(adaptive && checkNonGreenHorizontal) {
float ng1 = riFrames[(offset << 1) + offset]->data[i][j + offset];
float ng0 = riFrames[((offset^1) << 1) + (offset^1)]->data[i][j + (offset^1)+1];
float ng2 = riFrames[((offset^1) << 1) + (offset^1)]->data[i][j + (offset^1)-1];
float diff0 = ng0 - ng1;
float diff2 = ng2 - ng1;
if(diff0 * diff2 >= 0.f) {
// float val = std::abs(diff0) > std::abs(diff2) ? ng0 : ng2;
float val = (ng0 + ng2) / 2.f;
float gridMax = colourDiff(ng1, val, true, stddevFactor, eperIsoNonGreen0, nreadIso, prnu, showMotion);
if(gridMax > 0.f) {
if(showMotion) {
float blend = gridMax * blendFactor;
if(!showOnlyMask) {
// if showMotion is enabled make the pixel green
nonGreenDest0[j + offsX] = 1000.f + 25000.f;
nonGreenDest1[j + offsX] = greenDest[j + offsX] = 0.f;
} else {
greenDest[j + offsX] = nonGreenDest0[j + offsX] = nonGreenDest1[j + offsX] = 1000.f + 25000.f;
}
}
continue;
}
}
ng1 = riFrames[2 - offset]->data[i + 1][j - offset + 1];
ng0 = riFrames[2 - (offset^1)]->data[i + 1][j - (offset^1) + 2];
ng2 = riFrames[2 - (offset^1)]->data[i + 1][j - (offset^1)];
diff0 = ng0 - ng1;
diff2 = ng2 - ng1;
if(diff0 * diff2 >= 0.f) {
// float val = std::abs(diff0) > std::abs(diff2) ? ng0 : ng2;
float val = (ng0 + ng2) / 2.f;
float gridMax = colourDiff(ng1, val, true, stddevFactor, eperIsoNonGreen2, nreadIso, prnu, showMotion);
if(gridMax > 0.f) {
if(showMotion) {
float blend = gridMax * blendFactor;
if(!showOnlyMask) {
nonGreenDest1[j + offsX] = 1000.f + 25000.f;
nonGreenDest0[j + offsX] = greenDest[j + offsX] = 0.f;
} else {
greenDest[j + offsX] = nonGreenDest0[j + offsX] = nonGreenDest1[j + offsX] = 1000.f + 25000.f;
}
}
continue;
}
}
// float ngDiff = nonGreenDiff(ng0,ng1,ng2);
// float korr = log2Lut[((int)(riFrames[(offset << 1) + offset]->data[i][j + offset] * scaleNonGreen0))>>1];
// if(ngDiff > 0.5f - korr) {
// if(showMotion) {
// if(!showOnlyMask) {
// // if showMotion is enabled make the pixel green
// nonGreenDest0[j + offsX] = 1000.f + 25000.f;
// nonGreenDest1[j + offsX] = greenDest[j + offsX] = 0.f;
// } else {
// greenDest[j + offsX] = nonGreenDest0[j + offsX] = nonGreenDest1[j + offsX] = 1000.f + 25000.f;
// }
// }
// continue;
// }
//
// ng1 = riFrames[2 - offset]->data[i + 1][j - offset + 1];
// ng0 = riFrames[2 - (offset^1)]->data[i + 1][j - (offset^1) + 2];
// ng2 = riFrames[2 - (offset^1)]->data[i + 1][j - (offset^1)];
// ngDiff = nonGreenDiff(ng0,ng1,ng2);
// korr = log2Lut[((int)(riFrames[2 - offset]->data[i + 1][j - offset + 1] * scaleNonGreen2))>>1];
// if(ngDiff > 0.5f - korr) {
// if(showMotion) {
// if(!showOnlyMask) {
// // if showMotion is enabled make the pixel green
// nonGreenDest0[j + offsX] = 1000.f + 25000.f;
// nonGreenDest1[j + offsX] = greenDest[j + offsX] = 0.f;
// } else {
// greenDest[j + offsX] = nonGreenDest0[j + offsX] = nonGreenDest1[j + offsX] = 1000.f + 25000.f;
// }
// }
// continue;
// }
}
} }
// if(false && detectMotion && checkRedBlue) { // if(false && detectMotion && checkRedBlue) {
@ -270,9 +352,9 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, bool det
// float diff2 = ng1 - ng2; // float diff2 = ng1 - ng2;
// float gridMax; // float gridMax;
// if(diff0 * diff2 > 0.f) { // if(diff0 * diff2 > 0.f) {
//// if(greenDiff(ng1, fabsf(diff0) < fabsf(diff2) ? ng0 : ng2) > motionThreshold ) { //// if(colourDiff(ng1, fabsf(diff0) < fabsf(diff2) ? ng0 : ng2) > motionThreshold ) {
// gridMax = greenDiff(ng1, std::max(ng0, ng2)); // gridMax = colourDiff(ng1, std::max(ng0, ng2));
//// gridMax = greenDiff(ng1, ((ng0 + ng2) / 2.f)); //// gridMax = colourDiff(ng1, ((ng0 + ng2) / 2.f));
// if(gridMax > motionThreshold ) { // if(gridMax > motionThreshold ) {
// float factor = 1.f / (1.f - motionThreshold); // float factor = 1.f / (1.f - motionThreshold);
// float blend = (gridMax - motionThreshold) * factor; // float blend = (gridMax - motionThreshold) * factor;
@ -309,9 +391,9 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, bool det
// diff0 = ng1 - ng0; // diff0 = ng1 - ng0;
// diff2 = ng1 - ng2; // diff2 = ng1 - ng2;
// if(signbit(diff0) == signbit(diff2)) { // if(signbit(diff0) == signbit(diff2)) {
//// if(greenDiff(ng1, fabsf(diff0) < fabsf(diff2) ? ng0 : ng2) > motionThreshold ) { //// if(colourDiff(ng1, fabsf(diff0) < fabsf(diff2) ? ng0 : ng2) > motionThreshold ) {
// gridMax = greenDiff(ng1, std::max(ng0, ng2)); // gridMax = colourDiff(ng1, std::max(ng0, ng2));
//// gridMax = greenDiff(ng1, ((ng0 + ng2) / 2.f)); //// gridMax = colourDiff(ng1, ((ng0 + ng2) / 2.f));
// if(gridMax > motionThreshold ) { // if(gridMax > motionThreshold ) {
// float factor = 1.f / (1.f - motionThreshold); // float factor = 1.f / (1.f - motionThreshold);
// float blend = (gridMax - motionThreshold) * factor; // float blend = (gridMax - motionThreshold) * factor;

View File

@ -885,7 +885,7 @@ void RAWParams::setDefaults()
bayersensor.dcb_enhance = true; bayersensor.dcb_enhance = true;
//bayersensor.all_enhance = false; //bayersensor.all_enhance = false;
bayersensor.lmmse_iterations = 2; bayersensor.lmmse_iterations = 2;
bayersensor.pixelshiftMotion = 70; bayersensor.pixelshiftMotion = 0;
bayersensor.pixelshiftMotionCorrection = 3; bayersensor.pixelshiftMotionCorrection = 3;
bayersensor.pixelShiftStddevFactor = 5.0; bayersensor.pixelShiftStddevFactor = 5.0;
bayersensor.pixelShiftEperIso = 0.75; bayersensor.pixelShiftEperIso = 0.75;
@ -894,6 +894,7 @@ void RAWParams::setDefaults()
bayersensor.pixelshiftShowMotion = false; bayersensor.pixelshiftShowMotion = false;
bayersensor.pixelshiftShowMotionMaskOnly = false; bayersensor.pixelshiftShowMotionMaskOnly = false;
bayersensor.pixelShiftAutomatic = true; bayersensor.pixelShiftAutomatic = true;
bayersensor.pixelShiftNonGreenHorizontal = false;
bayersensor.black0 = 0.0; bayersensor.black0 = 0.0;
bayersensor.black1 = 0.0; bayersensor.black1 = 0.0;
bayersensor.black2 = 0.0; bayersensor.black2 = 0.0;
@ -3409,6 +3410,10 @@ int ProcParams::save (const Glib::ustring &fname, const Glib::ustring &fname2, b
keyFile.set_boolean ("RAW Bayer", "pixelShiftAutomatic", raw.bayersensor.pixelShiftAutomatic ); keyFile.set_boolean ("RAW Bayer", "pixelShiftAutomatic", raw.bayersensor.pixelShiftAutomatic );
} }
if (!pedited || pedited->raw.bayersensor.pixelShiftNonGreenHorizontal) {
keyFile.set_boolean ("RAW Bayer", "pixelShiftNonGreenHorizontal", raw.bayersensor.pixelShiftNonGreenHorizontal );
}
//if (!pedited || pedited->raw.bayersensor.allEnhance) keyFile.set_boolean ("RAW Bayer", "ALLEnhance", raw.bayersensor.all_enhance ); //if (!pedited || pedited->raw.bayersensor.allEnhance) keyFile.set_boolean ("RAW Bayer", "ALLEnhance", raw.bayersensor.all_enhance );
if (!pedited || pedited->raw.xtranssensor.method) { if (!pedited || pedited->raw.xtranssensor.method) {
@ -7539,6 +7544,13 @@ int ProcParams::load (const Glib::ustring &fname, ParamsEdited* pedited)
} }
} }
if (keyFile.has_key ("RAW Bayer", "pixelShiftNonGreenHorizontal")) {
raw.bayersensor.pixelShiftNonGreenHorizontal = keyFile.get_boolean("RAW Bayer", "pixelShiftNonGreenHorizontal");
if (pedited) {
pedited->raw.bayersensor.pixelShiftNonGreenHorizontal = true;
}
}
//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", "ALLEnhance")) { raw.bayersensor.all_enhance = keyFile.get_boolean("RAW Bayer", "ALLEnhance"); if (pedited) pedited->raw.bayersensor.allEnhance = true; }
} }

View File

@ -1191,6 +1191,7 @@ public:
bool pixelshiftShowMotion; bool pixelshiftShowMotion;
bool pixelshiftShowMotionMaskOnly; bool pixelshiftShowMotionMaskOnly;
bool pixelShiftAutomatic; bool pixelShiftAutomatic;
bool pixelShiftNonGreenHorizontal;
bool dcb_enhance; bool dcb_enhance;
//bool all_enhance; //bool all_enhance;
}; };

View File

@ -659,7 +659,7 @@ int RawImage::loadRaw (bool loadData, unsigned int imageNum, bool closeFile, Pro
return 0; return 0;
} }
float** RawImage::compress_image() float** RawImage::compress_image(int frameNum)
{ {
if( !image ) { if( !image ) {
return nullptr; return nullptr;
@ -667,11 +667,12 @@ float** RawImage::compress_image()
if (isBayer() || isXtrans()) { if (isBayer() || isXtrans()) {
if (!allocation) { if (!allocation) {
allocation = new float[height * width]; // shift the beginning of all frames but the first by 32 floats to avoid cache miss conflicts on CPUs which have <= 4-way associative L1-Cache
allocation = new float[height * width + frameNum * 32];
data = new float*[height]; data = new float*[height];
for (int i = 0; i < height; i++) { for (int i = 0; i < height; i++) {
data[i] = allocation + i * width; data[i] = allocation + i * width + frameNum * 32;
} }
} }
} else if (colors == 1) { } else if (colors == 1) {

View File

@ -119,7 +119,7 @@ public:
{ {
return image; return image;
} }
float** compress_image(); // revert to compressed pixels format and release image data float** compress_image(int frameNum); // revert to compressed pixels format and release image data
float** data; // holds pixel values, data[i][j] corresponds to the ith row and jth column float** data; // holds pixel values, data[i][j] corresponds to the ith row and jth column
unsigned prefilters; // original filters saved ( used for 4 color processing ) unsigned prefilters; // original filters saved ( used for 4 color processing )
unsigned int getFrameCount() const { return is_raw; } unsigned int getFrameCount() const { return is_raw; }

View File

@ -37,7 +37,7 @@
#include <omp.h> #include <omp.h>
#endif #endif
#include "opthelper.h" #include "opthelper.h"
//#define BENCHMARK #define BENCHMARK
#include "StopWatch.h" #include "StopWatch.h"
#define clipretinex( val, minv, maxv ) (( val = (val < minv ? minv : val ) ) > maxv ? maxv : val ) #define clipretinex( val, minv, maxv ) (( val = (val < minv ? minv : val ) ) > maxv ? maxv : val )
#undef CLIPD #undef CLIPD
@ -1521,7 +1521,7 @@ StopWatch Stop1("decode");
{ {
int errCodeThr = 0; int errCodeThr = 0;
#ifdef _OPENMP #ifdef _OPENMP
#pragma omp for #pragma omp for nowait
#endif #endif
for(unsigned int i = 0; i < numFrames; ++i) { for(unsigned int i = 0; i < numFrames; ++i) {
if(i == 0) { if(i == 0) {
@ -1531,7 +1531,7 @@ StopWatch Stop1("decode");
riFrames[i] = new RawImage(fname); riFrames[i] = new RawImage(fname);
errCodeThr = riFrames[i]->loadRaw (true, i); errCodeThr = riFrames[i]->loadRaw (true, i);
} }
riFrames[i]->compress_image(); riFrames[i]->compress_image(i);
} }
#ifdef _OPENMP #ifdef _OPENMP
#pragma omp critical #pragma omp critical
@ -1966,7 +1966,7 @@ void RawImageSource::demosaic(const RAWParams &raw)
amaze_demosaic_RT (0, 0, W, H); // for non pixelshift files use amaze if pixelshift is selected. We need it also for motion correction 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) { 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.pixelShiftStddevFactor, raw.bayersensor.pixelShiftEperIso, raw.bayersensor.pixelShiftNreadIso, raw.bayersensor.pixelShiftPrnu); 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.pixelShiftStddevFactor, raw.bayersensor.pixelShiftEperIso, raw.bayersensor.pixelShiftNreadIso, raw.bayersensor.pixelShiftPrnu, raw.bayersensor.pixelShiftNonGreenHorizontal);
} }
} else if (raw.bayersensor.method == RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::dcb] ) { } else if (raw.bayersensor.method == RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::dcb] ) {
dcb_demosaic(raw.bayersensor.dcb_iterations, raw.bayersensor.dcb_enhance); dcb_demosaic(raw.bayersensor.dcb_iterations, raw.bayersensor.dcb_enhance);
@ -3520,63 +3520,23 @@ void RawImageSource::scaleColors(int winx, int winy, int winw, int winh, const R
void RawImageSource::scaleColors_pixelshift(int winx, int winy, int winw, int winh, const RAWParams &raw) void RawImageSource::scaleColors_pixelshift(int winx, int winy, int winw, int winh, const RAWParams &raw)
{ {
chmax[0] = chmax[1] = chmax[2] = chmax[3] = 0; //channel maxima BENCHFUN
float black_lev[4] = {0.f};//black level
//adjust black level (eg Canon)
bool isMono = false;
black_lev[0] = raw.bayersensor.black1; //R
black_lev[1] = raw.bayersensor.black0; //G1
black_lev[2] = raw.bayersensor.black2; //B
black_lev[3] = raw.bayersensor.black3; //G2
for(int i = 0; i < 4 ; i++) {
cblacksom[i] = max( c_black[i] + black_lev[i], 0.0f ); // adjust black level
}
initialGain = calculate_scale_mul(scale_mul, ref_pre_mul, c_white, cblacksom, isMono, ri->get_colors()); // recalculate scale colors with adjusted levels
//fprintf(stderr, "recalc: %f [%f %f %f %f]\n", initialGain, scale_mul[0], scale_mul[1], scale_mul[2], scale_mul[3]);
for(int i = 0; i < 4 ; i++) {
clmax[i] = (c_white[i] - cblacksom[i]) * scale_mul[i]; // raw clip level
}
// this seems strange, but it works
// scale image colors // scale image colors
#ifdef _OPENMP #ifdef _OPENMP
#pragma omp parallel #pragma omp parallel for schedule(dynamic,64) collapse(2)
#endif #endif
{ for(int frame = 0; frame < 4; ++frame) {
float tmpchmax[3];
tmpchmax[0] = tmpchmax[1] = tmpchmax[2] = 0.0f;
#ifdef _OPENMP
#pragma omp for nowait
#endif
for (int row = winy; row < winy + winh; row ++) for (int row = winy; row < winy + winh; row ++)
{ {
for (int col = winx; col < winx + winw; col++) { for (int col = winx; col < winx + winw; col++) {
int c = FC(row,col); int c = FC(row,col);
for(int frame = 0; frame < 4; ++frame) {
float val = (riFrames[frame]->data[row][col] - cblacksom[c]) * scale_mul[c]; float val = (riFrames[frame]->data[row][col] - cblacksom[c]) * scale_mul[c];
tmpchmax[c] = max(tmpchmax[c], val);
riFrames[frame]->data[row][col] = val; riFrames[frame]->data[row][col] = val;
} }
} }
} }
#ifdef _OPENMP
#pragma omp critical
#endif
{
chmax[0] = max(tmpchmax[0], chmax[0]);
chmax[1] = max(tmpchmax[1], chmax[1]);
chmax[2] = max(tmpchmax[2], chmax[2]);
}
}
pixelShiftColoursScaled = true; pixelShiftColoursScaled = true;
} }

View File

@ -263,7 +263,7 @@ protected:
void xtransborder_interpolate (int border); void xtransborder_interpolate (int border);
void xtrans_interpolate (const int passes, const bool useCieLab); void xtrans_interpolate (const int passes, const bool useCieLab);
void fast_xtrans_interpolate (); 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, unsigned int gridSize, bool adaptive, float stddevFactor, float eperIso, float nreadIso, float prnu); void pixelshift(int winx, int winy, int winw, int winh, bool detectMotion, int motion, bool showMotion, bool showOnlyMask, unsigned int frame, unsigned int gridSize, bool adaptive, float stddevFactor, float eperIso, float nreadIso, float prnu, bool checkNonGreenHorizontal);
void hflip (Imagefloat* im); void hflip (Imagefloat* im);
void vflip (Imagefloat* im); void vflip (Imagefloat* im);

View File

@ -92,6 +92,9 @@ BayerProcess::BayerProcess () : FoldableToolPanel(this, "bayerprocess", M("TP_RA
pixelShiftAutomatic = Gtk::manage (new Gtk::CheckButton(M("TP_RAW_PIXELSHIFTADAPTIVE"))); pixelShiftAutomatic = Gtk::manage (new Gtk::CheckButton(M("TP_RAW_PIXELSHIFTADAPTIVE")));
pixelShiftOptions->pack_start(*pixelShiftAutomatic); pixelShiftOptions->pack_start(*pixelShiftAutomatic);
pixelShiftNonGreenHorizontal = Gtk::manage (new Gtk::CheckButton(M("TP_RAW_PIXELSHIFTNONGREENHORIZONTAL")));
pixelShiftOptions->pack_start(*pixelShiftNonGreenHorizontal);
pixelShiftMotion = Gtk::manage (new Adjuster (M("TP_RAW_PIXELSHIFTMOTION"), 0, 100, 1, 70)); pixelShiftMotion = Gtk::manage (new Adjuster (M("TP_RAW_PIXELSHIFTMOTION"), 0, 100, 1, 70));
pixelShiftMotion->setAdjusterListener (this); pixelShiftMotion->setAdjusterListener (this);
pixelShiftMotion->set_tooltip_markup (M("TP_RAW_PIXELSHIFTMOTION_TOOLTIP")); pixelShiftMotion->set_tooltip_markup (M("TP_RAW_PIXELSHIFTMOTION_TOOLTIP"));
@ -185,6 +188,7 @@ BayerProcess::BayerProcess () : FoldableToolPanel(this, "bayerprocess", M("TP_RA
pixelShiftShowMotionconn = pixelShiftShowMotion->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftShowMotionChanged), true); pixelShiftShowMotionconn = pixelShiftShowMotion->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftShowMotionChanged), true);
pixelShiftShowMotionMaskOnlyconn = pixelShiftShowMotionMaskOnly->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftShowMotionMaskOnlyChanged), true); pixelShiftShowMotionMaskOnlyconn = pixelShiftShowMotionMaskOnly->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftShowMotionMaskOnlyChanged), true);
pixelShiftAutomaticconn = pixelShiftAutomatic->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftAutomaticChanged), true); pixelShiftAutomaticconn = pixelShiftAutomatic->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftAutomaticChanged), true);
pixelShiftNonGreenHorizontalconn = pixelShiftNonGreenHorizontal->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftNonGreenHorizontalChanged), true);
//allEnhconn = allEnhance->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::allEnhanceChanged), true); //allEnhconn = allEnhance->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::allEnhanceChanged), true);
} }
@ -215,6 +219,7 @@ void BayerProcess::read(const rtengine::procparams::ProcParams* pp, const Params
pixelShiftShowMotion->set_inconsistent(!pedited->raw.bayersensor.pixelshiftShowMotion); pixelShiftShowMotion->set_inconsistent(!pedited->raw.bayersensor.pixelshiftShowMotion);
pixelShiftShowMotionMaskOnly->set_inconsistent(!pedited->raw.bayersensor.pixelshiftShowMotionMaskOnly); pixelShiftShowMotionMaskOnly->set_inconsistent(!pedited->raw.bayersensor.pixelshiftShowMotionMaskOnly);
pixelShiftAutomatic->set_inconsistent(!pedited->raw.bayersensor.pixelShiftAutomatic); pixelShiftAutomatic->set_inconsistent(!pedited->raw.bayersensor.pixelShiftAutomatic);
pixelShiftNonGreenHorizontal->set_inconsistent(!pedited->raw.bayersensor.pixelShiftNonGreenHorizontal);
//allEnhance->set_inconsistent(!pedited->raw.bayersensor.allEnhance); //allEnhance->set_inconsistent(!pedited->raw.bayersensor.allEnhance);
lmmseIterations->setEditedState ( pedited->raw.bayersensor.lmmseIterations ? Edited : UnEdited); lmmseIterations->setEditedState ( pedited->raw.bayersensor.lmmseIterations ? Edited : UnEdited);
pixelShiftMotion->setEditedState ( pedited->raw.bayersensor.pixelshiftMotion ? Edited : UnEdited); pixelShiftMotion->setEditedState ( pedited->raw.bayersensor.pixelshiftMotion ? Edited : UnEdited);
@ -239,6 +244,7 @@ void BayerProcess::read(const rtengine::procparams::ProcParams* pp, const Params
pixelShiftShowMotion->set_active(pp->raw.bayersensor.pixelshiftShowMotion); pixelShiftShowMotion->set_active(pp->raw.bayersensor.pixelshiftShowMotion);
pixelShiftShowMotionMaskOnly->set_active(pp->raw.bayersensor.pixelshiftShowMotionMaskOnly); pixelShiftShowMotionMaskOnly->set_active(pp->raw.bayersensor.pixelshiftShowMotionMaskOnly);
pixelShiftAutomatic->set_active(pp->raw.bayersensor.pixelShiftAutomatic); pixelShiftAutomatic->set_active(pp->raw.bayersensor.pixelShiftAutomatic);
pixelShiftNonGreenHorizontal->set_active(pp->raw.bayersensor.pixelShiftNonGreenHorizontal);
ccSteps->setValue (pp->raw.bayersensor.ccSteps); ccSteps->setValue (pp->raw.bayersensor.ccSteps);
lmmseIterations->setValue (pp->raw.bayersensor.lmmse_iterations); lmmseIterations->setValue (pp->raw.bayersensor.lmmse_iterations);
pixelShiftMotion->setValue (pp->raw.bayersensor.pixelshiftMotion); pixelShiftMotion->setValue (pp->raw.bayersensor.pixelshiftMotion);
@ -304,6 +310,7 @@ void BayerProcess::write( rtengine::procparams::ProcParams* pp, ParamsEdited* pe
pp->raw.bayersensor.pixelshiftShowMotion = pixelShiftShowMotion->get_active(); pp->raw.bayersensor.pixelshiftShowMotion = pixelShiftShowMotion->get_active();
pp->raw.bayersensor.pixelshiftShowMotionMaskOnly = pixelShiftShowMotionMaskOnly->get_active(); pp->raw.bayersensor.pixelshiftShowMotionMaskOnly = pixelShiftShowMotionMaskOnly->get_active();
pp->raw.bayersensor.pixelShiftAutomatic = pixelShiftAutomatic->get_active(); pp->raw.bayersensor.pixelShiftAutomatic = pixelShiftAutomatic->get_active();
pp->raw.bayersensor.pixelShiftNonGreenHorizontal = pixelShiftNonGreenHorizontal->get_active();
int currentRow = method->get_active_row_number(); int currentRow = method->get_active_row_number();
if( currentRow >= 0 && currentRow < procparams::RAWParams::BayerSensor::numMethods) { if( currentRow >= 0 && currentRow < procparams::RAWParams::BayerSensor::numMethods) {
@ -333,6 +340,7 @@ void BayerProcess::write( rtengine::procparams::ProcParams* pp, ParamsEdited* pe
pedited->raw.bayersensor.pixelshiftShowMotion = !pixelShiftShowMotion->get_inconsistent(); pedited->raw.bayersensor.pixelshiftShowMotion = !pixelShiftShowMotion->get_inconsistent();
pedited->raw.bayersensor.pixelshiftShowMotionMaskOnly = !pixelShiftShowMotionMaskOnly->get_inconsistent(); pedited->raw.bayersensor.pixelshiftShowMotionMaskOnly = !pixelShiftShowMotionMaskOnly->get_inconsistent();
pedited->raw.bayersensor.pixelShiftAutomatic = !pixelShiftAutomatic->get_inconsistent(); pedited->raw.bayersensor.pixelShiftAutomatic = !pixelShiftAutomatic->get_inconsistent();
pedited->raw.bayersensor.pixelShiftNonGreenHorizontal = !pixelShiftNonGreenHorizontal->get_inconsistent();
} }
} }
@ -543,6 +551,7 @@ void BayerProcess::pixelShiftAutomaticChanged ()
pixelShiftNreadIso->set_sensitive(pixelShiftAutomatic->get_active ()); pixelShiftNreadIso->set_sensitive(pixelShiftAutomatic->get_active ());
pixelShiftPrnu->set_sensitive(pixelShiftAutomatic->get_active ()); pixelShiftPrnu->set_sensitive(pixelShiftAutomatic->get_active ());
pixelShiftStddevFactor->set_sensitive(pixelShiftAutomatic->get_active ()); pixelShiftStddevFactor->set_sensitive(pixelShiftAutomatic->get_active ());
pixelShiftNonGreenHorizontal->set_sensitive(pixelShiftAutomatic->get_active ());
if (listener) { if (listener) {
listener->panelChanged (EvDemosaicPixelshiftMotion, pixelShiftAutomatic->get_active() ? M("GENERAL_ENABLED") : M("GENERAL_DISABLED")); listener->panelChanged (EvDemosaicPixelshiftMotion, pixelShiftAutomatic->get_active() ? M("GENERAL_ENABLED") : M("GENERAL_DISABLED"));
@ -550,6 +559,27 @@ void BayerProcess::pixelShiftAutomaticChanged ()
} }
void BayerProcess::pixelShiftNonGreenHorizontalChanged ()
{
if (batchMode) {
if (pixelShiftNonGreenHorizontal->get_inconsistent()) {
pixelShiftNonGreenHorizontal->set_inconsistent (false);
pixelShiftNonGreenHorizontalconn.block (true);
pixelShiftNonGreenHorizontal->set_active (false);
pixelShiftNonGreenHorizontalconn.block (false);
} else if (lastDCBen) {
pixelShiftNonGreenHorizontal->set_inconsistent (true);
}
lastDCBen = pixelShiftNonGreenHorizontal->get_active ();
}
if (listener) {
listener->panelChanged (EvDemosaicPixelshiftMotion, pixelShiftNonGreenHorizontal->get_active() ? M("GENERAL_ENABLED") : M("GENERAL_DISABLED"));
}
}
/*void BayerProcess::allEnhanceChanged () /*void BayerProcess::allEnhanceChanged ()
{ {
if (batchMode) { if (batchMode) {

View File

@ -47,6 +47,7 @@ protected:
Gtk::CheckButton* pixelShiftShowMotion; Gtk::CheckButton* pixelShiftShowMotion;
Gtk::CheckButton* pixelShiftShowMotionMaskOnly; Gtk::CheckButton* pixelShiftShowMotionMaskOnly;
Gtk::CheckButton* pixelShiftAutomatic; Gtk::CheckButton* pixelShiftAutomatic;
Gtk::CheckButton* pixelShiftNonGreenHorizontal;
Adjuster* pixelShiftStddevFactor; Adjuster* pixelShiftStddevFactor;
Adjuster* pixelShiftEperIso; Adjuster* pixelShiftEperIso;
Adjuster* pixelShiftNreadIso; Adjuster* pixelShiftNreadIso;
@ -54,7 +55,7 @@ protected:
bool lastDCBen; bool lastDCBen;
int oldMethod; int oldMethod;
//bool lastALLen; //bool lastALLen;
sigc::connection methodconn, imagenumberconn, dcbEnhconn, pixelShiftShowMotionconn, pixelShiftShowMotionMaskOnlyconn, pixelShiftAutomaticconn; //,allEnhconn; sigc::connection methodconn, imagenumberconn, dcbEnhconn, pixelShiftShowMotionconn, pixelShiftShowMotionMaskOnlyconn, pixelShiftAutomaticconn, pixelShiftNonGreenHorizontalconn; //,allEnhconn;
public: public:
BayerProcess (); BayerProcess ();
@ -71,6 +72,7 @@ public:
void pixelShiftShowMotionChanged(); void pixelShiftShowMotionChanged();
void pixelShiftShowMotionMaskOnlyChanged(); void pixelShiftShowMotionMaskOnlyChanged();
void pixelShiftAutomaticChanged(); void pixelShiftAutomaticChanged();
void pixelShiftNonGreenHorizontalChanged();
//void allEnhanceChanged(); //void allEnhanceChanged();
}; };

View File

@ -379,6 +379,7 @@ void ParamsEdited::set (bool v)
raw.bayersensor.pixelshiftShowMotion = v; raw.bayersensor.pixelshiftShowMotion = v;
raw.bayersensor.pixelshiftShowMotionMaskOnly = v; raw.bayersensor.pixelshiftShowMotionMaskOnly = v;
raw.bayersensor.pixelShiftAutomatic = v; raw.bayersensor.pixelShiftAutomatic = v;
raw.bayersensor.pixelShiftNonGreenHorizontal = v;
raw.bayersensor.greenEq = v; raw.bayersensor.greenEq = v;
raw.bayersensor.linenoise = v; raw.bayersensor.linenoise = v;
raw.xtranssensor.method = v; raw.xtranssensor.method = v;
@ -884,6 +885,7 @@ void ParamsEdited::initFrom (const std::vector<rtengine::procparams::ProcParams>
raw.bayersensor.pixelshiftShowMotion = raw.bayersensor.pixelshiftShowMotion && p.raw.bayersensor.pixelshiftShowMotion == other.raw.bayersensor.pixelshiftShowMotion; 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.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.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.greenEq = raw.bayersensor.greenEq && p.raw.bayersensor.greenthresh == other.raw.bayersensor.greenthresh; 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.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; raw.xtranssensor.method = raw.xtranssensor.method && p.raw.xtranssensor.method == other.raw.xtranssensor.method;
@ -2332,6 +2334,10 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten
toEdit.raw.bayersensor.pixelShiftAutomatic = mods.raw.bayersensor.pixelShiftAutomatic; toEdit.raw.bayersensor.pixelShiftAutomatic = mods.raw.bayersensor.pixelShiftAutomatic;
} }
if (raw.bayersensor.pixelShiftNonGreenHorizontal) {
toEdit.raw.bayersensor.pixelShiftNonGreenHorizontal = mods.raw.bayersensor.pixelShiftNonGreenHorizontal;
}
//if (raw.bayersensor.allEnhance) toEdit.raw.bayersensor.all_enhance = mods.raw.bayersensor.all_enhance; //if (raw.bayersensor.allEnhance) toEdit.raw.bayersensor.all_enhance = mods.raw.bayersensor.all_enhance;
if (raw.bayersensor.greenEq) { 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; toEdit.raw.bayersensor.greenthresh = dontforceSet && options.baBehav[ADDSET_PREPROCESS_GREENEQUIL] ? toEdit.raw.bayersensor.greenthresh + mods.raw.bayersensor.greenthresh : mods.raw.bayersensor.greenthresh;

View File

@ -701,6 +701,8 @@ public:
bool pixelshiftShowMotion; bool pixelshiftShowMotion;
bool pixelshiftShowMotionMaskOnly; bool pixelshiftShowMotionMaskOnly;
bool pixelShiftAutomatic; bool pixelShiftAutomatic;
bool pixelShiftNonGreenHorizontal;
//bool allEnhance; //bool allEnhance;
bool greenEq; bool greenEq;
bool linenoise; bool linenoise;