☞ ░ 前往老猿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 = 8clipVideo = 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音视频剪辑实战文章目录》或《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博文目录 ░

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

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

    ☞ ░ 前往老猿Python博文目录 ░ 注意:本文为收费专栏文章,对应免费专栏文章为<moviepy音视频剪辑:颜色相关变换函数blackwhite.colorx.fadein/out.gam ...

  2. moviepy音视频剪辑:与大小相关的视频变换函数crop、even_size、margin、resize介绍

    ☞ ░ 前往老猿Python博文目录 ░ 一.引言 在<moviepy音视频剪辑:moviepy中的剪辑基类Clip详解>介绍了剪辑基类的fl.fl_time.fx方法,在<movi ...

  3. moviepy音视频剪辑:与time时间线相关的变换函数freeze_region、make_loopable、speedx、time_mirror、time_symmetrize介绍

    ☞ ░ 前往老猿Python博文目录 ░ 一.引言 在<moviepy音视频剪辑:moviepy中的剪辑基类Clip详解>介绍了剪辑基类的fl.fl_time.fx方法,在<movi ...

  4. moviepy音视频剪辑:与大小相关的视频变换函数详解

    ☞ ░ 前往老猿Python博文目录 ░ 一.引言 在<moviepy音视频剪辑:moviepy中的剪辑基类Clip详解>介绍了剪辑基类的fl.fl_time.fx方法,在<movi ...

  5. moviepy音视频剪辑:视频剪辑基类VideoClip的属性及方法详解

    ☞ ░ 前往老猿Python博文目录 ░ 一.概述 在<moviepy音视频剪辑:moviepy中的剪辑基类Clip详解>和<moviepy音视频剪辑:moviepy中的剪辑基类Cl ...

  6. moviepy音视频剪辑:使用concatenate_videoclips和clips_array将多个视频合成一个顺序播放或同屏播放的视频

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一.视频合成概述 视频合成,也称为非线性编辑,实际 ...

  7. moviepy音视频剪辑:视频基类VideoClip子类VideoFileClip、CompositeVideoClip、ImageSequenceClip介绍

    ☞ ░ 前往老猿Python博文目录 ░ 一.引言 在<moviepy音视频剪辑:moviepy中的剪辑相关类及关系>介绍了VideoClip主要有六个直接子类(VideoFileClip ...

  8. moviepy音视频剪辑:lum_contrast什么时候使用以及图像处理什么时候需要调整亮度与对比度

    ☞ ░ 前往老猿Python博文目录 ░ 一.亮度.对比度的概念 图像的亮度(luminosity )也即对明度的度量(参考<音视频处理基础知识扫盲:数字视频YUV像素表示法以及视频帧和编解码概 ...

  9. moviepy音视频剪辑基类VideoClip的write_gif方法opt、fuzz、dispose、colors、loop等参数的作用

    ☞ ░ 前往老猿Python博文目录 ░ moviepy音视频剪辑模块的视频剪辑基类write_gif方法用于将视频剪辑输出到gif文件,调用语法如下: def write_gif(self, fil ...

最新文章

  1. 使用AutoCAD 2021创建真实世界的土木设计项目
  2. MySQL优化篇:SHOW语法
  3. 线程同步初解---转载
  4. DevEBox STM32F4x1开发板 设置MicroPython STM32F401CC/TM32F411CE STM32F4x1 核心板 开发板 MicroPython
  5. 学习构建WDF驱动程序 - 初步了解SOURCE和makefile文件
  6. Node js报错 npm ERR! cb() never called!
  7. Linux网络-数据包的接收流程(基于RTL8139网卡驱动程序)
  8. Platform Builder实践之配置文件
  9. python中对比数组长度_在Python中检索数组长度的首选方法
  10. 相等运算符重载中的问题
  11. Windows 操作小技巧 之一(持续更新)
  12. 当 AI 遇见经典,科大讯飞发布两款智能笔记本新品!
  13. 资深架构师谈云原生生态的基石Kubernetes
  14. a标签传值乱码问题怎么解?
  15. uni-app官方教程学习手记 1
  16. 疯狂Java讲义笔记汇总
  17. 跑实验_word2vector词向量实现_基于搜狗新闻预料+维基百科
  18. 黑苹果成功引导到安装界面,USB鼠标无法使用的解决办法
  19. 连载《国培计划》骨干教师的研修日志之八:米新江教授讲座有感
  20. 理解BPDU Guard的意义(BPDU Guard在全局配置与接口配置上的区别)

热门文章

  1. Android去除默认提示音
  2. 【metahumanUE】虚幻引擎面捕动捕调研
  3. [图像特征匹配]SIFT、SURF、ORB算法笔记以及代码实现
  4. QT 交叉编译 ARM / CSKY
  5. win10计算机无法识别u盘,win10电脑无法识别U盘应该如何解决
  6. 比Navicat好用百倍的通用数据库管理工具,功能强大,最主要还免费!
  7. composer global require fxp/composer-asset-plugin:1.0.0的Not enough arguments解决
  8. 热销超极本iFunk翼S到底怎么样?
  9. 超详细爬取bilibili视频数据
  10. RoboMaster视觉教程(5)目标位置解算(通过像素点获取转角)