diff --git a/rtdata/languages/default b/rtdata/languages/default index 997d3ea84..44d540315 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1654,6 +1654,7 @@ TP_RAW_IMAGENUM;Some raw files might embed several sub-images (HDR, Pixel-Shift, TP_RAW_LABEL;Demosaicing 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_PIXELSHIFTADAPTIVE;Automatic 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_PIXELSHIFTMOTIONCORRECTION;Pixelshift motion correction diff --git a/rtengine/pixelshift.cc b/rtengine/pixelshift.cc index 9430315ac..7869daa6d 100644 --- a/rtengine/pixelshift.cc +++ b/rtengine/pixelshift.cc @@ -49,19 +49,32 @@ float greenDiff(float a, float b) using namespace std; using namespace rtengine; -void RawImageSource::pixelshift_simple(int winx, int winy, int winw, int winh, bool detectMotion, int motion, bool showMotion, unsigned int frame, unsigned int gridSize) +void RawImageSource::pixelshift_simple(int winx, int winy, int winw, int winh, bool detectMotion, int motion, bool showMotion, unsigned int frame, unsigned int gridSize, bool blendMotion) { BENCHFUN + printf("%f\t%f\t%f\t%f\n",scale_mul[0],scale_mul[1],scale_mul[2],scale_mul[3]); + if (plistener) { plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::pixelshift_simple])); plistener->setProgress(0.0); } - // If the values of two corresponding green pixels differ my more then motionThreshold %, the pixel will be treated as a badGreen pixel - const float motionThreshold = 1.f - (motion / 100.f); + LUTf log2Lut(65536); + log2Lut[0] = 0; + const float lutStrength = 2.f; + const float scaleGreen = 1.f / scale_mul[1]; + for(int i=2; i < 65536; i+=2) + log2Lut[i>>1] = 2.f * log2(i) / 100.f; + // 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 'blend' mode + const float blendFactor = 1.f / (1.f - motionThreshold); + + bool checkRedBlue = (gridSize == 5); +// bool checkRedBlue = false; unsigned int offsX = 0, offsY = 0; if(detectMotion) { // if motion correction is enabled we have to adjust the offsets for the selected subframe we use for areas with motion @@ -155,7 +168,7 @@ void RawImageSource::pixelshift_simple(int winx, int winy, int winw, int winh, b for(; j < winw - (border + offsX); ++j) { offset ^= 1; // 0 => 1 or 1 => 0 - if(detectMotion) { + if(detectMotion || blendMotion) { bool skipNext = false; float gridMax; if(gridSize == 1) { @@ -183,23 +196,125 @@ void RawImageSource::pixelshift_simple(int winx, int winy, int winw, int winh, b lastIndex ++; lastIndex = lastIndex == gridSize ? 0 : lastIndex; - if (gridMax > motionThreshold) { - // at least one of the tested pixels of the grid is detected as motion - if(showMotion) { - // if showMotion is enabled make the pixel green - greenDest[j + offsX] = 10000.f; - nonGreenDest0[j + offsX] = nonGreenDest1[j + offsX] = 0.f; + // increase motion detection dependent on brightness +// float korr = 2.f * log2Lut[((int)riFrames[1 - offset]->data[i - offset + 1][j])>>1]; + float centerVal = riFrames[1 - offset]->data[i - offset + 1][j] * scaleGreen; + if(true || centerVal > 32) { + float korr; + float thresh; + if(blendMotion) { + korr = 0.f; + float average = scaleGreen * (riFrames[1 - offset]->data[i - offset + 1][j] + riFrames[3 - offset]->data[i + offset][j + 1]) / 2.f; + thresh = (5.f / sqrtf(average)) / 0.75f; + } else { + korr = log2Lut[((int)(riFrames[1 - offset]->data[i - offset + 1][j] * scaleGreen))>>1]; + thresh = motionThreshold; } - if(skipNext) { - // treat the horizontally next pixel also as motion - j++; - offset ^= 1; +// float korr = log2Lut[((int)(riFrames[1 - offset]->data[i - offset + 1][j] * scaleGreen))>>1]; +// float korr = 0.f; +// float average = (riFrames[1 - offset]->data[i - offset + 1][j] + riFrames[3 - offset]->data[i + offset][j + 1])/2.f; +// float motionThreshold = 5.f * sqrtf(3.f*average/(scale_mul[1])) / (average * scaleGreen * 3.f); + if (gridMax > thresh - korr) { + float blend = (gridMax - thresh + korr) * blendFactor; + // at least one of the tested pixels of the grid is detected as motion + if(showMotion) { + // if showMotion is enabled make the pixel green + greenDest[j + offsX] = 1000.f + 25000.f * blend; + nonGreenDest0[j + offsX] = nonGreenDest1[j + offsX] = 0.f; + } else if(false) { + greenDest[j + offsX] = intp(blend, greenDest[j + offsX],(riFrames[1 - offset]->data[i - offset + 1][j] + riFrames[3 - offset]->data[i + offset][j + 1]) / 2.f); + nonGreenDest0[j + offsX] = intp(blend, nonGreenDest0[j + offsX], riFrames[(offset << 1) + offset]->data[i][j + offset]); + nonGreenDest1[j + offsX] = intp(blend, nonGreenDest1[j + offsX], riFrames[2 - offset]->data[i + 1][j - offset + 1]); + } + if(skipNext) { + // treat the horizontally next pixel also as motion + j++; + offset ^= 1; + } + // do not set the motion pixel values. They have already been set by demosaicer or showMotion + continue; } - // do not set the motion pixel values. They have already been set by demosaicer or showMotion - continue; } } + if(false && detectMotion && checkRedBlue) { + 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 = ng1 - ng0; + float diff2 = ng1 - ng2; + float gridMax; + if(diff0 * diff2 > 0.f) { +// if(greenDiff(ng1, fabsf(diff0) < fabsf(diff2) ? ng0 : ng2) > motionThreshold ) { + gridMax = greenDiff(ng1, std::max(ng0, ng2)); +// gridMax = greenDiff(ng1, ((ng0 + ng2) / 2.f)); + if(gridMax > motionThreshold ) { + float factor = 1.f / (1.f - motionThreshold); + float blend = (gridMax - motionThreshold) * factor; + if(showMotion) { + // if showMotion is enabled make the pixel green + greenDest[j + offsX] = nonGreenDest1[j + offsX] = 0.f; + nonGreenDest0[j + offsX] = 20000.f; + continue; +// greenDest[j + offsX+1] = nonGreenDest1[j + offsX+1] = 0.f; +// nonGreenDest0[j + offsX+1] = 20000.f; + } + greenDest[j + offsX] = (riFrames[1 - offset]->data[i - offset + 1][j] + riFrames[3 - offset]->data[i + offset][j + 1]) / 2.f; + +// greenDest[j + offsX] = intp(blend, greenDest[j + offsX],(riFrames[1 - offset]->data[i - offset + 1][j] + riFrames[3 - offset]->data[i + offset][j + 1]) / 2.f); +// nonGreenDest0[j + offsX] = (ng1 + (diff0 < diff2 ? ng0 : ng2)) / 2.f; + nonGreenDest0[j + offsX] = intp(blend, nonGreenDest0[j + offsX], riFrames[(offset << 1) + offset]->data[i][j + offset]); +// nonGreenDest0[j + offsX] = intp(blend, nonGreenDest0[j + offsX], riFrames[(offset << 1) + offset]->data[i][j + offset]); + nonGreenDest1[j + offsX] = riFrames[2 - offset]->data[i + 1][j - offset + 1]; + +// nonGreenDest1[j + offsX] = intp(blend, nonGreenDest1[j + offsX], riFrames[2 - offset]->data[i + 1][j - offset + 1]); + +// if(skipNext) { +// // treat the horizontally next pixel also as motion +// j++; +// offset ^= 1; +// } + // do not set the motion pixel values. They have already been set by demosaicer or showMotion + 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 = ng1 - ng0; + diff2 = ng1 - ng2; + if(signbit(diff0) == signbit(diff2)) { +// if(greenDiff(ng1, fabsf(diff0) < fabsf(diff2) ? ng0 : ng2) > motionThreshold ) { + gridMax = greenDiff(ng1, std::max(ng0, ng2)); +// gridMax = greenDiff(ng1, ((ng0 + ng2) / 2.f)); + if(gridMax > motionThreshold ) { + float factor = 1.f / (1.f - motionThreshold); + float blend = (gridMax - motionThreshold) * factor; + if(showMotion) { + // if showMotion is enabled make the pixel green + greenDest[j + offsX] = nonGreenDest0[j + offsX] = 0.f; + nonGreenDest1[j + offsX] = 20000.f; +// greenDest[j + offsX+1] = nonGreenDest0[j + offsX+1] = 0.f; +// nonGreenDest1[j + offsX+1] = 20000.f; +continue; + } + greenDest[j + offsX] = (riFrames[1 - offset]->data[i - offset + 1][j] + riFrames[3 - offset]->data[i + offset][j + 1]) / 2.f; +// greenDest[j + offsX] = intp(blend, greenDest[j + offsX],(riFrames[1 - offset]->data[i - offset + 1][j] + riFrames[3 - offset]->data[i + offset][j + 1]) / 2.f); +// nonGreenDest0[j + offsX] = intp(blend, nonGreenDest0[j + offsX], riFrames[(offset << 1) + offset]->data[i][j + offset]); + nonGreenDest0[j + offsX] = riFrames[(offset << 1) + offset]->data[i][j + offset]; + +// nonGreenDest1[j + offsX] = (ng1 + (diff0 < diff2 ? ng0 : ng2)) / 2.f; + nonGreenDest1[j + offsX] = intp(blend, nonGreenDest1[j + offsX], riFrames[2 - offset]->data[i + 1][j - offset + 1]); +// if(skipNext) { +// // treat the horizontally next pixel also as motion +// j++; +// offset ^= 1; +// } + // do not set the motion pixel values. They have already been set by demosaicer or showMotion + continue; + } + } + } // motion correction disabled or no motion detected => combine the values from the four pixelshift frames greenDest[j + offsX] = (riFrames[1 - offset]->data[i - offset + 1][j] + riFrames[3 - offset]->data[i + offset][j + 1]) / 2.f; nonGreenDest0[j + offsX] = riFrames[(offset << 1) + offset]->data[i][j + offset]; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 466b25d82..eba1e36f4 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -888,6 +888,7 @@ void RAWParams::setDefaults() bayersensor.pixelshiftMotion = 70; bayersensor.pixelshiftMotionCorrection = 3; bayersensor.pixelshiftShowMotion = false; + bayersensor.pixelshiftBlendMotion = false; bayersensor.black0 = 0.0; bayersensor.black1 = 0.0; bayersensor.black2 = 0.0; @@ -3379,6 +3380,10 @@ int ProcParams::save (const Glib::ustring &fname, const Glib::ustring &fname2, b keyFile.set_boolean ("RAW Bayer", "PixelShiftShowMotion", raw.bayersensor.pixelshiftShowMotion ); } + if (!pedited || pedited->raw.bayersensor.pixelshiftBlendMotion) { + keyFile.set_boolean ("RAW Bayer", "PixelShiftBlendMotion", raw.bayersensor.pixelshiftBlendMotion ); + } + //if (!pedited || pedited->raw.bayersensor.allEnhance) keyFile.set_boolean ("RAW Bayer", "ALLEnhance", raw.bayersensor.all_enhance ); if (!pedited || pedited->raw.xtranssensor.method) { @@ -7461,6 +7466,14 @@ int ProcParams::load (const Glib::ustring &fname, ParamsEdited* pedited) } } + if (keyFile.has_key ("RAW Bayer", "PixelShiftBlendMotion")) { + raw.bayersensor.pixelshiftBlendMotion = keyFile.get_boolean("RAW Bayer", "PixelShiftBlendMotion"); + + if (pedited) { + pedited->raw.bayersensor.pixelshiftBlendMotion = 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; } } diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 3f5951cf8..a6308454c 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1185,6 +1185,7 @@ public: int pixelshiftMotion; int pixelshiftMotionCorrection; bool pixelshiftShowMotion; + bool pixelshiftBlendMotion; bool dcb_enhance; //bool all_enhance; }; diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index f4760d44e..ed6efdae0 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -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 } if(numFrames == 4) { - pixelshift_simple(0, 0, W, H, raw.bayersensor.pixelshiftMotion > 0, raw.bayersensor.pixelshiftMotion, raw.bayersensor.pixelshiftShowMotion, currFrame, raw.bayersensor.pixelshiftMotionCorrection); + pixelshift_simple(0, 0, W, H, raw.bayersensor.pixelshiftMotion > 0, raw.bayersensor.pixelshiftMotion, raw.bayersensor.pixelshiftShowMotion, currFrame, raw.bayersensor.pixelshiftMotionCorrection, raw.bayersensor.pixelshiftBlendMotion); } } else if (raw.bayersensor.method == RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::dcb] ) { dcb_demosaic(raw.bayersensor.dcb_iterations, raw.bayersensor.dcb_enhance); @@ -3561,7 +3561,7 @@ void RawImageSource::scaleColors_pixelshift(int winx, int winy, int winw, int wi for (int col = winx; col < winx + winw; 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; } diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index 648e5ec77..08e1643ed 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -263,7 +263,7 @@ protected: void xtransborder_interpolate (int border); void xtrans_interpolate (const int passes, const bool useCieLab); void fast_xtrans_interpolate (); - void pixelshift_simple(int winx, int winy, int winw, int winh, bool detectMotion, int motion, bool showMotion, unsigned int frame, unsigned int method); + void pixelshift_simple(int winx, int winy, int winw, int winh, bool detectMotion, int motion, bool showMotion, unsigned int frame, unsigned int gridSize, bool blendMotion); void hflip (Imagefloat* im); void vflip (Imagefloat* im); diff --git a/rtgui/bayerprocess.cc b/rtgui/bayerprocess.cc index 92351be2b..5c80b93c1 100644 --- a/rtgui/bayerprocess.cc +++ b/rtgui/bayerprocess.cc @@ -86,6 +86,9 @@ BayerProcess::BayerProcess () : FoldableToolPanel(this, "bayerprocess", M("TP_RA pixelShiftShowMotion = Gtk::manage (new Gtk::CheckButton(M("TP_RAW_PIXELSHIFTSHOWMOTION"))); pixelShiftOptions->pack_start(*pixelShiftShowMotion); + pixelShiftBlendMotion = Gtk::manage (new Gtk::CheckButton(M("TP_RAW_PIXELSHIFTADAPTIVE"))); + pixelShiftOptions->pack_start(*pixelShiftBlendMotion); + 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")); @@ -131,6 +134,7 @@ BayerProcess::BayerProcess () : FoldableToolPanel(this, "bayerprocess", M("TP_RA imagenumberconn = imageNumber->signal_changed().connect( sigc::mem_fun(*this, &BayerProcess::imageNumberChanged) ); dcbEnhconn = dcbEnhance->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::dcbEnhanceChanged), true); pixelShiftShowMotionconn = pixelShiftShowMotion->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftShowMotionChanged), true); + pixelShiftBlendMotionconn = pixelShiftBlendMotion->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftBlendMotionChanged), true); //allEnhconn = allEnhance->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::allEnhanceChanged), true); } @@ -159,6 +163,7 @@ void BayerProcess::read(const rtengine::procparams::ProcParams* pp, const Params dcbIterations->setEditedState ( pedited->raw.bayersensor.dcbIterations ? Edited : UnEdited); dcbEnhance->set_inconsistent(!pedited->raw.bayersensor.dcbEnhance); pixelShiftShowMotion->set_inconsistent(!pedited->raw.bayersensor.pixelshiftShowMotion); + pixelShiftBlendMotion->set_inconsistent(!pedited->raw.bayersensor.pixelshiftBlendMotion); //allEnhance->set_inconsistent(!pedited->raw.bayersensor.allEnhance); lmmseIterations->setEditedState ( pedited->raw.bayersensor.lmmseIterations ? Edited : UnEdited); pixelShiftMotion->setEditedState ( pedited->raw.bayersensor.pixelshiftMotion ? Edited : UnEdited); @@ -177,6 +182,7 @@ void BayerProcess::read(const rtengine::procparams::ProcParams* pp, const Params dcbIterations->setValue (pp->raw.bayersensor.dcb_iterations); dcbEnhance->set_active(pp->raw.bayersensor.dcb_enhance); pixelShiftShowMotion->set_active(pp->raw.bayersensor.pixelshiftShowMotion); + pixelShiftBlendMotion->set_active(pp->raw.bayersensor.pixelshiftBlendMotion); ccSteps->setValue (pp->raw.bayersensor.ccSteps); lmmseIterations->setValue (pp->raw.bayersensor.lmmse_iterations); pixelShiftMotion->setValue (pp->raw.bayersensor.pixelshiftMotion); @@ -232,6 +238,7 @@ void BayerProcess::write( rtengine::procparams::ProcParams* pp, ParamsEdited* pe pp->raw.bayersensor.pixelshiftMotion = pixelShiftMotion->getIntValue(); pp->raw.bayersensor.pixelshiftMotionCorrection = pixelShiftMotionCorrection->getIntValue(); pp->raw.bayersensor.pixelshiftShowMotion = pixelShiftShowMotion->get_active(); + pp->raw.bayersensor.pixelshiftBlendMotion = pixelShiftBlendMotion->get_active(); int currentRow = method->get_active_row_number(); if( currentRow >= 0 && currentRow < procparams::RAWParams::BayerSensor::numMethods) { @@ -255,6 +262,7 @@ void BayerProcess::write( rtengine::procparams::ProcParams* pp, ParamsEdited* pe pedited->raw.bayersensor.pixelshiftMotion = pixelShiftMotion->getEditedState (); pedited->raw.bayersensor.pixelshiftMotionCorrection = pixelShiftMotionCorrection->getEditedState (); pedited->raw.bayersensor.pixelshiftShowMotion = !pixelShiftShowMotion->get_inconsistent(); + pedited->raw.bayersensor.pixelshiftBlendMotion = !pixelShiftBlendMotion->get_inconsistent(); } } @@ -402,6 +410,28 @@ void BayerProcess::pixelShiftShowMotionChanged () } } +void BayerProcess::pixelShiftBlendMotionChanged () +{ + if (batchMode) { + if (pixelShiftBlendMotion->get_inconsistent()) { + pixelShiftBlendMotion->set_inconsistent (false); + pixelShiftBlendMotionconn.block (true); + pixelShiftBlendMotion->set_active (false); + pixelShiftBlendMotionconn.block (false); + } else if (lastDCBen) { + pixelShiftBlendMotion->set_inconsistent (true); + } + + lastDCBen = pixelShiftBlendMotion->get_active (); + } + pixelShiftMotion->set_sensitive(!pixelShiftBlendMotion->get_active ()); + + if (listener) { + listener->panelChanged (EvDemosaicPixelshiftMotion, pixelShiftBlendMotion->get_active() ? M("GENERAL_ENABLED") : M("GENERAL_DISABLED")); + } +} + + /*void BayerProcess::allEnhanceChanged () { if (batchMode) { diff --git a/rtgui/bayerprocess.h b/rtgui/bayerprocess.h index 404324ed6..383adeb43 100644 --- a/rtgui/bayerprocess.h +++ b/rtgui/bayerprocess.h @@ -45,10 +45,11 @@ protected: Adjuster* pixelShiftMotion; Adjuster* pixelShiftMotionCorrection; Gtk::CheckButton* pixelShiftShowMotion; + Gtk::CheckButton* pixelShiftBlendMotion; bool lastDCBen; int oldMethod; //bool lastALLen; - sigc::connection methodconn, imagenumberconn, dcbEnhconn, pixelShiftShowMotionconn; //,allEnhconn; + sigc::connection methodconn, imagenumberconn, dcbEnhconn, pixelShiftShowMotionconn, pixelShiftBlendMotionconn; //,allEnhconn; public: BayerProcess (); @@ -63,6 +64,7 @@ public: void adjusterChanged (Adjuster* a, double newval); void dcbEnhanceChanged(); void pixelShiftShowMotionChanged(); + void pixelShiftBlendMotionChanged(); //void allEnhanceChanged(); }; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 6a020cd8b..5b045c2ce 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -373,6 +373,7 @@ void ParamsEdited::set (bool v) raw.bayersensor.pixelshiftMotion = v; raw.bayersensor.pixelshiftMotionCorrection = v; raw.bayersensor.pixelshiftShowMotion = v; + raw.bayersensor.pixelshiftBlendMotion = v; raw.bayersensor.greenEq = v; raw.bayersensor.linenoise = v; raw.xtranssensor.method = v; @@ -872,6 +873,7 @@ void ParamsEdited::initFrom (const std::vector raw.bayersensor.pixelshiftMotion = raw.bayersensor.pixelshiftMotion && p.raw.bayersensor.pixelshiftMotion == other.raw.bayersensor.pixelshiftMotion; raw.bayersensor.pixelshiftMotionCorrection = raw.bayersensor.pixelshiftMotionCorrection && p.raw.bayersensor.pixelshiftMotionCorrection == other.raw.bayersensor.pixelshiftMotionCorrection; raw.bayersensor.pixelshiftShowMotion = raw.bayersensor.pixelshiftShowMotion && p.raw.bayersensor.pixelshiftShowMotion == other.raw.bayersensor.pixelshiftShowMotion; + raw.bayersensor.pixelshiftBlendMotion = raw.bayersensor.pixelshiftBlendMotion && p.raw.bayersensor.pixelshiftBlendMotion == other.raw.bayersensor.pixelshiftBlendMotion; 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; @@ -2296,6 +2298,10 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten toEdit.raw.bayersensor.pixelshiftShowMotion = mods.raw.bayersensor.pixelshiftShowMotion; } + if (raw.bayersensor.pixelshiftBlendMotion) { + toEdit.raw.bayersensor.pixelshiftBlendMotion = mods.raw.bayersensor.pixelshiftBlendMotion; + } + //if (raw.bayersensor.allEnhance) toEdit.raw.bayersensor.all_enhance = mods.raw.bayersensor.all_enhance; 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; diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 5546c9857..9d9bc3fb9 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -695,6 +695,7 @@ public: bool pixelshiftMotion; bool pixelshiftMotionCorrection; bool pixelshiftShowMotion; + bool pixelshiftBlendMotion; //bool allEnhance; bool greenEq; bool linenoise;