[FFmpeg-user] Color Channel Expression

Paul B Mahol onemda at gmail.com
Tue Aug 1 12:13:24 EEST 2017


On 8/1/17, Jon bae <jonbae77 at gmail.com> wrote:
> 2017-08-01 9:53 GMT+02:00 Paul B Mahol <onemda at gmail.com>:
>
>> On 8/1/17, Jon bae <jonbae77 at gmail.com> wrote:
>> > 2017-07-31 22:16 GMT+02:00 Paul B Mahol <onemda at gmail.com>:
>> >
>> >> On 7/31/17, Jonathan Baecker <jonbae77 at gmail.com> wrote:
>> >> >
>> >> >
>> >> > 2017-07-31 14:41 GMT+02:00 Paul B Mahol <onemda at gmail.com
>> >> > <mailto:onemda at gmail.com>>:
>> >> >
>> >> >     On 7/31/17, Jon bae <jonbae77 at gmail.com
>> >> > <mailto:jonbae77 at gmail.com>>
>> >> >     wrote:
>> >> >      > 2017-07-31 14:00 GMT+02:00 Paul B Mahol <onemda at gmail.com
>> >> >     <mailto:onemda at gmail.com>>:
>> >> >      >
>> >> >      >> On 7/31/17, Jon bae <jonbae77 at gmail.com
>> >> >     <mailto:jonbae77 at gmail.com>> wrote:
>> >> >      >> > 2017-07-31 10:30 GMT+02:00 Paul B Mahol <onemda at gmail.com
>> >> >     <mailto:onemda at gmail.com>>:
>> >> >      >> >>
>> >> >      >> >>>
>> >> >      >> >>> What exactly you tried?
>> >> >      >> >>>
>> >> >      >> >>> Perhaps you want premultiply filter?
>> >> >      >> >>>
>> >> >      >> >>> Yes I have a video and a lower third, and I want to
>> overlay
>> >> >     the lower
>> >> >      >> >> third. But my alpha channel from the lower third is not
>> >> >     pre-devided
>> >> >      >> >> with
>> >> >      >> >> the alpha channel, so  I need to do a channel division in
>> >> > ffmpeg.
>> >> >      >> >> Something like:
>> >> >      >> >>
>> >> >      >> >> ffmpeg -i video.mp4 -i lowerthird.png -filter_complex
>> >> >      >> >> [1:v]geq=r=r/a:g=g/a:b=b/a[gq];[0:v][gq]overlay ...
>> >> output.mp4
>> >> >      >> >>
>> >> >      >> >> I see that you wrote a filter for this, but can you please
>> >> >     give me an
>> >> >      >> > example of how it works? I don't get it to run.
>> >> >      >>
>> >> >      >> "I don't get it to run" means nothing to me.
>> >> >      >>
>> >> >      >> I'm not sure if I use the filter correct... But with this:
>> >> >      >
>> >> >      > ffmpeg -i video.mp4 -i image.png -filter_complex
>> >> >      > "[0:v]format=rgba[a];[1:v]format=rgba[b];[a][b]premultiply"
>> >> >      >
>> >> >      > My result is, that everything what had alpha = 0, in my image,
>> >> > is
>> >> > now
>> >> >      > black. Mybe I understand the use case wrong, but how you would
>> >> >     use this
>> >> >      > filter?
>> >> >
>> >> >     Try harder to explain your use case?
>> >> >
>> >> > Sorry, my english is not so good, but I will try it. In the
>> >> > attachment
>> >> > you found 3 images. Universum.png is my original lower third, it
>> >> > comes
>> >> > out from blackmagic fusion. Universum-comp.jpg show the composite of
>> >> > a
>> >> > background video with the lower third, this is the correct result.
>> >> > The
>> >> > Universium-ffmpeg is the version from ffmpeg, as you see ffmpeg
>> handles
>> >> > the alpha channel different so the lower third is more dark.
>> >> >
>> >> > I can simulate the same effect, from ffmpeg, in my compositing
>> program,
>> >> > when I load the lower third image with the option "Post-Multiply by
>> >> > Alpha". I guess this is what ffmpeg does in Background, when it load
>> >> > images with alpha channel.
>> >> > To get rid of this effect now in my composition program I have to
>> >> > divide
>> >> > the color channel from the lower third with its own alpha:
>> >> > red/alpha;green/alpha;blue/alpha. Now I can overlay the lower third
>> and
>> >> > the result is correct.
>> >> >
>> >> > This division now I would need in ffmpeg. I though I can do it with
>> >> > your
>> >> > premultiply filter, but maybe not.
>> >>
>> >> Perhaps you want overlay filter?
>> >>
>> >
>> > No the overlay filter don't handle the alpha channel correct, that is
>> what
>> > I was trying to say.
>> >
>> > You can try it by your own - get this 3 images and run this command:
>> >
>> > ffmpeg -loop 1 -f image2 -i backgroud.png -i multiplied-alpha.png
>> > -filter_complex overlay -pix_fmt rgb24 -f sdl "multiplied alpha"
>> >
>> > ffmpeg -loop 1 -f image2 -i backgroud.png -i pre-divide-alpha.png
>> > -filter_complex overlay -pix_fmt rgb24 -f sdl "divide alpha"
>> >
>> > The second one overlay the image correct. The first one overlay the
>> > image
>> > different, because the alpha channel is not the same.
>> >
>>
>> I stll do not know what you are trying to tell me.
>>
>> Do you have equatition how should R/G/B be calculated with Alpha?
>>
>
> I think to, that my hole description make it more complicate, then my
> question to the begin. I was trying to tell you, that my image, what I want
> to overlay, need to be process before, because its alpha channel is not in
> a way ffmpeg needs it for the overlay filter.
>
> You know that there is different way how a image have its color calculated
> with its own alpha channel. The color can be multiplied with the alpha, or
> can be straight. (
> https://microsoft.github.io/Win2D/html/PremultipliedAlpha.htm )
>
> My image now have a multiplied alpha. To get a correct overlay I have to:
>
> *a.* unmultiply the alpha channel
>

I'm just writing this filter. But you could do this really slowly with
geq filter.


> ImageColor/ImageAlpha
> or:
>
> *b.* to overlay the image with a different math operation:
>
>
> foregroundColor + ( backgroundColor * ( 1 - foregroundAlpha ) )

I plan to add this mode to overlay filter.

>
>
> I have make now more tests and it look like that method *a.* still not
> working 100%, even when it should. But method *b.* works.
>
>
> So my new question is: can ffmpeg combine images with a different math. Or
> is there a filter where I can write my own blend expressions (I know the
> blend filter, but until now I had no success with this one.)

blend does not allow for using components from other planes, and
adding such feature
is not trivial.


More information about the ffmpeg-user mailing list