探索 FFmpeg Basics 音视频技术(22): 颜色修正

这个系列文章我们来介绍一位海外工程师如何探索 FFmpeg Basics 音视频技术,对于想要开始学习音视频技术的朋友,这些文章是份不错的入门资料,这是第 22 篇:FFmpeg  颜色修正。

—— 来自公众号“关键帧Keyframe”的分享

色彩校正通常涉及调整图像的亮度、色彩平衡(红色、绿色通道)、伽马、色调、饱和度等参数。在 FFmpeg 中,这些调整是通过为各种滤镜指定适当参数来实现的。

1、使用查找表进行视频修改

FFmpeg 包含三个视频滤镜,可以生成查找表(LUT),将每个像素分量的输入值绑定到输出值。新值将被应用到输入视频帧并编码到输出。

这个表格比较复杂,我将其拆分为以下内容:

描述lut 滤镜创建一个查找表,用于将每个像素分量的输入值绑定到输出值并应用到输入视频。该滤镜在输入时需要 YUV 或 RGB 像素格式。与每个选项相关的确切组件取决于输入中的格式。lutrgb 滤镜与 lut 滤镜相同,但在输入中需要 RGB 像素格式。lutyuv 滤镜与 lut 滤镜相同,但在输入中需要 YUV 像素格式。
语法lut=[c0=expr[:c1=expr[:c2=expr[:c3=expr]]]] 
lutrgb=[r=expr[:g=expr[:b=expr[:a=expr]]]] 
lutyuv=[y=expr[:u=expr[:v=expr[:a=expr]]]]

以下表格对参数进行了解释:

lut 滤镜lutrgb 滤镜lutyuv 滤镜
c0第一个像素组件r
c1第二个像素组件g
c2第三个像素组件b
c3第四个像素组件(与 alpha 相同)a

表达式 expr 中可用的变量和函数如下:

w, h输入的宽度和高度
val像素元素的输入值
clipval输入值在 minval-maxval 范围内被裁剪
maxval像素组件的最大值
minval像素组件的最小值
negval在 minval – maxval 范围内对像素组件值进行取反;negval = maxval – clipval + minval
clip(val)在 minval – maxval 范围内计算 val 的值
gammaval(γ)在 minval – maxval 范围内计算伽马校正值
注意:所有表达式的默认值为 val(像素输入值),因此默认情况下输出没有变化

2、转换为单色(黑白)图像

将彩色输入更改为仅包含黑白色彩的单色输出,对于单色监视器上的播放非常有用。要显示 SMPTE 条形图的黑白版本,可以使用以下命令之一:

ffplay -f lavfi -i smptebars -vf lut=c1=128:c2=128
ffplay -f lavfi -i smptebars -vf lutyuv=u=128:v=128
探索 FFmpeg Basics 音视频技术(22): 颜色修正

3、色彩空间简介

为了正确使用 lutrgb和 lutyuv滤镜,请在下表中比较 RGB和 YUV色彩空间:

探索 FFmpeg Basics 音视频技术(22): 颜色修正

所有颜色都可以通过三种基本颜色的组合来创建:红色、绿色和蓝色。为了将这一原理应用于数字视频,开发了色彩模型和色彩空间,以指定如何以数字形式呈现颜色的标准。基本色彩空间是 RGB(红 – 绿 – 蓝),其中任何颜色都表示为这三种颜色以不同强度混合的结果,通常以 0 到 255(256 = 216)或十六进制从 x00到 xff表示。

4、YUV 色彩空间及其衍生物

当彩色电视发明时,彩色电视必须能够在黑白电视机上播放。基于人眼对绿色的敏感程度高于红色,对蓝色的敏感程度最低,开发出了新的颜色空间 YUV 和后来的 Y’CbCr。

  • Y’ 是伽马校正的绿色亮度。
  • Cr 是红色减去亮度的色度分量。
  • Cb 是蓝色减去亮度的色度分量。

5、亮度和色度

亮度和色度分别表示图像的亮度(无色部分)。亮度用于视频工程和色彩理论(CIE、ICC 等)中的亮度,详情见下表:

亮度色度
定义伽马校正的 R’G’B’ 视频分量的加权和线性 RGB 视频分量的加权总和
符号Y’(主要符号表示伽马校正)Y
CCIR 601 的公式Y’ = 0.299 R’ + 0.587 G’ + 0.114 B’Y = 0.299 R + 0.587 G + 0.114 B
Rec. BT 709 的公式Y’ = 0.2126 R’ + 0.7152 G’ + 0.0722 B’Y = 0.2126 R + 0.7152 G + 0.0722 B

色度和色度表示图像的颜色部分。术语色度主要用于色彩理论,而术语色度用于视频工程中,尤其是在色度二次采样中。色度通常分为两个分量('表示伽马校正):

  • U = B’ – Y’ 或 U = Cb(蓝色 – 亮度)
  • V = R’ – Y’ 或 V = Cr(红色 – 亮度)

6、像素格式

色彩空间理论在计算机上的实现见第 2 章中的像素格式。常见的像素格式包括:rgb8、rgb24、rgba(alpha 通道表示透明度)、yuv420p、yuv422p 等。例如,若要仅显示 rgbtestsrc 的蓝色,可以将红色和绿色分量设置为零:

ffplay -f lavfi -i rgbtestsrc -vf lutrgb=r=0:g=0
探索 FFmpeg Basics 音视频技术(22): 颜色修正

7、修改 RGB 像素格式

若要调整 RGB 输入格式的特定通道,可以使用 lutrgb 滤镜。通过将 r、g 和 b 参数的值设置为 0 到 255(255 以上的值视为 255),可以调整色彩平衡。常用的组合在接下来的两个图像中进行了说明。

探索 FFmpeg Basics 音视频技术(22): 颜色修正
探索 FFmpeg Basics 音视频技术(22): 颜色修正

8、色彩平衡调整

要调整红色、绿色或蓝色通道的亮度,可以为 lutrgb 滤镜的 r、g 或 b 参数设置一个介于 0 到 255 之间的数字。还可以对输入值进行减法(降低)或乘法(增加)运算。例如,将蓝色强度加倍,可以使用表达式 lutrgb = b = val * 2

9、修改 YUV 像素格式

若要修改 YUV 格式的组件,可以使用 lutyuv 滤镜。y 参数用于调整亮度(亮度),u 参数用于调整蓝色平衡,v 参数用于调整红色平衡。常用的组合在接下来的两个图像中进行了说明。

探索 FFmpeg Basics 音视频技术(22): 颜色修正
探索 FFmpeg Basics 音视频技术(22): 颜色修正

10、亮度调整

在 RGB 色彩模型中,亮度是由三种颜色组合而成的。在 YUV (Y’CbCr) 模型中,它直接与 Y(亮度)参数设置相关。例如,若要将亮度调整为输入的 90%,可以使用表达式 lutyuv = y = val * 0.9

11、色调和饱和度设置

另一种表示 RGB 色彩空间的方法是 HSB(HSV),即色相饱和度 – 亮度(Hue – Saturation – Value)色彩空间。它使用圆柱坐标系而不是线性立方体,其中色相是围绕中心垂直轴的角度,饱和度是与该轴的距离。对于色调和饱和度调整,FFmpeg 提供了一个色调滤镜,描述如下:

描述调整输入帧的色调和饱和度
语法hue[=h=expr[:s=expr]]
参数描述
h, H色调角度,默认值为 0.0
s浮点数,范围从 -10 到 10,默认值为 1.0
表达式 expr 中可用的变量
n输入帧的帧数,从 0 开始
pts输入帧的显示时间戳,以时间基表示
r输入视频的帧速率,未知时为 NaN
t以秒为单位的时间戳,未知时为 NaN
tb输入视频的时间基
其他语法是 hue = hue:saturation,其中色调和饱和度是数字而不是表达式。
探索 FFmpeg Basics 音视频技术(22): 颜色修正

色调是介于 0 到 360 度之间的角度,CIE 将其定义为“刺激可以被描述为与被称为红色、绿色、蓝色和黄色的刺激相似或不同的程度”。例如,若要将输入的色调调整为 60 度,可以使用以下命令:

ffplay -i coconut.jpg -vf hue=60

若要调整图像的饱和度,可以将 s参数设置为一个合适的值。例如,将饱和度增加到 5,可以使用以下命令:

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

下图说明了值 -10、-5、0、5 和 10 的用法。注意值 0 会导致单色(黑白)图像。

探索 FFmpeg Basics 音视频技术(22): 颜色修正

12、两窗口比较

许多图像和视频编辑器提供了第二个窗口来比较输入的变化。为了在 FFmpeg 中实现类似的比较,可以在过滤器图中使用四个过滤链的 split、pad 和 overlay 过滤器。

13、两窗口水平比较

这种类型的比较在第 1 章的过滤器、过滤链和过滤器图部分已经介绍过。第一个过滤链将输入分为两个输出,分别标记为 [1] 和 [2]。第二个过滤链为两个窗口创建一个填充,标记为 [A]。第三个过滤链对输出 [2] 应用过滤器,结果标记为 [B]。第四个过滤链将修改后的输入 [B] 覆盖到新的填充 [A] 上。以下示例使用 lutrgb 过滤器来说明这种方法:

ffplay -f lavfi -i testsrc -vf ^ split[1][2];[1]pad=iw*2[A];[2]lutrgb=g=256[B];[A][B]overlay=w
探索 FFmpeg Basics 音视频技术(22): 颜色修正

14、两窗口垂直比较

为了实现垂直窗口比较,只需更改第二个和第四个 filtergraph,其他参数与水平比较相同。在第二个 filtergraph 中,将输入高度(ih)乘以 2 作为 y 参数。在第四个 filtergraph 中,将 x 参数设置为 0,h(输入高度)设置为 0。以下示例演示了这种方法,与前面的示例相同,但修改了窗口位置(更改部分已下划线标出):

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
探索 FFmpeg Basics 音视频技术(22): 颜色修正

15、窗口间距

如果需要在两个窗口之间留出空间,例如 10 像素,可以按以下方式指定:

  • 在第二个 filterchain 中,例如 pad=iw:ih*2+10。
  • 在第四个 filterchain 中,例如 overlay=0:h+10,为水平比较留出 50 像素空间,指定为:
  • 在第二个 filterchain 中:pad=iw*2+10。
  • 在第四个 filterchain 中:overlay=w+10。

16、第一次修改版本

若要将修改后的版本水平放置,可以使用以下命令:

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

垂直比较中修改后的输入位于顶部,使用以下命令创建:

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

17、无输入的修改版本

以下命令显示两个修改后的输入,没有原始输入。第二个 filter 包含一个修改了第一个窗口内容的 filter:

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

18、三窗口比较

在复杂的视频编辑中,可以同时将输入与两个修改后的版本进行比较。为了在三个窗口中显示比较结果,filtergraph使用了六个 filterchain。

19、三窗口水平比较

为了创建一个水平三窗口比较,可以指定六个 filterchain:

  • filterchain 将输入分为三个相同的输出,标记为 [1]、[2]、[3]
  • filterchain 为输入 [1] 创建一个三倍宽度的填充,输出标记为 [A]
  • filterchain 对输入 [2] 应用某些 filter(s),输出标记为 [B]
  • filterchain 对输入 [3] 应用某些 filter(s),输出标记为 [C]
  • filterchain 将输出 [B] 覆盖到 [A] 上,x 坐标为 w,输出标记为 [D]
  • filterchain 将输出 [C] 覆盖到 [D] 上,x 坐标为 w*2(两倍输入宽度)

例如,以下命令将 testsrc 模式与修改后的 u 组件(2)和修改后的 v 组件(3)进行比较:

ffplay -f lavfi -i testsrc -vf ^ split=3[1][2][3];[1]pad=iw*3[A];[2]lutyuv=u=val*1.5[B];^ [3]lutyuv=v=val*1.5[C];[A][B]overlay=w[D];[D][C]overlay=w*2
探索 FFmpeg Basics 音视频技术(22): 颜色修正

20、三窗口垂直比较

对于垂直比较,修改以下 filterchain:

  • filterchain:pad filter 的宽度参数为输入宽度,高度参数为输入高度的三倍:pad=iw:ih*3。
  • filterchain:overlay filter 的 x 参数为 0,y 参数为输入高度:overlay=0:h。
  • filterchain:overlay filter 的 x 参数为 0,y 参数为输入高度的两倍:overlay=0:h*2。
ffplay -f lavfi -i testsrc -vf ^ split=3[1][2][3];[1]pad=iw:ih*3[A];^ [2]lutyuv=u=val*1.5[B];[3]lutyuv=v=val*1.5[C];^ [A][B]overlay=0:h[D];[D][C]overlay=0:h*2
探索 FFmpeg Basics 音视频技术(22): 颜色修正

21、输入在中间窗口

以下命令将输入置于中间,对 filterchains 的修改类似于前面的示例(将未更改输入的 x 坐标设置为输入宽度:iw):

ffplay -f lavfi -i testsrc -vf ^ split=3[1][2][3];[1]pad=iw*3:ih:iw[A];[2]lutyuv=u=val*1.5[B];^ [3]lutyuv=v=val*1.5[C];[A][B]overlay[D];[D][C]overlay=w*2

若要将输入垂直置于中间,可以使用以下命令:

ffplay -f lavfi -i testsrc -vf ^ split=3[1][2][3];[1]pad=iw:ih*3:0:ih[A];[2]lutyuv=u=val*1.5[B];^ [3]lutyuv=v=val*1.5[C];[A][B]overlay[D];[D][C]overlay=0:h*2
探索 FFmpeg Basics 音视频技术(22): 颜色修正

22、两窗和三窗亮度校正

以下示例展示了在两窗和三窗预览中进行亮度调整。若要将图像显示在输入值 1.5 倍亮度的版本旁边,可以使用以下命令:

ffplay -i apple.avi -vf ^ split[1][2];[1]pad=iw*2[A];[2]lutyuv=y=val*1.5[B];[A][B]overlay=w
探索 FFmpeg Basics 音视频技术(22): 颜色修正

下一个示例是在之前的三窗口版本中添加了一个中间的修改版本,其中输入亮度乘以 1.2:

ffplay -i apple.avi -vf ^ split=3[1][2][3];[1]pad=iw*3[A];[2]lutyuv=y=val*1.2[B];^ [3]lutyuv=y=val*1.5[C];[A][B]overlay=w[D];[D][C]overlay=w*2
探索 FFmpeg Basics 音视频技术(22): 颜色修正

若要将输入定位到中央窗口,可以使用以下命令:

ffplay -i apple.avi -vf ^ split=3[1][2][3];[1]pad=iw*3:ih:iw[A];[2]lutyuv=y=val*1.2[B];^ [3]lutyuv=y=val*1.5[C];[A][B]overlay[D];[D][C]overlay=w*2
探索 FFmpeg Basics 音视频技术(22): 颜色修正

如果我们希望输入显示在第三个窗口中,只需对上一个示例中的两个 filterchain 进行修改:

  • filterchain:pad filter 的 x 参数设置为 iw*2。
  • filterchain:overlay filter 的 x 参数设置为 w(输入宽度)。

以下命令在第三个窗口中显示输入:

   ffplay -i apple.avi -vf ^ split=3[1][2][3];[1]pad=iw*3:ih:iw*2[A];[2]lutyuv=y=val*1.2[B];^ [3]lutyuv=y=val*1.5[C];[A][B]overlay[D];[D][C]overlay=w

23、四窗口比较

为了获得更好的结果并进行各种实验,我们可以同时对输入进行三次修改。为了在四个窗口中显示比较结果,filtergraph 包含八个 filterchain:

  • filterchain 将输入分割为四个相同的输出,标记为 [1]、[2]、[3]、[4]
  • filterchain 从 [1] 输入创建一个宽度和高度均为两倍的填充,输出标记为 [a]
  • filterchain 通过某些 filter(s) 修改 [2] 输入,输出标记为 [B]
  • filterchain 通过某些 filter(s) 修改 [3] 输入,输出标记为 [C]
  • filterchain 通过某些 filter(s) 修改 [4] 输入,输出标记为 [D]
  • filterchain 将 [B] 输入覆盖到 [A] 输入上,x 坐标为输入宽度,输出标记为 [E]
  • filterchain 将 [C] 输入覆盖到 [E] 输入上,x 为 0,y 为输入高度,输出标记为 [F]
  • filterchain 将 [D] 输入覆盖到 [F] 输入上,x 坐标为输入宽度,y 为输入高度。

例如,以下命令将番茄与特定颜色通道值加倍的版本进行比较。右上角的窗口增强了红色通道,左下角的窗口增强了绿色通道,右下角的窗口增强了蓝色通道:

 ffplay -i tomato.mpg -vf split=4[1][2][3][4];[1]pad=iw*2:ih*2[A];^ [2]lutrgb=r=val*2[B];[3]lutrgb=g=val*2[C];[4]lutrgb=b=val*2[D];^ [A][B]overlay=w[E];[E][C]overlay=0:h[F];[F][D]overlay=w:h
探索 FFmpeg Basics 音视频技术(22): 颜色修正

音视频方向学习、求职,欢迎加入我们的星球

丰富的音视频知识、面试题、技术方案干货分享,还可以进行面试辅导

探索 FFmpeg Basics 音视频技术(22): 颜色修正

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。

(0)

相关推荐

发表回复

登录后才能评论