一、引言

最近在学习图像处理的《直方图处理》,对直方图均衡处理效果感觉非常有用。

以前学习Moviepy音视频剪辑时,用的卓别林的一个黑白视频片段,感觉视频的噪点比较多,画面也整体偏暗,不禁想看看如果对其进行直方图均衡会怎么样。如是开干,但进展并不很顺利,下面就来谈谈遇到的问题。

二、基础知识介绍

1、Moviepy的视频变换fl_image方法

由于是对视频图像进行灰度处理,因此需要逐帧读取视频帧,每帧应用直方图均衡。该视频变换处理有多种方法实现,老猿使用fl_image。

fl_image方法是对get_frame方法获取的帧进行变换的方法,本质上是Clip的fl方法在内容变换方面的一种变种和应用。

调用语法fl_image(self, image_func, apply_to=None)

参数说明

  • image_func:参数image_func是对剪辑帧进行图像变换的函数,带一个参数,参数就是要处理的帧,这个帧直接通过get_frame去获取,image_func函数的返回值为经过变换后的帧
  • apply_to:apply_to表示变换是否需要同时作用于剪辑的音频和遮罩,其值可以为’mask’、‘audio’、[‘mask’,‘audio’]

对比fl调用方法fl(self, fun, apply_to=None, keep_duration=True):

  • fl_image由于只变换内容,因此不涉及时间的变换,keep_duration就是默认为True
    image_func不带时间参数,这是因为系统默认调用get_frame(t)来获取帧,无需image_func带时间参数

  • fl_image本质上是执行如下语句来完成帧内容的变换:fl(lambda gf, t: image_func(gf(t)),
    apply_to)

更多关于Moviepy视频fl_image变换处理的介绍请参考《moviepy音视频剪辑:视频剪辑基类VideoClip的属性及方法详解》。

2、Moviepy彩色视频转黑白视频变换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)的一种度量
3、OpenCV的直方图均衡处理equalizeHist函数

OpenCV的直方图均衡处理非常简单,就是对需要处理的黑白图像执行cv2.equalizeHist函数,返回图像即为直方图均衡后的图像。

4、OpenCV的图像色系转换cvtColor

cv2.cvtColor是openCV提供的颜色空间转换函数。

调用语法cvtColor(src, code, dstCn=None)
其中:

  • src:要转换的图像
  • code:转换代码,表示从何种类型的图像转换为何种类型,如cv2.COLOR_BGR2GRAY就是将BGR格式彩色图像转换成灰度图片,具体转换代码请参考官网文档
  • dstCn:目标图像的通道数,如果为0表示根据源图像通道数以及转换代码自动确认

三、实现思路及处理视频内容

总体处理非常简单,就是加载视频剪辑后,对剪辑进行fl_image变换,变换参数中的处理函数就传递直方图均衡处理相关的函数。

原始视频是卓别林的一个黑白视频片段,下面是该段视频的2个截图:

四、实现过程及遇到的问题

1、直接在fl_image调用直方图均衡的equalizeHist函数

实现代码如下:

from moviepy.editor import *
import cv2def test():clipV = VideoFileClip(r"F:\video\zbl1.mp4")newclip = clipV.fl_image(cv2.equalizeHist, apply_to=['mask'])newclip.write_videofile(r"F:\video\temp\zbl1.mp4")test()

结果执行报错(很长的报错信息,仅截取关键部分):

File "C:\Program Files\Python38\lib\site-packages\moviepy\video\VideoClip.py", line 490, in <lambda>return self.fl(lambda gf, t: image_func(gf(t)), apply_to)
cv2.error: OpenCV(4.3.0) C:\projects\opencv-python\opencv\modules\imgproc\src\histogram.cpp:3439: error: (-215:Assertion failed) _src.type() == CV_8UC1 in function 'cv::equalizeHist'

这些信息说明直方图均衡处理的图像数据类型不对,因为涉及到了OpenCV的函数,在OpenCv-Python中无法深入分析,因此也没办法看出具体原因。

2、将equalizeHist函数再次封装后给fl_image调用

代码如下:

from moviepy.editor import *
import cv2
def flImg(img):imgNew = cv2.equalizeHist(img)return imgNewdef test():clipV = VideoFileClip(r"F:\video\zbl1.mp4")newclip = clipV.fl_image(cv2.equalizeHist, apply_to=['mask'])newclip.write_videofile(r"F:\video\temp\zbl1.mp4")

报错信息依旧,由于用flImg封装了cv2.equalizeHist,此时可以通过Debug跟踪flImg看到内部数据,居然发现img是三维数组,也即图像像素值是RGB格式,而不是灰度图格式。看样子虽然是个黑白视频,但格式是彩色视频格式?

3、将视频剪辑加载之后转成黑白视频再处理

好吧,黑白视频存放的是彩色格式,也许是因为视频保存格式控制的,那就把其先转成黑白视频,Moviepy有个这样变换函数blackwhite。

代码如下:

from moviepy.editor import *
import cv2def flImg(img):imgNew = cv2.equalizeHist(img)return imgNewdef test():clipV = blackwhite(VideoFileClip(r"F:\video\zbl1.mp4"))newclip = clipV.fl_image(flImg, apply_to=['mask'])newclip.write_videofile(r"F:\video\temp\zbl1.mp4")test()

结果还是报同样错,观察flImg参数img,居然还是RGB格式。黑白视频的帧是二维还是三维?让人一脸蒙圈!

4、强制图像转换为灰度图

好吧,老猿承认在黑白视频的帧数据认知上出问题了,黑白视频也是RGB格式,那只有对图像强制格式转换了,用OpenCV的cvtColor将RGB格式强制转换为灰度图。

代码如下:

from moviepy.editor import *
import cv2def flImg(img):imgNew = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)imgNew = cv2.equalizeHist(imgNew)return imgNewdef test():clipV = blackwhite(VideoFileClip(r"F:\video\zbl1.mp4"))newclip = clipV.fl_image(flImg, apply_to=['mask'])newclip.write_videofile(r"F:\video\temp\zbl1_11.mp4")newclip.write_gif(r"F:\video\temp\zbl1.gif")test()

这样处理后,执行没报错,但处理完的视频存在如下两个问题:
1、视频图像整体大小没变,但内容变成了同屏九窗播放模式:


2、视频播放速度是原视频的3倍左右,音频没变,导致视频的播放到1/3时长视频内容已经播放完成,然后视频就固定在最后一帧图像,音频还按原有节凑在播放。

总体来看,就是视频内容没有按照预定计划生成。为了查找问题,老猿做了如下处理:

  1. 将视频直接生成gif,gif是正常的;
  2. 去掉直方图均衡处理,只保留图像格式变换处理,还是存在问题;
  3. 去掉图像格式变换处理,flImg直接返回原图像,视频生成后是正常的。

考虑上述处理可以得出结论,问题出现与视频帧图像RGB转灰度图处理有关,结合前面彩色视频使用blackwhite转黑白视频后图像像素仍然是RGB格式的情况,老猿感觉是黑白视频的帧图像格式不是我理解的灰度图,而是RGB格式的图像。那这个过程到底该怎么处理呢?为此老猿查看了Moviepy的blackwhite的源代码:

def blackwhite(clip, RGB=None, preserve_luminosity=True):""" Desaturates the picture, makes it black and white.Parameter RGB allows to set weights for the different colorchannels.If RBG is 'CRT_phosphor' a special set of values is used.preserve_luminosity maintains the sum of RGB to 1."""if RGB is None:RGB = [1, 1, 1]if RGB == 'CRT_phosphor':RGB = [0.2125, 0.7154, 0.0721]R, G, B = 1.0 * np.array(RGB) / (sum(RGB) if preserve_luminosity else 1)def fl(im):im = (R * im[:, :, 0] + G * im[:, :, 1] + B * im[:, :, 2])a = np.dstack(3 * [im]).astype('uint8')return areturn clip.fl_image(fl)

可以看到,该源代码是先将RGB像素值按照参数指定要求转换成灰度值,最后最将该灰度值复制3份作为返回图像的RGB值,因此这个处理实际上图像最终格式是RGB格式,但RGB的值都是对应的原RGB映射到的灰度值。

5、在帧图像变换时增加将灰度图变成RGB格式的灰度图处理

为了确保最终的黑白视频格式满足像素值为RGB格式要求,对灰度变换后的图像增加了将灰度值扩展成RGB格式的处理,在此用到了numpy的dstack函数。代码如下:

from moviepy.editor import *
import cv2
import numpy as npdef flImg(img):imgNew = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)imgNew = cv2.equalizeHist(imgNew)imgNew = np.dstack(3 * [imgNew]).astype('uint8')return imgNewdef test():clipV = VideoFileClip(r"F:\video\zbl1.mp4")newclip = clipV.fl_image(flImg, apply_to=['mask'])newclip.write_videofile(r"F:\video\temp\zbl1.mp4")test()

经验证,这样处理后的视频输出文件变成了正常播放的视频,但说实话直方图均衡处理的效果并不很好,虽然视频总体变亮了,但不同帧之间图像的差异变大了,导致视频的画面连续变化较大。

五、小结

本文通过介绍将视频帧转换为灰度图像,再构建黑白视频的处理过程所遇到的问题及解决办法,确认了无论是从输入黑白视频的像素值还是将黑白视频输出到视频文件的处理过程来看,黑白视频的帧图像不是二维的灰度图,而是对应三维的彩色图像格式,其像素值为RGB三元组格式,只是R、G、B三个分量的值都是为对应灰度图的灰度值。

更多关于 Moviepy 的介绍请大家参考《Python音视频剪辑库MoviePy1.0.3中文教程导览及可执行工具下载》。

如对文章内容存在疑问或需要相关资料,可在博客评论区留言,或关注:老猿Python 微信公号发消息咨询,可通过扫二维码加微信公众号。

写博不易,敬请支持:

如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!

关于老猿的付费专栏

  1. 付费专栏《https://blog.csdn.net/laoyuanpython/category_9607725.html 使用PyQt开发图形界面Python应用》专门介绍基于Python的PyQt图形界面开发基础教程,对应文章目录为《 https://blog.csdn.net/LaoYuanPython/article/details/107580932 使用PyQt开发图形界面Python应用专栏目录》;
  2. 付费专栏《https://blog.csdn.net/laoyuanpython/category_10232926.html moviepy音视频开发专栏 )详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,对应文章目录为《https://blog.csdn.net/LaoYuanPython/article/details/107574583 moviepy音视频开发专栏文章目录》;
  3. 付费专栏《https://blog.csdn.net/laoyuanpython/category_10581071.html OpenCV-Python初学者疑难问题集》为《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的伴生专栏,是笔者对OpenCV-Python图形图像处理学习中遇到的一些问题个人感悟的整合,相关资料基本上都是老猿反复研究的成果,有助于OpenCV-Python初学者比较深入地理解OpenCV,对应文章目录为《https://blog.csdn.net/LaoYuanPython/article/details/109713407 OpenCV-Python初学者疑难问题集专栏目录 》
  4. 付费专栏《https://blog.csdn.net/laoyuanpython/category_10762553.html Python爬虫入门 》站在一个互联网前端开发小白的角度介绍爬虫开发应知应会内容,包括爬虫入门的基础知识,以及爬取CSDN文章信息、博主信息、给文章点赞、评论等实战内容。

前两个专栏都适合有一定Python基础但无相关知识的小白读者学习,第三个专栏请大家结合《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的学习使用。

对于缺乏Python基础的同仁,可以通过老猿的免费专栏《https://blog.csdn.net/laoyuanpython/category_9831699.html 专栏:Python基础教程目录)从零开始学习Python。

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

老猿Python,跟老猿学Python!

☞ ░ 前往老猿Python博文目录 https://blog.csdn.net/LaoYuanPython ░

对视频剪辑应用灰度图像变换+Moviepy生成灰度视频处理遇到几个有意思的问题相关推荐

  1. Python视频剪辑基础教程:MoviePy VideoClip详解

    Python视频剪辑基础教程:MoviePy VideoClip详解 随着数字化媒体的快速发展,视频成为了现代社会最为流行的媒介之一.在如此多样化的数字化媒体中,视频编辑技术被誉为其中最为关键的技能之 ...

  2. 短视频剪辑技巧,4法则创作热门视频

    我们在创作视频的过程中,可以把视频分为五个部分,这5个部分的处理,其实有着一定的剪辑规则,让我们可以控制整个视频的逻辑和节奏.今天就给大家盘点一下,那些成熟的剪辑师都懂的视频剪辑技巧: 01 第一部分 ...

  3. PyQt+moviepy音视频剪辑实战2:实现一个剪裁视频文件精华内容留存工具

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

  4. python 视频剪辑软件_用Python玩转视频剪辑,秀的飞起!

    1 前言 半个月前,后台有个小伙伴问我,如何将视频中的音频提取出来,并且将声音转成文字写入到 word 中,正好接下来的文章要用到百度的语音识别接口. 那么今天就来给大家介绍一个专门用于视频操作的库, ...

  5. 新手如何入门视频剪辑?分享超好用的视频剪辑工具,剪辑、压缩、封面制作一网打尽!

    哈喽大家好,我是菌菌~ vlog拍摄.视频混剪.课程录制--现如今,视频异常火爆,一种新的技能也被全民所需要,那就是视频剪辑! 工欲善其事必先利其器,要想做视频没几个得力助手怎么能行? 今天,菌菌就给 ...

  6. 有没有免费的视频剪辑软件?快来看看这些视频裁剪软件

    我们有时候将视频拍好后,会觉得视频中有些画面的边缘出现了瑕疵,就想要将那些边缘裁剪掉,但是却不知道要怎么操作才能裁剪视频的画面.其实想要裁剪视频的画面很简单,我们只需要借助一些视频处理工具就可以实现裁 ...

  7. python视频处理模块_python使用moviepy模块对视频进行操作

    一.功能简介 前段时间需要对多个视频进行合并,还需要对一个视频按需求进行截切成多个视频,然而网上虽然有现成的工具. 但是大部分工具都带有第三方logo,这会影响视频的使用,而作者正好在学习python ...

  8. Qt视频剪辑软件开发(四):视频双向拖动与剪辑的实现

    前面3篇大概介绍了音视频解码播放显示等,这篇介绍最关键的地方,视频快进seek功能. 由于要做视频剪辑,需要调节视频的起始点,用Slider控件是比较好的选择,但是Qt提供的QSlider只能单向拖动 ...

  9. 视频剪辑工具小巧简单易上手,视频剪辑就靠它了

    随着短视频时代到来,对于大家来说,早已习惯用通过视频去记录各种日常的事情,也可以表达自己的情感,当然可以通过视频去了解别人,以及触及到更广阔的世界.所以越来越多人开始专注于短视频的创作,无需什么学习成 ...

  10. 用计算机视频剪辑方面的术语,电脑端做视频剪辑哪个软件好用?

    Smile 于 2020/12/01更新 剪辑大师 摘要 易我剪辑大师是个非常强大的剪辑视频软件,功能包含添加字幕.音乐.滤镜或转场特效等,且它的界面对于初学者来说相当友好,不会出现让使用者看不懂的术 ...

最新文章

  1. 用Python实现深度学习框架
  2. no qualifying bean of type_就是要让你彻底学会 @Bean 注解
  3. python算法书籍-你也能看得懂的Python算法书
  4. 用赫夫曼树进行文件的压缩
  5. nrf52840 gpiote如何配置中断输入_西门子S7-200 SMART PID回路控制,配置PID向导,查看项目组件...
  6. python编的俄罗斯方块游戏_python编写俄罗斯方块
  7. 终于有人把数据湖讲明白了
  8. 怎么才能升级成鸿蒙系统,怎么能升级成鸿蒙系统
  9. 2021年各省高考试成绩查询,2021年各省高考成绩查询时间 什么时候出分
  10. PYTHON面向对象编程基础知识
  11. mpq算法实现哈希查找
  12. Scratch(四十三):赛龙舟
  13. 项目跟踪管理工具_7种时间跟踪工具可帮助您管理时间
  14. linux中命令du -sm,Linux中的Du命令
  15. 财会行业男女薪资比例matlab,2004:会计师事务所薪资调查分析报告
  16. excel汇总软件如何快速汇总多个表格数据
  17. insert append需要注意的一个小问题
  18. 计算机口令管理工具,PC免费密码管理器软件推荐
  19. Windows 下xampp的安装使用以及本地静态页面的访问(HTML+CSS+JS)
  20. 澳大利亚大学着眼于不断增长的中国市场,将在迪拜推出全球奢侈品管理学位

热门文章

  1. 用python帮别人写了个文字识别程序
  2. F: Shattered Cake
  3. matlab的persistent,MATLAB局部静态变量类型persistent
  4. S3C2440C语言点灯
  5. 如何高效学习和阅读源码?
  6. 高等数学考研笔记(九)
  7. Python3---有关日期的处理---最近自然周最近自然月最近一周最近一月---dateutil模块
  8. matlab坐标轴为指数,matlab画图设置中,如何把坐标改称指数坐标以及修改范围?...
  9. 基于龙芯CPU中标麒麟操作系统的国产半实物仿真系统ETestDEV
  10. 腾讯 云通信 如何启动Demo