diff --git a/src/iop/highlights.c b/src/iop/highlights.c index 1ba69b41c..efc42c904 100644 --- a/src/iop/highlights.c +++ b/src/iop/highlights.c @@ -1224,6 +1224,7 @@ static inline void guide_laplacians(const float *const restrict high_freq, const // fetch the clipping mask opacity : opaque (alpha = 100 %) where clipped const float alpha = clipping_mask[index + ALPHA]; const float alpha_comp = 1.f - clipping_mask[index + ALPHA]; + const dt_aligned_pixel_t alpha_ch = { clipping_mask[index + RED], clipping_mask[index + GREEN], clipping_mask[index + BLUE], clipping_mask[index + ALPHA] }; dt_aligned_pixel_t high_frequency = { HF[index + 0], HF[index + 1], HF[index + 2], HF[index + 3] }; @@ -1295,8 +1296,9 @@ static inline void guide_laplacians(const float *const restrict high_freq, const a_HF[c] = fmaxf(covariance_HF[c] / (variance_HF[guiding_channel_HF]), 0.f); b_HF[c] = means_HF[c] - a_HF[c] * means_HF[guiding_channel_HF]; - high_frequency[c] = alpha * (a_HF[c] * high_frequency[guiding_channel_HF] + b_HF[c]) - + alpha_comp * high_frequency[c]; + // Evaluate the regression line, but never darken any individual channel + const float ch_reconstructed = MAX(a_HF[c] * high_frequency[guiding_channel_HF] + b_HF[c], high_frequency[c]); + high_frequency[c] = alpha_ch[c] * ch_reconstructed + (1.f - alpha_ch[c]) * high_frequency[c]; } }