[FFmpeg-user] Question about "normalize" filter

Paul B Mahol onemda at gmail.com
Mon Jan 30 11:29:10 EET 2023


On 1/30/23, Michael Koch <astroelectronic at t-online.de> wrote:
> 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

This command produces more convincing output:

-vf colorlevels=rimin=0:gimin=0:bimin=0:rimax=-1:gimax=-1:bimax=-1

this will pick max pixels values from input and stretch it do default
output max.


More information about the ffmpeg-user mailing list