B&W + channel mixer + color filter = maximum brightness too low, whites turn gray issue2583

This commit is contained in:
jdc 2014-11-22 07:11:24 +01:00
parent 77177deb61
commit c381db2f1f
4 changed files with 113 additions and 109 deletions

View File

@ -479,14 +479,13 @@ namespace rtengine {
* @param setting BlackWhite::setting * @param setting BlackWhite::setting
* @param setting BlackWhite::filter * @param setting BlackWhite::filter
*/ */
void Color::computeBWMixerConstants (const Glib::ustring &setting, const Glib::ustring &filter, const Glib::ustring &algo, float &mixerRed, float &mixerGreen, void Color::computeBWMixerConstants (const Glib::ustring &setting, const Glib::ustring &filter, const Glib::ustring &algo, float &filcor, float &mixerRed, float &mixerGreen,
float &mixerBlue, float mixerOrange, float mixerYellow, float mixerCyan, float mixerPurple, float mixerMagenta, float &mixerBlue, float mixerOrange, float mixerYellow, float mixerCyan, float mixerPurple, float mixerMagenta,
bool autoc, bool complement, float &kcorec, double &rrm, double &ggm, double &bbm) bool autoc, bool complement, float &kcorec, double &rrm, double &ggm, double &bbm)
{ {
float somm; float somm;
float som = mixerRed+mixerGreen+mixerBlue; float som = mixerRed+mixerGreen+mixerBlue;
// rM = mixerRed, gM = mixerGreen, bM = mixerBlue ! // rM = mixerRed, gM = mixerGreen, bM = mixerBlue !
//presets //presets
if (setting=="RGB-Abs" || setting=="ROYGCBPM-Abs") if (setting=="RGB-Abs" || setting=="ROYGCBPM-Abs")
kcorec=som/100.f; kcorec=som/100.f;
@ -609,25 +608,24 @@ namespace rtengine {
kcorec = koymcp+som/100.f; kcorec = koymcp+som/100.f;
//Color filters //Color filters
float filred,filgreen,filblue; float filred,filgreen,filblue;
filred=1.f;filgreen=1.f;filblue=1.f; filred=1.f;filgreen=1.f;filblue=1.f;filcor=1.f;
if (filter=="None") {filred=1.f; filgreen=1.f; filblue=1.f;} if (filter=="None") {filred=1.f; filgreen=1.f; filblue=1.f; filcor=1.f;}
else if (filter=="Red") {filred=1.f; filgreen=0.05f;filblue=0.f;} else if (filter=="Red") {filred=1.f; filgreen=0.05f;filblue=0.f; filcor=1.08f;}
else if (filter=="Orange") {filred=1.f; filgreen=0.6f; filblue=0.f;} else if (filter=="Orange") {filred=1.f; filgreen=0.6f; filblue=0.f; filcor=1.35f;}
else if (filter=="Yellow") {filred=1.f; filgreen=1.f; filblue=0.05f;} else if (filter=="Yellow") {filred=1.f; filgreen=1.f; filblue=0.05f;filcor=1.23f;}
else if (filter=="YellowGreen") {filred=0.6f; filgreen=1.f; filblue=0.3f;} else if (filter=="YellowGreen") {filred=0.6f; filgreen=1.f; filblue=0.3f;filcor=1.32f;}
else if (filter=="Green") {filred=0.2f; filgreen=1.f; filblue=0.3f;} else if (filter=="Green") {filred=0.2f; filgreen=1.f; filblue=0.3f;filcor=1.41f;}
else if (filter=="Cyan") {filred=0.05f;filgreen=1.f; filblue=1.f;} else if (filter=="Cyan") {filred=0.05f;filgreen=1.f; filblue=1.f; filcor=1.23f;}
else if (filter=="Blue") {filred=0.f; filgreen=0.05f;filblue=1.f;} else if (filter=="Blue") {filred=0.f; filgreen=0.05f;filblue=1.f; filcor=1.20f;}
else if (filter=="Purple") {filred=1.f; filgreen=0.05f;filblue=1.f;} else if (filter=="Purple") {filred=1.f; filgreen=0.05f;filblue=1.f; filcor=1.23f;}
mixerRed = mixerRed * filred;
mixerRed = mixerRed * filred;
mixerGreen = mixerGreen * filgreen; mixerGreen = mixerGreen * filgreen;
mixerBlue = mixerBlue * filblue; mixerBlue = mixerBlue * filblue;
mixerRed = mixerRed / (mixerRed + mixerGreen + mixerBlue); mixerRed = filcor*mixerRed / (mixerRed + mixerGreen + mixerBlue);
mixerGreen = mixerGreen / (mixerRed + mixerGreen + mixerBlue); mixerGreen = filcor*mixerGreen / (mixerRed + mixerGreen + mixerBlue);
mixerBlue = mixerBlue / (mixerRed + mixerGreen + mixerBlue); mixerBlue = filcor*mixerBlue / (mixerRed + mixerGreen + mixerBlue);
if(filter!="None") { if(filter!="None") {
som = mixerRed+mixerGreen+mixerBlue; som = mixerRed+mixerGreen+mixerBlue;
if(setting=="RGB-Abs" || setting=="ROYGCBPM-Abs") kcorec = kcorec*som; if(setting=="RGB-Abs" || setting=="ROYGCBPM-Abs") kcorec = kcorec*som;

View File

@ -734,7 +734,7 @@ public:
* @param ggm green channel of the mixer (return value) * @param ggm green channel of the mixer (return value)
* @param bbm blue channel of the mixer (return value) * @param bbm blue channel of the mixer (return value)
*/ */
static void computeBWMixerConstants (const Glib::ustring &setting, const Glib::ustring &filter, const Glib::ustring &algo, float &mixerRed, float &mixerGreen, static void computeBWMixerConstants (const Glib::ustring &setting, const Glib::ustring &filter, const Glib::ustring &algo, float &filcor, float &mixerRed, float &mixerGreen,
float &mixerBlue, float mixerOrange, float mixerYellow, float mixerCyan, float mixerPurple, float mixerMagenta, float &mixerBlue, float mixerOrange, float mixerYellow, float mixerCyan, float mixerPurple, float mixerMagenta,
bool autoc, bool complement, float &kcorec, double &rrm, double &ggm, double &bbm); bool autoc, bool complement, float &kcorec, double &rrm, double &ggm, double &bbm);

View File

@ -3422,8 +3422,8 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, EditBuffer *e
mixerPurple = 33.f; mixerPurple = 33.f;
mixerCyan = 33.f; mixerCyan = 33.f;
} }
float filcor;
Color::computeBWMixerConstants(params->blackwhite.setting, params->blackwhite.filter,params->blackwhite.algo, Color::computeBWMixerConstants(params->blackwhite.setting, params->blackwhite.filter,params->blackwhite.algo,filcor,
bwr, bwg, bwb, mixerOrange, mixerYellow, mixerCyan, mixerPurple, mixerMagenta, bwr, bwg, bwb, mixerOrange, mixerYellow, mixerCyan, mixerPurple, mixerMagenta,
params->blackwhite.autoc, complem, kcorec, rrm, ggm, bbm); params->blackwhite.autoc, complem, kcorec, rrm, ggm, bbm);

View File

@ -1088,10 +1088,16 @@ void BlackWhite::updateRGBLabel () {
b = mixerBlue->getValue(); b = mixerBlue->getValue();
} }
double mixR, mixG, mixB; double mixR, mixG, mixB;
float filcor;
Glib::ustring sSetting = getSettingString(); Glib::ustring sSetting = getSettingString();
Color::computeBWMixerConstants(sSetting, getFilterString(),getalgoString(), r, g, b, Color::computeBWMixerConstants(sSetting, getFilterString(),getalgoString(), filcor, r, g, b,
mixerOrange->getValue(), mixerYellow->getValue(), mixerCyan->getValue(), mixerPurple->getValue(), mixerMagenta->getValue(), mixerOrange->getValue(), mixerYellow->getValue(), mixerCyan->getValue(), mixerPurple->getValue(), mixerMagenta->getValue(),
autoch->get_active(), enabledcc->get_active(), kcorrec, mixR, mixG, mixB); autoch->get_active(), enabledcc->get_active(), kcorrec, mixR, mixG, mixB);
if( filcor!=1.f){
r=kcorrec*r/(r+g+b);
g=kcorrec*g/(r+g+b);
b=kcorrec*b/(r+g+b);
}
RGBLabels->set_text( RGBLabels->set_text(
Glib::ustring::compose(M("TP_BWMIX_RGBLABEL"), Glib::ustring::compose(M("TP_BWMIX_RGBLABEL"),
Glib::ustring::format(std::fixed, std::setprecision(1), r*100.), Glib::ustring::format(std::fixed, std::setprecision(1), r*100.),