On 1/29/23, Michael Koch <astroelectro...@t-online.de> wrote: > Hello, > > if I understood the documentation correctly, the normalize filter maps > the darkest input pixel to blackpt and the brightest input pixel to > whitept: > darkest pixel --> blackpt > brightest pixel --> whitept > > However I need a slightly different mapping: > A black input pixel shall remain black, and the brightest input pixel > shall become white. > black --> blackpt > brightest pixel --> whitept > > With other words: Just multiply all pixels by a suitable constant. Don't > add or subtract anything. > Is this possible? > > Known workaround: Make sure that the input frame contains a black pixel, > by inserting one in a corner.
Try attached patch. > > Michael > _______________________________________________ > ffmpeg-user mailing list > ffmpeg-user@ffmpeg.org > https://ffmpeg.org/mailman/listinfo/ffmpeg-user > > To unsubscribe, visit link above, or email > ffmpeg-user-requ...@ffmpeg.org with subject "unsubscribe". >
diff --git a/libavfilter/vf_normalize.c b/libavfilter/vf_normalize.c index 43ed3c67b3..91499bd009 100644 --- a/libavfilter/vf_normalize.c +++ b/libavfilter/vf_normalize.c @@ -101,7 +101,9 @@ typedef struct NormalizeContext { uint8_t whitept[4]; int smoothing; float independence; + float independence2; float strength; + float strength2; uint8_t co[4]; // Offsets to R,G,B,A bytes respectively in each pixel int depth; @@ -132,6 +134,8 @@ static const AVOption normalize_options[] = { { "smoothing", "amount of temporal smoothing of the input range, to reduce flicker", OFFSET(smoothing), AV_OPT_TYPE_INT, {.i64=0}, 0, INT_MAX/8, FLAGS }, { "independence", "proportion of independent to linked channel normalization", OFFSET(independence), AV_OPT_TYPE_FLOAT, {.dbl=1.0}, 0.0, 1.0, FLAGSR }, { "strength", "strength of filter, from no effect to full normalization", OFFSET(strength), AV_OPT_TYPE_FLOAT, {.dbl=1.0}, 0.0, 1.0, FLAGSR }, + { "independence2", "proportion of independent to linked channel normalization, for brightest input", OFFSET(independence2), AV_OPT_TYPE_FLOAT, {.dbl=-1.0}, -1.0, 1.0, FLAGSR }, + { "strength2", "strength of filter, from no effect to full normalization, for brightest input", OFFSET(strength2), AV_OPT_TYPE_FLOAT, {.dbl=-1.0}, -1.0, 1.0, FLAGSR }, { NULL } }; @@ -335,22 +339,30 @@ static void normalize(NormalizeContext *s, AVFrame *in, AVFrame *out) // Now, process each channel to determine the input and output range and // build the lookup tables. for (c = 0; c < 3; c++) { + float strength[2], independence[2]; int in_val; + + strength[0] = s->strength; + strength[1] = s->strength2 >= 0.f ? s->strength2 : s->strength; + + independence[0] = s->independence; + independence[1] = s->independence2 >= 0.f ? s->independence2 : s->independence; + // Adjust the input range for this channel [min.smoothed,max.smoothed] // by mixing in the correct proportion of the linked normalization // input range [rgb_min_smoothed,rgb_max_smoothed]. - min[c].smoothed = (min[c].smoothed * s->independence) - + (rgb_min_smoothed * (1.0f - s->independence)); - max[c].smoothed = (max[c].smoothed * s->independence) - + (rgb_max_smoothed * (1.0f - s->independence)); + min[c].smoothed = (min[c].smoothed * independence[0]) + + (rgb_min_smoothed * (1.0f - independence[0])); + max[c].smoothed = (max[c].smoothed * independence[1]) + + (rgb_max_smoothed * (1.0f - independence[1])); // Calculate the output range [min.out,max.out] as a ratio of the full- // strength output range [blackpt,whitept] and the original input range // [min.in,max.in], based on the user-specified filter strength. - min[c].out = (s->sblackpt[c] * s->strength) - + (min[c].in * (1.0f - s->strength)); - max[c].out = (s->swhitept[c] * s->strength) - + (max[c].in * (1.0f - s->strength)); + min[c].out = (s->sblackpt[c] * strength[0]) + + (min[c].in * (1.0f - strength[0])); + max[c].out = (s->swhitept[c] * strength[1]) + + (max[c].in * (1.0f - strength[1])); // Now, build a lookup table which linearly maps the adjusted input range // [min.smoothed,max.smoothed] to the output range [min.out,max.out].
_______________________________________________ ffmpeg-user mailing list ffmpeg-user@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-user To unsubscribe, visit link above, or email ffmpeg-user-requ...@ffmpeg.org with subject "unsubscribe".