Python 视频画质增强


Posted in Python onApril 28, 2022

前言

前面通过文章 Python捕获、播放和保存摄像头视频并提高视频清晰度和对比度给大家介绍了如何读取、播放和保存视频,后面又通过文章 Python美图技术也就几行代码!给大家介绍了如何对图像的亮度、对比度、色度或者锐度进行调整,从而达到基本的图像处理操作。

其实,那两篇文章都是铺垫,都是为了给大家介绍如何对视频进行画质增强。本文将结合前面两篇文章的内容,来讲讲如何对视频画质进行增强。

想要直接看效果的,可以拉到文末。

原理

不知道大家小时候有没有玩过这个?

Python 视频画质增强

最早的动画就是这么形成的,记得小时候还有这种小书卖。

其实视频的原理也是这样,一个视频是由很多张图片组成的,一个图片是一帧。所以我们要对视频进行画质增强,可以拆分成对每一帧的图片进行操作,这个操作我们在前面介绍过。

因此,对视频进行画质增强的方法可以分为三步:拆分->处理->合成。

实现步骤

拆分

我们在第一篇文章讲到过如何捕获摄像头的视频流,以及如何读取视频并播放。不管通过哪种方法,我们都是通过帧操作的。所以这里所谓的拆分就是获取到我们捕获到的视频流或者读取的视频流的每一帧。

success, img1 = cap.read()
    # 如果正确读取帧,success为True
    if not success:
        break
    cv2.imshow('img1', img1)

就是这么简单,我们就可以获取到视频每一帧了。

处理

获取到视频的一帧之后,我们就要把这一帧转换成我们可以处理的格式的图片。在前面我们介绍如何对图片进行画质增强的时候,使用的是 ImageEnhance 这个函数的相关方法,这个函数是 PIL 图像处理库里面的,所以我们必须把我们每一帧的图片读取成 PIL 可以处理的格式:

image = Image.fromarray(np.uint8(img1))  # 转换成PIL可以处理的格式

读取到图像之后,我们就可以对图像进行画质增强处理了,这里还是用我们上篇文章中讲到的代码:

# 图像处理
def img_enhance(image, brightness=1, color=1,contrast=1,sharpness=1):
    # 亮度增强
    enh_bri = ImageEnhance.Brightness(image)
    if brightness:
        image = enh_bri.enhance(brightness)

    # 色度增强
    enh_col = ImageEnhance.Color(image)
    if color:
        image = enh_col.enhance(color)

    # 对比度增强
    enh_con = ImageEnhance.Contrast(image)
    if contrast:
        image = enh_con.enhance(contrast)

    # 锐度增强
    enh_sha = ImageEnhance.Sharpness(image)
    if sharpness:
        image = enh_sha.enhance(sharpness)

    return image

合成

图像处理完,我们需要每一帧图像进行合成,从而得到我们最终的视频:

cap = cv2.VideoCapture('你的视频目录/xxx.mp4')
success, _ = cap.read()
# 分辨率-宽度
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
# 分辨率-高度
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
# 总帧数
frame_counter = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
video_writer = cv2.VideoWriter('输出.mp4', cv2.VideoWriter_fourcc('M', 'P', '4', 'V'), 15, (width, height), True)

while success:
    success, img1 = cap.read()
    try:
        image = Image.fromarray(np.uint8(img1))  # 转换成PIL可以处理的格式
        img_enhanced = img_enhance(image, 2, 2, 2, 3)
        video_writer.write(np.asarray(img_enhanced))
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    except:
        break


cap.release()
video_writer.release()
cv2.destroyAllWindows()

我这里读取的是 mp4 格式的视频,所以在合成写视频文件的时候,我们需要用

cv2.VideoWriter_fourcc('M', 'P', '4', 'V') 这个格式。

我这里没有对图片的分辨率进行修改,只是分别获取原始视频的分辨率,然后写入视频文件的时候,将原始分辨率传入作为参数。

如果你需要修改视频的分辨率的话,可以使用下面的方式:

cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])

使用 resize 方法就可以了:

resized = cv2.resize(img, (width, height), interpolation = cv2.INTER_AREA)

效果

我们先来看看处理前的视频:

Python 视频画质增强

处理之后(我这里处理比较随意,参数都是随意写的)的视频是这样子的:

Python 视频画质增强

总结

到此为止,我们的视频画质增强的功能算是基本实现了,代码也不复杂,加起来也就这么点。但是,如果要处理成自己满意的效果,还是需要下一番功夫去调参数,去优化。甚至针对每一帧可能传入的参数都不一样,这就需要各位自己去慢慢研究了。

Python 相关文章推荐
在Python中使用HTMLParser解析HTML的教程
Apr 29 Python
CentOS6.5设置Django开发环境
Oct 13 Python
快速查询Python文档方法分享
Dec 27 Python
python删除过期log文件操作实例解析
Jan 31 Python
如何优雅地改进Django中的模板碎片缓存详解
Jul 04 Python
win10下python3.5.2和tensorflow安装环境搭建教程
Sep 19 Python
python hook监听事件详解
Oct 25 Python
详解如何用django实现redirect的几种方法总结
Nov 22 Python
django框架创建应用操作示例
Sep 26 Python
Python自动巡检H3C交换机实现过程解析
Aug 14 Python
python 动态绘制爱心的示例
Sep 27 Python
python人工智能human learn绘图可创建机器学习模型
Nov 23 Python
python 单机五子棋对战游戏
python井字棋游戏实现人机对战
Apr 28 #Python
Python开发五子棋小游戏
Python简易开发之制作计算器
Apr 28 #Python
Python实现对齐打印 format函数的用法
Apr 28 #Python
python实现简单的三子棋游戏
Apr 28 #Python
Python内置类型集合set和frozenset的使用详解
You might like
用PHP调用Oracle存储过程的方法
2008/09/12 PHP
discuz论坛 用户登录 后台程序代码
2008/11/27 PHP
PHP5中使用PDO连接数据库的方法
2010/08/01 PHP
PHP实现检测客户端是否使用代理服务器及其匿名级别
2015/01/07 PHP
PHP中static关键字以及与self关键字的区别
2015/07/01 PHP
php读取本地json文件的实例
2018/03/07 PHP
选择TreeView控件的树状数据节点的JS方法(jquery)
2010/02/06 Javascript
javascript学习笔记(五)正则表达式
2011/04/08 Javascript
利用json获取字符出现次数的代码
2012/03/22 Javascript
Javascript:为input设置readOnly属性(示例讲解)
2013/12/25 Javascript
解决用jquery load加载页面到div时,不执行页面js的问题
2014/02/22 Javascript
谷歌浏览器不支持showModalDialog模态对话框的解决方法
2014/09/22 Javascript
node.js中的http.createClient方法使用说明
2014/12/15 Javascript
jQuery固定元素插件scrolltofixed使用指南
2015/04/21 Javascript
浅谈JavaScript字符串与数组
2015/06/03 Javascript
Vue.js基础知识汇总
2016/04/27 Javascript
在js代码拼接dom对象到页面上去的模板总结(必看)
2017/02/14 Javascript
javascript面向对象三大特征之多态实例详解
2019/07/24 Javascript
Echarts实现单条折线可拖拽效果
2019/12/19 Javascript
element-ui table行点击获取行索引(index)并利用索引更换行顺序
2020/02/27 Javascript
[01:00:52]2018DOTA2亚洲邀请赛 4.4 淘汰赛 EG vs LGD 第一场
2018/04/05 DOTA
Python实现文件按照日期命名的方法
2015/07/09 Python
Python连接MySQL并使用fetchall()方法过滤特殊字符
2016/03/13 Python
Python探索之SocketServer详解
2017/10/28 Python
python判断输入日期为第几天的实例
2018/11/13 Python
Python搭建Spark分布式集群环境
2019/07/05 Python
Python 旋转打印各种矩形的方法
2019/07/09 Python
python 扩展print打印文件路径和当前时间信息的实例代码
2019/10/11 Python
Python基于jieba, wordcloud库生成中文词云
2020/05/13 Python
PyCharm vs VSCode,作为python开发者,你更倾向哪种IDE呢?
2020/08/17 Python
英国发展最快的在线超市之一:Click Marketplace
2021/02/15 全球购物
一个J2EE项目团队的主要人员组成是什么
2012/06/04 面试题
《青海高原一株柳》教学反思
2014/04/25 职场文书
防汛工作情况汇报
2014/10/28 职场文书
行政助理岗位职责
2015/02/10 职场文书
mysql的MVCC多版本并发控制的实现
2021/04/14 MySQL