[FFmpeg-user] Color Channel Expression

Jon bae jonbae77 at gmail.com
Tue Aug 1 12:00:31 EEST 2017


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

ImageColor/ImageAlpha
or:

*b.* to overlay the image with a different math operation:


foregroundColor + ( backgroundColor * ( 1 - foregroundAlpha ) )


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.)


More information about the ffmpeg-user mailing list