☞ ░ 前往老猿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音视频剪辑实战文章目录》或《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. PyQt+moviepy音视频剪辑实战文章目录

    ☞ ░ 前往老猿Python博文目录 ░ 本专栏为moviepy音视频剪辑合成相关内容介绍的免费专栏,对应的收费专栏为<moviepy音视频开发专栏>. 一.moviepy基础能力系统介绍 ...

  2. moviepy音视频剪辑:视频变换处理与内容相关的变换函数headblur、mask_and/or、mirror_x/y、rotate、painting、scroll介绍

    一.引言 在<moviepy音视频剪辑:moviepy中的剪辑基类Clip详解>介绍了剪辑基类的fl.fl_time.fx方法,在<moviepy音视频剪辑:视频剪辑基类VideoC ...

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

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

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

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

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

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

  6. moviepy音视频剪辑:moviepy中的剪辑相关类及关系

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt+moviepy音视频剪辑实战 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 y在 ...

  7. moviepy音视频剪辑VideoClip类to_mask方法、to_RGB、afx方法

    ☞ ░ 前往老猿Python博文目录 ░ moviepy音视频剪辑VideoClip类to_mask方法和to_RGB方法用于进行剪辑内容变换. 1.to_mask方法 to_mask方法返回一个由调 ...

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

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

  9. moviepy音视频剪辑:headblur的参数r_blur卷积核以及fx、fy、r_zone的功能作用及用途

    ☞ ░ 前往老猿Python博文目录 ░ 在moviepy1.03版本中,headblur的调用语法为:headblurbak(clip,fx,fy,r_zone,r_blur=None) 其中参数f ...

随机推荐

  1. ATcoder Grand Contest总结

    最前面: AT的题都很有思维难度,总结一下一些AT的常规操作 1.对于有操作的题目,如果正面推不行的话考虑倒推,将操作转化,寻找更好的性质 2.模型转化,看到某一种的计算的式子,需要考虑有没有更简化的 ...

  2. Kafka_2.12-2.5.1集群搭建与参数调优

    Kafka是目前业界使用最广泛的消息队列.数据流转常见这样的业务场景,客户端把采集到的日志推送给Kafka,业务方可以消费Kafka的数据落地HDFS,用于离线分析,也可以使用Spark或Flink消 ...

  3. 监控-Cat项目部署

    一.Cat的项目背景 CAT(Central Application Tracking),是美团点评基于 Java 开发的一套开源的分布式实时监控系统.美团点评基础架构部希望在基础存储.高性能通信.大 ...

  4. form表单ajax提交

    这里下面有两种  第一种是form表单里面添加了数据,并且含有上传的图片,第二种是from表单中不含有图片  只有普通数据 第一种form表单中包含有图片的类型: <form method=&q ...

  5. 家庭版window10找不到文件'gpedit.msc'。请确定文件名是否正确后 ,再试一次

    今天遇到电脑找不到gpedit.msc文件,所以记录一下这个问题的解决方法 1. 首先建立一个空白文档  代码如下: @echo off pushd "%~dp0" dir /b ...

  6. Mycat分库分表(一)

    随着业务变得越来越复杂,用户越来越多,集中式的架构性能会出现巨大的问题,比如系统会越来越慢,而且时不时会宕机,所以必须要解决高性能和可用性的问题.这个时候数据库的优化就显得尤为重要,在说优化方案前,先 ...

  7. spring处理静态资源方式

    1. <mvc:default-servlet-handler/>default-servlet-handler在SpringMVC上下文定义一个org.springframework.w ...

  8. c语言 :write与read系统调用总结

    在学习的时候总是有点迷糊于是在网上找到一些比较好的分享一下  下面举一个例子: 1 #include <stdio.h> 2 #include <unistd.h> 3 #in ...

  9. 极客mysql08

    1.innodb支持RC和RR隔离级别实现是用的一致性视图(consistent read view) 2.事务在启动时会拍一个快照,这个快照是基于整个库的. 基于整个库的意思就是说一个事务内,整个库 ...

  10. Git-stash(暂存)

    修改某文件后,不想commit,使用stash保存在本地的某分支内 # 暂存 git stash ## 可暂存新增文件 git stash -u ## 为此次暂存添加标识 git stash save ...