moviepy音视频剪辑:颜色相关变换函数blackwhite、colorx、fadeinout、gamma

    技术2022-07-10  143

    ☞ ░ 前往老猿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)
    参数说明:
    lum:亮度要增加或减少的值,老猿建议为-255 到255之间的浮点数,但函数未进行限制,理论上任何值都可以 contrast:对比度,对比度调整可能会使得画面中部分场景看不清,该怎么调整需要结合图像本身的情况来设定,函数未对该值进行限定,但过大的数可能导致画面失衡的概率大增 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的三个参数都用于计算遮罩剪辑的像素透明度,其运算过程如下: 将原剪辑每个像素RGB值与参数color相减的结果的平方相加之后再开方,得到值x如果thr为0或None,此时如果x为0则遮罩像素的透明度为1(其他剪辑完全可见),否则对应像素的透明度为0(其他剪辑被完全遮挡)如果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音视频剪辑实战文章目录》或《moviepy音视频开发专栏》。

    关于收费专栏

    老猿的付费专栏《使用PyQt开发图形界面Python应用》专门介绍基于Python的PyQt图形界面开发基础教程,付费专栏《moviepy音视频开发专栏》详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,两个专栏加起来只需要19.9元,都适合有一定Python基础但无相关专利知识的小白读者学习。这2个收费专栏都有对应免费专栏,只是收费专栏的文章介绍更具体、内容更深入、案例更多。

    收费专栏文章目录:《moviepy音视频开发专栏文章目录》、《使用PyQt开发图形界面Python应用专栏目录》,本文收费专栏对应文章为《moviepy音视频剪辑:颜色相关变换函数blackwhite、colorx、fadein/out、gamma_corr、invert_colors、lum_contrast、mask_color详解》。

    对于缺乏Python基础的同仁,可以通过老猿的免费专栏《专栏:Python基础教程目录》从零开始学习Python。

    如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。

    跟老猿学Python、学5G!

    ☞ ░ 前往老猿Python博文目录 ░

    LaoYuanPython 认证博客专家 Python专家 博客专家 博客之星季军 侥幸获得 2020博客之星季军,博客主要聚焦Python相关知识,包括Python、爬虫、PyQt图形界面开发、Moviepy音视频剪辑、OpenCV图形图像处理等方向,这些方向都是老猿零基础学习相关知识的总结,很多知识点是本人深入研究、测试甚至源代码分析之后的成果,很多内容在官网和网上都没有。这些有独特见解的专栏主要是PyQt、Moviepy、Python、OpenCV-Python的相关专栏,特别是PyQt、Moviepy以及OpenCV疑难问题相关的付费专栏。另外博客内容还涉及5G、区块链和人工智能数学基础等非Python领域。欢迎大家批评指正!谢谢!
    Processed: 0.009, SQL: 9