Merge pull request #3401 from Beep6581/colourtoning
Colourtoning: Speedup and improvement for Automatic Saturation Protection
This commit is contained in:
@@ -231,6 +231,19 @@ public:
|
|||||||
*/
|
*/
|
||||||
static void rgb2hsv (float r, float g, float b, float &h, float &s, float &v);
|
static void rgb2hsv (float r, float g, float b, float &h, float &s, float &v);
|
||||||
|
|
||||||
|
static inline float rgb2s(float r, float g, float b) // fast version if only saturation is needed
|
||||||
|
{
|
||||||
|
float var_Min = min(r, g, b);
|
||||||
|
float var_Max = max(r, g, b);
|
||||||
|
float del_Max = var_Max - var_Min;
|
||||||
|
|
||||||
|
if (del_Max < 0.00001f) {
|
||||||
|
return 0.f;
|
||||||
|
} else {
|
||||||
|
return del_Max / var_Max;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static inline bool rgb2hsvdcp(float r, float g, float b, float &h, float &s, float &v)
|
static inline bool rgb2hsvdcp(float r, float g, float b, float &h, float &s, float &v)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@@ -749,27 +749,6 @@ void Crop::update (int todo)
|
|||||||
baseCrop->b[(int)(xref/skip)][(int)(yref/skip)]/256,
|
baseCrop->b[(int)(xref/skip)][(int)(yref/skip)]/256,
|
||||||
parent->imgsrc->getGamma());
|
parent->imgsrc->getGamma());
|
||||||
}*/
|
}*/
|
||||||
float satLimit = float(params.colorToning.satProtectionThreshold) / 100.f * 0.7f + 0.3f;
|
|
||||||
float satLimitOpacity = 1.f - (float(params.colorToning.saturatedOpacity) / 100.f);
|
|
||||||
|
|
||||||
if(params.colorToning.enabled && params.colorToning.autosat) { //for colortoning evaluation of saturation settings
|
|
||||||
float moyS = 0.f;
|
|
||||||
float eqty = 0.f;
|
|
||||||
parent->ipf.moyeqt (baseCrop, moyS, eqty);//return image : mean saturation and standard dev of saturation
|
|
||||||
//printf("moy=%f ET=%f\n", moyS,eqty);
|
|
||||||
float satp = ((moyS + 1.5f * eqty) - 0.3f) / 0.7f; //1.5 sigma ==> 93% pixels with high saturation -0.3 / 0.7 convert to Hombre scale
|
|
||||||
|
|
||||||
if(satp >= 0.92f) {
|
|
||||||
satp = 0.92f; //avoid values too high (out of gamut)
|
|
||||||
}
|
|
||||||
|
|
||||||
if(satp <= 0.15f) {
|
|
||||||
satp = 0.15f; //avoid too low values
|
|
||||||
}
|
|
||||||
|
|
||||||
satLimit = 100.f * satp;
|
|
||||||
satLimitOpacity = 100.f * (moyS - 0.85f * eqty); //-0.85 sigma==>20% pixels with low saturation
|
|
||||||
}
|
|
||||||
|
|
||||||
if (todo & M_RGBCURVE) {
|
if (todo & M_RGBCURVE) {
|
||||||
double rrm, ggm, bbm;
|
double rrm, ggm, bbm;
|
||||||
@@ -777,7 +756,7 @@ void Crop::update (int todo)
|
|||||||
DCPProfile *dcpProf = parent->imgsrc->getDCP(params.icm, parent->currWB, as);
|
DCPProfile *dcpProf = parent->imgsrc->getDCP(params.icm, parent->currWB, as);
|
||||||
|
|
||||||
parent->ipf.rgbProc (baseCrop, laboCrop, this, parent->hltonecurve, parent->shtonecurve, parent->tonecurve, cshmap,
|
parent->ipf.rgbProc (baseCrop, laboCrop, this, parent->hltonecurve, parent->shtonecurve, parent->tonecurve, cshmap,
|
||||||
params.toneCurve.saturation, parent->rCurve, parent->gCurve, parent->bCurve, satLimit , satLimitOpacity, parent->ctColorCurve, parent->ctOpacityCurve, parent->opautili, parent->clToningcurve, parent->cl2Toningcurve,
|
params.toneCurve.saturation, parent->rCurve, parent->gCurve, parent->bCurve, parent->colourToningSatLimit , parent->colourToningSatLimitOpacity, parent->ctColorCurve, parent->ctOpacityCurve, parent->opautili, parent->clToningcurve, parent->cl2Toningcurve,
|
||||||
parent->customToneCurve1, parent->customToneCurve2, parent->beforeToneCurveBW, parent->afterToneCurveBW, rrm, ggm, bbm,
|
parent->customToneCurve1, parent->customToneCurve2, parent->beforeToneCurveBW, parent->afterToneCurveBW, rrm, ggm, bbm,
|
||||||
parent->bwAutoR, parent->bwAutoG, parent->bwAutoB, dcpProf, as);
|
parent->bwAutoR, parent->bwAutoG, parent->bwAutoB, dcpProf, as);
|
||||||
}
|
}
|
||||||
|
@@ -473,8 +473,8 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall)
|
|||||||
CurveFactory::curveBW (params.blackwhite.beforeCurve, params.blackwhite.afterCurve, vhist16bw, histToneCurveBW, beforeToneCurveBW, afterToneCurveBW, scale == 1 ? 1 : 1);
|
CurveFactory::curveBW (params.blackwhite.beforeCurve, params.blackwhite.afterCurve, vhist16bw, histToneCurveBW, beforeToneCurveBW, afterToneCurveBW, scale == 1 ? 1 : 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
float satLimit = float(params.colorToning.satProtectionThreshold) / 100.f * 0.7f + 0.3f;
|
colourToningSatLimit = float(params.colorToning.satProtectionThreshold) / 100.f * 0.7f + 0.3f;
|
||||||
float satLimitOpacity = 1.f - (float(params.colorToning.saturatedOpacity) / 100.f);
|
colourToningSatLimitOpacity = 1.f - (float(params.colorToning.saturatedOpacity) / 100.f);
|
||||||
|
|
||||||
int satTH = 80;
|
int satTH = 80;
|
||||||
int satPR = 30;
|
int satPR = 30;
|
||||||
@@ -497,10 +497,10 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall)
|
|||||||
|
|
||||||
//satTH=(int) 100.f*satp;
|
//satTH=(int) 100.f*satp;
|
||||||
//satPR=(int) 100.f*(moyS-0.85f*eqty);//-0.85 sigma==>20% pixels with low saturation
|
//satPR=(int) 100.f*(moyS-0.85f*eqty);//-0.85 sigma==>20% pixels with low saturation
|
||||||
satLimit = 100.f * satp;
|
colourToningSatLimit = 100.f * satp;
|
||||||
satTH = (int) 100.f * satp;
|
satTH = (int) 100.f * satp;
|
||||||
|
|
||||||
satLimitOpacity = 100.f * (moyS - 0.85f * eqty); //-0.85 sigma==>20% pixels with low saturation
|
colourToningSatLimitOpacity = 100.f * (moyS - 0.85f * eqty); //-0.85 sigma==>20% pixels with low saturation
|
||||||
satPR = (int) 100.f * (moyS - 0.85f * eqty);
|
satPR = (int) 100.f * (moyS - 0.85f * eqty);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -539,7 +539,7 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall)
|
|||||||
DCPProfile *dcpProf = imgsrc->getDCP(params.icm, currWB, as);
|
DCPProfile *dcpProf = imgsrc->getDCP(params.icm, currWB, as);
|
||||||
|
|
||||||
ipf.rgbProc (oprevi, oprevl, NULL, hltonecurve, shtonecurve, tonecurve, shmap, params.toneCurve.saturation,
|
ipf.rgbProc (oprevi, oprevl, NULL, hltonecurve, shtonecurve, tonecurve, shmap, params.toneCurve.saturation,
|
||||||
rCurve, gCurve, bCurve, satLimit , satLimitOpacity, ctColorCurve, ctOpacityCurve, opautili, clToningcurve, cl2Toningcurve, customToneCurve1, customToneCurve2, beforeToneCurveBW, afterToneCurveBW, rrm, ggm, bbm, bwAutoR, bwAutoG, bwAutoB, params.toneCurve.expcomp, params.toneCurve.hlcompr, params.toneCurve.hlcomprthresh, dcpProf, as);
|
rCurve, gCurve, bCurve, colourToningSatLimit , colourToningSatLimitOpacity, ctColorCurve, ctOpacityCurve, opautili, clToningcurve, cl2Toningcurve, customToneCurve1, customToneCurve2, beforeToneCurveBW, afterToneCurveBW, rrm, ggm, bbm, bwAutoR, bwAutoG, bwAutoB, params.toneCurve.expcomp, params.toneCurve.hlcompr, params.toneCurve.hlcomprthresh, dcpProf, as);
|
||||||
|
|
||||||
if(params.blackwhite.enabled && params.blackwhite.autoc && abwListener) {
|
if(params.blackwhite.enabled && params.blackwhite.autoc && abwListener) {
|
||||||
if (settings->verbose) {
|
if (settings->verbose) {
|
||||||
@@ -551,10 +551,10 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall)
|
|||||||
|
|
||||||
if(params.colorToning.autosat && actListener) {
|
if(params.colorToning.autosat && actListener) {
|
||||||
if (settings->verbose) {
|
if (settings->verbose) {
|
||||||
printf("ImProcCoordinator / Auto CT: indi=%d satH=%d satPR=%d\n", indi, (int)satLimit , (int) satLimitOpacity);
|
printf("ImProcCoordinator / Auto CT: indi=%d satH=%d satPR=%d\n", indi, (int)colourToningSatLimit , (int) colourToningSatLimitOpacity);
|
||||||
}
|
}
|
||||||
|
|
||||||
actListener->autoColorTonChanged(indi, (int) satLimit, (int)satLimitOpacity);//change sliders autosat
|
actListener->autoColorTonChanged(indi, (int) colourToningSatLimit, (int)colourToningSatLimitOpacity);//change sliders autosat
|
||||||
}
|
}
|
||||||
|
|
||||||
// correct GUI black and white with value
|
// correct GUI black and white with value
|
||||||
|
@@ -197,6 +197,8 @@ protected:
|
|||||||
bool wavcontlutili;
|
bool wavcontlutili;
|
||||||
void startProcessing ();
|
void startProcessing ();
|
||||||
void process ();
|
void process ();
|
||||||
|
float colourToningSatLimit;
|
||||||
|
float colourToningSatLimitOpacity;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
@@ -2861,54 +2861,29 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int
|
|||||||
|
|
||||||
void ImProcFunctions::moyeqt (Imagefloat* working, float &moyS, float &eqty)
|
void ImProcFunctions::moyeqt (Imagefloat* working, float &moyS, float &eqty)
|
||||||
{
|
{
|
||||||
// MyTime t1e,t2e;
|
BENCHFUN
|
||||||
// t1e.set();
|
|
||||||
|
|
||||||
int tHh = working->height;
|
int tHh = working->height;
|
||||||
int tWw = working->width;
|
int tWw = working->width;
|
||||||
float moy = 0.f;
|
double moy = 0.0;
|
||||||
float eqt = 0.f;
|
double sqrs = 0.0;
|
||||||
#pragma omp parallel
|
|
||||||
{
|
#ifdef _OPENMP
|
||||||
float mo = 0.f;
|
#pragma omp parallel for reduction(+:moy,sqrs) schedule(dynamic,16)
|
||||||
#ifndef _DEBUG
|
|
||||||
#pragma omp for reduction(+:moy)
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
for (int i = 0; i < tHh; i++) {
|
for (int i = 0; i < tHh; i++) {
|
||||||
for (int j = 0; j < tWw; j++) {
|
for (int j = 0; j < tWw; j++) {
|
||||||
float r = CLIP(working->r(i, j));
|
float s = Color::rgb2s(CLIP(working->r(i, j)), CLIP(working->g(i, j)), CLIP(working->b(i, j)));
|
||||||
float g = CLIP(working->g(i, j));
|
|
||||||
float b = CLIP(working->b(i, j));
|
|
||||||
float h, s, v;
|
|
||||||
Color::rgb2hsv(r, g, b, h, s, v);
|
|
||||||
moy += s;
|
moy += s;
|
||||||
|
sqrs += SQR(s);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mo = moy / (tHh * tWw);
|
moy /= (tHh * tWw);
|
||||||
moyS = mo;
|
sqrs /= (tHh * tWw);
|
||||||
#ifndef _DEBUG
|
eqty = sqrt(sqrs - SQR(moy));
|
||||||
#pragma omp for reduction(+:eqt)
|
moyS = moy;
|
||||||
#endif
|
|
||||||
|
|
||||||
for (int i = 0; i < tHh; i++) {
|
|
||||||
for (int j = 0; j < tWw; j++) {
|
|
||||||
float r = CLIP(working->r(i, j));
|
|
||||||
float g = CLIP(working->g(i, j));
|
|
||||||
float b = CLIP(working->b(i, j));
|
|
||||||
float h, s, v;
|
|
||||||
Color::rgb2hsv(r, g, b, h, s, v);
|
|
||||||
eqt += SQR(s - mo);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
eqt = eqt / (tHh * tWw);
|
|
||||||
eqty = (sqrt(eqt));
|
|
||||||
|
|
||||||
// t2e.set();
|
|
||||||
// printf("Moyeqt:%d\n", t2e.etime(t1e));
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
|
Reference in New Issue
Block a user