moviepy音视频剪辑:颜色相关变换函数blackwhite、colorx、fadein/out、gamma_corr、invert_colors、lum_contrast、mask_color介绍

☞ ░ 前往老猿Python博文目录

一、引言

在《moviepy音视频剪辑:moviepy中的剪辑基类Clip详解》介绍了剪辑基类的fl、fl_time、fx方法,在《moviepy音视频剪辑:视频剪辑基类VideoClip的属性及方法详解》介绍了fl_image和subfx方法,在《Python+moviepy音视频剪辑:视频帧数据的本质、Clip的fl方法进行变换处理的原理以及滚屏案例》及《moviepy音视频剪辑:使用fl_time进行诸如快播、慢播、倒序播放等时间特效处理的原理和可能遇到的坑》分别介绍了fl和fl_time进行视频剪辑变换的原理及使用方法。

实际上moviepy所有视频变换的方法都是以Clip的fl方法为基础衍生出来的,最后都会调用到fl方法实施真正的变换,只是变换处理的逻辑由上面方法提供,如fl_time就是针对剪辑的时间线进行变换、fl_image就是针对剪辑的内容进行变换,开发者也可以根据自己的需要实现自己的变换方法。

为了支持一些常规的变换处理,moviepy提供了一系列常用的变换函数,开发者可以直接使用这些方法进行变换,这些函数都在moviepy.video.fx包下,基本上一个函数就是一个文件,在moviepy.editor通过import moviepy.video.fx.all as vfx中将这些函数都加载到了vfx模块下,可以直接通过vfx.函数名方式调用,也可以通过VideoClip类+函数名直接调用,这是因为在moviepy.editor执行录入如下语句:

for method in [
    "afx.audio_fadein",
    "afx.audio_fadeout",
    "afx.audio_normalize",
    "afx.volumex",
    "transfx.crossfadein",
    "transfx.crossfadeout",
    "vfx.crop",
    "vfx.fadein",
    "vfx.fadeout",
    "vfx.invert_colors",
    "vfx.loop",
    "vfx.margin",
    "vfx.mask_and",
    "vfx.mask_or",
    "vfx.resize",
    "vfx.rotate",
    "vfx.speedx",
]:

    exec("VideoClip.%s = %s" % (method.split(".")[1], method))

将这些函数动态赋值给了VideoClip的同名实例变量,但这些实例变量是在moviepy.editor中定义的,因此在VideoClip的派生子类中不能这样使用。

这些函数的调用可以通过Clip的fx方法和VideoClip的subfx方法进行调用,具体调用语法请参考上面介绍的博文内容。

由于变换函数比较多,老猿将其以自己的标准分为了大小变换、时间变换、颜色变换、内容变换四个部分分别介绍,这种分法不一定非常对,比如有些部分的变换可能既和时间相关又和内容相关,两个归类都可以,大家就不必深究了。在研究这些函数的功能时,是按字母顺序来研究的,研究完后按其变换归类放到4篇博文中,有些函数花的时间比较多,如内容变换的函数scroll、rotate、颜色变换的mask_color,还有个别函数到现在虽然知道功能但不知道怎么使用,因此这个研究过程耗时比较多,对这些函数的研究起始时间是6月22日,到现在已经一个多星期过去了,完全弄懂所有函数的功能和使用方法预计还需要几天时间。

不过到今天颜色相关的变换函数全部完成,因此本文作为介绍和剪辑颜色相关的变换函数就先发布了。

二、blackwhite函数

blackwhite函数用于将剪辑变成灰度剪辑,也就是将剪辑中的彩色像素灰度化。

调用语法:blackwhite(clip, RGB = None, preserve_luminosity=True)
参数说明:
  • clip:要处理的剪辑,通过fx或subfx调用时,会将调用者的实例对象self传入
  • RGB:浮点数三元组,用于设置RGB三种颜色的权重,缺省值为None,如果为None,则为1:1:1,如果设置为‘CRT_phosphor’,则RGB = [0.2125, 0.7154, 0.0721]
  • preserve_luminosity:preserve_luminosity用于控制是否保持亮度,如果保持亮度不变,则最终的RGB三个值相加为1。在这里的亮度luminosity不是lightness,实际上是对明度的度量,也称为灰阶值,是不同权重的R、G、B的组合值。实际上亮度是对颜色的明度(brightness)的一种度量(请见《音视频处理基础知识扫盲:数字视频YUV像素表示法以及视频帧和编解码概念介绍》)

三、colorx函数

colorx函数函数是将剪辑中每个帧的每个像素的RGB值与参数factor相乘,使得明度增大(参数factor大于1)或降低(参数factor小于1)。

调用语法:colorx(clip, factor)
案例:

下面的剪辑是对原视频剪辑加载后,将其明度乘以2和除以2之后的两个剪辑合成到一个剪辑中。

合成后的剪辑由于位置不同且明度大的覆盖了明度小的一半位置,效果就是两个不同明度的剪辑各显示了一半,可以看到明显的对比差异。如图:

在这里插入图片描述

四、fadein、fadeout函数

fadein函数使剪辑在开始播放后的指定时间内从某种颜色(默认为黑色)逐渐显示出来。fadeout使剪辑在剪辑快结束前的指定时间内逐渐淡隐于某种颜色(默认为黑色)。两个函数不改变剪辑的总时长。

这2个函数也可以用于遮罩,不过初始颜色必须取值为0-1之间的浮点数。

调用语法:

fadein(clip, duration, initial_color=None)
fadeout(clip, duration, final_color=None)

二者参数类似,duration为淡入淡出的时长,单位为秒。

案例:
if __name__=='__main__':
    threads = 8

    clipVideo = VideoFileClip(r"F:\video\WinBasedWorkHard_src.mp4").fx(vfx.fadein,5,(0,0,255)).fx(vfx.fadeout,5,(0,0,0))
    clipVideo.write_videofile(r"F:\video\fadeinout.mp4", threads=threads)
    clipVideo.close()

以上代码在剪辑首尾各设了5秒的淡入和淡出时间。

五、gamma_corr函数

gamma_corr函数用于对屏幕图像的色彩进行gamma修正,相关原理请参考《图像处理gamma修正(伽马γ校正)的原理和实现算法》,可能由于实现性能的问题,本函数实现时并没有完整实现gamma修正的算法。

调用语法: gamma_corr(clip, gamma)

参数gamma为修正的gamma值,典型的Gamma值是0.45,它会使CRT的影像亮度呈现线性。

六、invert_colors函数

invert_colors将像素对应颜色进行反转,具体反转方式为,对于标准剪辑,采用255减各RGB的值,对于遮罩剪辑,采用1.0减原值。颜色反转又称为负片转换。
invert_colors函数非常简单,就带一个clip参数。

七、lum_contrast函数

lum_contrast函数用于对剪辑的亮度对比度(luminosity-contrast )进行校正,这儿的亮度也即明度(参考《音视频处理基础知识扫盲:数字视频YUV像素表示法以及视频帧和编解码概念介绍》)。

调用语法:lum_contrast(clip, lum = 0, contrast=0, contrast_thr=127)
参数说明:
  1. lum:亮度要增加或减少的值,老猿建议为-255 到255之间的浮点数,但函数未进行限制,理论上任何值都可以
  2. contrast:对比度,对比度调整可能会使得画面中部分场景看不清,该怎么调整需要结合图像本身的情况来设定,函数未对该值进行限定,但过大的数可能导致画面失衡的概率大增
  3. contrast_thr:这个参数moviepy未进行解释,老猿是认为对比度调整的一个基准值,老猿建议使用缺省值127

七、mask_color函数

mask_color函数用于将一个剪辑自身进行变换后变成原剪辑的遮罩,当原剪辑与其他剪辑合成时,可以根据遮罩的透明度来确认其他剪辑的显示情况。

调用语法:mask_color(clip, color=None, thr=0, s=1)
说明:
  • color、thr和s都是将将标准剪辑变遮罩的运算因子,color是RGB颜色三元组,thr和s没有限制取值范围,但老猿建议thr、s都大于等于0
  • mask_color的三个参数都用于计算遮罩剪辑的像素透明度,其运算过程如下:
  1. 将原剪辑每个像素RGB值与参数color相减的结果的平方相加之后再开方,得到值x
  2. 如果thr为0或None,此时如果x为0则遮罩像素的透明度为1(其他剪辑完全可见),否则对应像素的透明度为0(其他剪辑被完全遮挡)
  3. 如果thr为非0的有效值,则遮罩像素透明度=x的s次方/(thr的s次方+x的s次方)
  • 从遮罩像素的透明度计算方式可知,如果剪辑是一个类似ColorClip的相同颜色像素构成的剪辑,参数color的取值与该剪辑像素颜色取值相同,则x值为0,透明度为1,返回的是原剪辑带一个完全透明的遮罩
  • 当剪辑的存在像素与color取值不为0的情况下,thr值越大,遮罩的透明度越高,color的RGB三个值越大,遮罩的透明度越低,s的取值对遮罩透明度的影响与x的值有关,没有明显规律,如果s为正整数,主要影响透明度的变化幅度,使得透明度受 color、thr的影响变小
  • 如果原剪辑clip带遮罩,会被新生成的遮罩替代

八、小结

本文详细介绍了moviepy与颜色变换相关的blackwhite、colorx、fadeinout、gamma_corr、invert_colors、lum_contrast、mask_color函数的功能和使用方法,这些函数可以在某些剪辑中用于制造特殊的特效。

更多moviepy的介绍请参考《PyQt+moviepy音视频剪辑实战文章目录》或《专栏:使用PyQt开发图形界面Python应用》。

广告

老猿关于PyQt的付费专栏《使用PyQt开发图形界面Python应用》只需要9.9元(老猿正在考虑是否调整专栏价格,如果调整价格至少是19.9元),本专栏《PyQt+moviepy音视频剪辑实战》文档的同样内容在付费专栏上也有相应内容,总体来说付费专栏介绍更详细或案例更多。

本节内容对应付费专栏的《moviepy音视频剪辑:颜色相关变换函数blackwhite、colorx、fadein/out、gamma_corr、invert_colors、lum_contrast、mask_color详解》。如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。

跟老猿学Python、学5G!

☞ ░ 前往老猿Python博文目录

猜你喜欢

转载自blog.csdn.net/LaoYuanPython/article/details/107052733
今日推荐