[FFmpeg-user] Question about "normalize" filter

Michael Koch astroelectronic at t-online.de
Mon Jan 30 11:03:49 EET 2023


Am 30.01.2023 um 08:47 schrieb Paul B Mahol:
> On Mon, Jan 30, 2023 at 12:23 AM Michael Koch <astroelectronic at t-online.de>
> wrote:
>
>> Am 29.01.2023 um 23:36 schrieb Paul B Mahol:
>>> On 1/29/23, Michael Koch <astroelectronic at t-online.de> wrote:
>>>> Am 29.01.2023 um 23:07 schrieb Paul B Mahol:
>>>>> On 1/29/23, Michael Koch <astroelectronic at t-online.de> wrote:
>>>>>> Am 29.01.2023 um 22:05 schrieb Paul B Mahol:
>>>>>>> On 1/29/23, Michael Koch <astroelectronic at t-online.de> wrote:
>>>>>>>> Am 29.01.2023 um 19:32 schrieb Paul B Mahol:
>>>>>>>>> On 1/29/23, Michael Koch <astroelectronic at 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.
>>>>>>>> How must I set the options for the desired behaviour?
>>>>>>> Set first strength to reverse of second strength.
>>>>>>> So 1.0 and 0.0 or 0.0 and 1.0
>>>>>> I did try with strength=0:strength2=1 but the output isn't as
>> expected.
>>>>>> I'm using this input image:
>>>>>> http://www.astro-electronic.de/flat.png
>>>>>>
>>>>>> The pixel values are about 171 in the center and 107 in the top right
>>>>>> corner.
>>>>>> The center to corner ratio is 171 / 107 = 1.6
>>>>>>
>>>>>> In the output image I measure 248 in the center (which is almost as
>>>>>> expected, probably correct because I'm measuring the average of a 7x7
>>>>>> neighborhood), but I measure 122 in the top right corner.
>>>>>> The center to corner ratio is 248 / 122 = 2.03
>>>>>> The corner is too dark.
>>>>>>
>>>>> I checked with oscilloscope filter (s=1:tw=1:t=1:x=0), far left pixels
>>>>> (as they are darkest) and they are not changing (min values are same
>>>>> with and without filter run)
>>>>> With default parameters and just strength(2) set to your values, so
>>>>> the darkest pixels are left  untouched. Did not checked brightest
>>>>> pixels output, but they should be correct too.
>>>> But that's not the behaviour I need. All pixels shall be multiplied by
>>>> the same suitable constant, so that the brightest pixel becomes white.
>>>>
>>>> Input center: 171
>>>> Input corner: 107
>>>>
>>>> constant c = 255 / 171 =1.49
>>>> Output center: 171 * c = 255
>>>> Output corner: 107 * c = 160
>>>>
>>> Normalization does not do that and that functionality does not belong
>>> to such filter, it stretches ranges of all pixel values so they reach
>>> maximal possible range.
>> Can't you just add an option that disables the minimum finding
>> algorithm, and set the minimum to zero (=black)? That would do the job.
>>
> I just did, but for whatever reason you think its incorrect.

You wrote:

"With default parameters and just strength(2) set to your values, so
the darkest pixels are left  untouched."

However I want that black remains untouched. That's not the same, because the darkest pixels in the image aren't black.

The workaround is to insert a black pixel before normalizing:
-vf drawbox=w=1:h=1:color=black,normalize

Michael



More information about the ffmpeg-user mailing list