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 with statement 进行文件操作指南
Aug 22 Python
Python中实现对Timestamp和Datetime及UTC时间之间的转换
Apr 08 Python
Python3实现将文件树中所有文件和子目录归档到tar压缩文件的方法
May 22 Python
python实现顺序表的简单代码
Sep 28 Python
说说如何遍历Python列表的方法示例
Feb 11 Python
Python Matplotlib实现三维数据的散点图绘制
Mar 19 Python
Win下PyInstaller 安装和使用教程
Dec 25 Python
查看jupyter notebook每个单元格运行时间实例
Apr 22 Python
python logging 重复写日志问题解决办法详解
Aug 04 Python
selenium携带cookies模拟登陆CSDN的实现
Jan 19 Python
Python3自带工具2to3.py 转换 Python2.x 代码到Python3的操作
Mar 03 Python
asyncio异步编程之Task对象详解
Mar 13 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将网址字符串转换成超链接(网址或email)
2010/05/25 PHP
php 目录遍历、删除 函数的使用介绍
2013/04/28 PHP
PHP CURL或file_get_contents获取网页标题的代码及两者效率的稳定性问题
2015/11/30 PHP
php结合ajax实现手机发红包的案例
2016/10/13 PHP
php app支付宝回调(异步通知)详解
2018/07/25 PHP
thinkphp框架类库扩展操作示例
2019/11/26 PHP
基于jquery的让textarea自适应高度的插件
2010/08/03 Javascript
jQuery EasyUI API 中文文档 - Documentation 文档
2011/09/29 Javascript
JavaScript中为什么null==0为false而null大于=0为true(个人研究)
2013/09/16 Javascript
jQuery实现滚动鼠标放大缩小图片的方法(附demo源码下载)
2016/03/05 Javascript
JS脚本实现动态给标签控件添加事件的方法
2016/06/02 Javascript
Javascript 6里的4个新语法
2016/08/25 Javascript
微信小程序 picker 组件详解及简单实例
2017/01/10 Javascript
jQuery实现在新增加的元素上添加事件方法案例分析
2017/02/09 Javascript
纯JS实现图片验证码功能并兼容IE6-8(推荐)
2017/04/19 Javascript
自定义PC微信扫码登录样式写法
2017/12/12 Javascript
20行JS代码实现粘贴板复制功能
2018/02/06 Javascript
iconfont的三种使用方式详解
2018/08/05 Javascript
详谈Python基础之内置函数和递归
2017/06/21 Python
对pandas进行数据预处理的实例讲解
2018/04/20 Python
用Python分析3天破10亿的《我不是药神》到底神在哪?
2018/07/12 Python
pytorch .detach() .detach_() 和 .data用于切断反向传播的实现
2019/12/27 Python
Python使用Selenium实现淘宝抢单的流程分析
2020/06/23 Python
HTML5 transform三维立方体实现360无死角三维旋转效果
2014/08/22 HTML / CSS
基本款天堂:Everlane
2017/05/13 全球购物
如果NULL定义成#define NULL((char *)0)难道不就可以向函数传入不加转换的NULL了吗
2012/02/15 面试题
应届生船舶驾驶求职信
2013/10/19 职场文书
高校自主招生自荐信
2013/12/09 职场文书
小区门卫值班制度
2014/01/24 职场文书
《钱学森》听课反思
2014/03/01 职场文书
售后服务承诺书怎么写
2014/05/21 职场文书
销售员岗位职责
2015/02/10 职场文书
2015年社区服务活动总结
2015/03/25 职场文书
2015七夕情人节宣传语
2015/07/14 职场文书
学习雷锋主题班会
2015/08/14 职场文书
B站评分公认最好看的动漫,你的名字评分9.9,第六备受喜欢
2022/03/18 日漫