《ffmpeg basics》中文版 -- 22.颜色校正

22.颜色校正

​ 颜色校正通常指的是类似于调整亮度,颜色平衡(红绿蓝三通道),灰度系数,色调,亮度等颜色相关的编辑操作。这些操作 FFmpeg 都有提供,我们只需对特定的过滤器指定恰当的参数就可完成,下面是对颜色校正的一些理论指导。

使用查找表进行视频修改

​ FFmpeg 中有三个视频 filter 可以产生查找表(lookup table,或 LUT),表中为每个像素的输入值提供一个对应的输出值,使用这个查找表时,会将输入视频帧中的像素按照查找表将其一一转化为对应的输出值,然后编码为输出。

在这里插入图片描述

转化为黑白色图片

​ 将彩色图片转化为黑白色图片是非常常见的。下面我们将 SMPTE 转化为黑白色,我们可以使用下面任一命令:

ffplay -f lavfi -i smptebars -vf lut=cl=128:c2=128
ffplay -f lavfi -i smptebars -vf lutyuv=u=1128:v=128

在这里插入图片描述

颜色空间介绍

​ 想要恰当的使用 lutrgb 和 lutyuv filter,我们需要对 RGB 和 YUV 颜色空间有一定的了解:
在这里插入图片描述
​ 所有的颜色都可以由红绿蓝三个基础颜色组合而成。为了将这个概念引入数字视频中,就有了颜色模型和颜色空间的概念,它们决定了如何使用数字来表示一个颜色。最常见的颜色空间是 RGB 颜色空间,此时一个颜色可以表示为 3 个基本颜色以不同强度混合的结果,一般每个基本颜色的值取值范围为 0 到 255,表达为 16 进值为 0x00 ~ 0xff。

YUV颜色空间和它的派生物

​ 当彩色电视被发明之后,彩色的TV广播必须可以在旧有的黑白色电视中播放。基于人类的眼睛对绿色最为敏感,红色次之,蓝色再次之,于是就有了 YUV 颜色空间 以及后续的 Y’CbCr 颜色空间。

  • Y‘ 表示绿色的伽马校正亮度(gamma corrected brightness of a green color)
  • Cr 表示色度部分,值为红色减去亮度(chroma component of red color minus luma)
  • Cr 表示色度部分,值为蓝色减去亮度(chroma component of blue color minus luma)

Luma(luminance) 和 chroma(chrominance)

​ Luma,luminance:亮度 chroma,chrominance:色度

​ Luma 和 luminance 都表示图片的明亮程度(消色差的部分),Luma 用在视频引擎中,而 luminance 则用于颜色理论中(CIE , ICC 等),细节如下表所示:

在这里插入图片描述

​ Chroma 和 chrominance 都表示图片的颜色部分,术语 chrominance 主要用于颜色理论中,术语 chroma 则用于视频引擎中,尤其时使用 chroma 子采样。Chroma 通常被分为两个部分或两个组件( ’ 符号表示 gamma correction):

  • U = B’ - Y’ 或者 U = Cb (blue color - luma)
  • V = R’ - Y’ 或者 V = Cr (red color - luma)

像素格式

​ 颜色空间理论在电脑中以像素格式的形式实现。常见的像素格式有:rgb8,rgb24,rgba(a 通道为透明度),yuv420p,yuv422p 等等。例如,想要以纯蓝色显示 rgbtestsrc,则将红色和绿色设置为0:

ffplay -f lavfi -i rgbtestsrc -vf lutrgb=r=0:g=0

在这里插入图片描述

RGB像素格式修改

​ 我们可以使用 lutrgb filter 来修改 RGB 中特定通道的值。它可以将颜色的红绿蓝三个部分在 0 ~ 255 之前做调整(超出 0 ~ 255 之后,应当作 0 或 255 处理),以下是使用 lutrgb 显示 rgbtestsrc 的一些例子:

在这里插入图片描述

在这里插入图片描述

颜色平衡

​ 除了可以直接对红绿蓝三个通道设置 0 ~ 255 之间的值之外,我们还可以对输入的颜色值做乘法或者除法处理,其中 val 表示输入的像素值,那么 lutrgb=b=val*2 就表示将蓝色通道的值变为输入值的两倍。

YUV像素格式的修改

​ 我们可以使用 lutyuv filter 来修改 YUV像素 中特定组成的值。参数 y 可以调整亮度,参数 u 可以调整绿色平衡,参数 v 可以调整红色平衡,以下是使用 lutyuv 显示 rgbtestsrc 的一些例子:

在这里插入图片描述

在这里插入图片描述

亮度校正

​ 在 RGB 颜色模型中,亮度是通过 3 个基本颜色共同设置的,而在 YUV(Y’CbCr)颜色模型中则只通过 y (luma)来设置。例如,想要将输入的亮度调整为原本的 90% ,则可以使用 lutyuv=y=val*0.9。

色相和饱和度设置

​ 另一种表示颜色的方法为 HSB(HSV)颜色空间,分别表示 色相-饱和度-亮度(色相-饱和度-值(value))。和 YUV 使用一个线性方框不同,HSB 使用圆柱坐标体系,其中色相是绕垂直坐标的一个角度,饱和度为到垂直坐标的距离。FFmpeg 提供了 hue filter 来支持 HSB 颜色空间,其描述如下:
在这里插入图片描述
​ 色相是一个从 0 到 360 度的角度,它是由 CIE 定义的,含义如下:如果将红绿蓝分别作为一个标识(即0度,120度,240度),那么色相表示了与这三个标识的距离。例如,如果想要将输入的色相修改为 60 度,那么命令如下:

ffplay -i coconut.jpg -vf hue=60

在这里插入图片描述

​ 如果想要调整图片的饱和度,则可以设置 s 参数为适当的值,例如想要增加饱和度为值 5 ,命令如下:

ffplay -i strawberry.jpg -vf hue=s=5

​ 下图显示了对 s 参数分别设置 -10,-5,0,5,10时的效果,请注意 0 值表示黑白图片:

在这里插入图片描述

在两个窗口中做比较

​ 许多图片或视频编辑器都会提供两个窗口,一个窗口显示输入,另一个则显示编辑后的效果,以便两者进行对比。如果想要在 FFmpeg 中实现类似的效果,那么我们可以使用 pad 和 overlay 来完成。

水平并列的窗口比较

​ 这种情况在第一章的 《Filter,filterchains 和 filtergraphs》一节中已经讲述过。第一个 filterchain 将输入分裂为两个,分别标识为 [1] 和 [2],第二个filterchain 将对 [1] 做一个水平的 2 倍填充并将结果标识为[A],第三个 filterchain 将对 [2] 做一定的操作并将输出表示为 [B] ,第四个 filterchain 将 [B] 覆盖到 [A] 上。下面就是使用 lutrgb filter 来执行整个流程的命令:

ffplay -f lavfi -i testsrc -vf split[1][2];[1]pad=iw*2[A];[2]lutrgb=g=256[B];[A][B]overlay=w

在这里插入图片描述

垂直并列的窗口比较

​ 想要提供垂直并列的窗口比较,我们只需要对上述水平并列的窗口比较做一些调整即可,整体的思路是一样的。我们在第二个 filterchain 中此时应该在垂直方向做填充,而在第四个 filterchine 中,则要调整覆盖时的 x 和 y 参数。我们将上述的示例修改一下,仅改变图像的位置,命令如下:

ffplay -f lavfi -i testsrc -vf split[1][2];[1]pad=iw:ih*2[A];[2]lutrgb=g=256[B];[A][B]overlay=0:h

在这里插入图片描述

窗口之间的间隔

​ 如果我们需要在水平分布的两个窗口之间留一个间隔,例如 10 像素大小,我们可以修改命令:

  • 将第二个 filterchain 修改为: pad=iw:ih*2+10

  • 将第四个 filterchain 修改为:overlay=0:h+10

​ 如果需要在垂直分布的两个窗口间留 10 像素的间隔,可以修改命令如下:

  • 将第二个 filterchain 修改为: pad=iw*2+10
  • 将第四个 filterchain 修改为:overlay=w+10

注:后续的部分就是各种变换窗口的位置和数量,更像是 pad 和 overlay 以及 filtergraph 的练习,和 颜色校正 没有任何的关系,因此将英文原版放在下面,有兴趣的可以自己查阅。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

H&A
发布了7 篇原创文章 · 获赞 4 · 访问量 885

猜你喜欢

转载自blog.csdn.net/qq_34305316/article/details/103938408