如何使用python和opencv4实现照片长曝光效果呢?
我最喜欢的摄影技术之一是长时间曝光,即制作照片以显示经过时间的效果的过程,而传统摄影无法捕捉到这种效果。
应用此技术时,水变得如丝般柔滑,夜空中的星星随着地球旋转留下光迹,汽车前灯/尾灯以连续运动的单个波段照亮高速公路。
长时间曝光是一种很棒的技术,但是要捕获这些类型的照片,您需要采取系统的方法:将相机安装在三脚架上,应用各种滤镜,计算曝光值等。更不用说,您需要熟练的摄影师!
可是手机没有此功能呢?自己不会呢?
哈哈,有一种方法可以通过应用图像/帧平均来模拟长时间曝光。通过对给定时间段内从安装的摄像机捕获的图像求平均,我们可以(实际上)模拟长时间曝光。
并且由于视频只是一系列图像,因此我们可以通过将视频中的所有帧平均在一起,轻松地从帧中构建长时间曝光。结果是令人惊叹的长曝光式图像,就像文章开头的图像一样。
这篇博客文章分为三个部分。
第一部分,如何通过帧平均来模拟长时间曝光?
通过图像/帧平均模拟长时间曝光
实际上,如果您浏览流行的摄影网站,则会发现有关如何使用相机和三脚架手动创建这些类型的效果的教程(可以在此处找到此类教程的一个很好的示例)。
我们今天的目标是简单地实现这种方法,以便我们可以使用Python和OpenCV从输入视频中自动创建长时间曝光的图像。
给定输入视频,我们将所有帧平均在一起(平均加权)以创建长时间曝光效果。
注意:您也可以使用多张图像来创建这种长时间曝光效果,但是由于视频只是一连串图像,因此使用视频来演示此技术会更容易。
第二部分,编写Python和OpenCV代码
使用OpenCV进行长时间曝光仿真
首先打开一个名为long_exposure.py
,并插入以下代码
# import the necessary packages
import argparse
import imutils
import cv2
# construct the argument parse and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-v", "--video", required=True,help="path to input video file")
ap.add_argument("-o", "--output", required=True,help="path to output 'long exposure'")
args = vars(ap.parse_args())
2-4行:导入需要的imutils和OpenCV库。
如果没有使用以下命令安装即可。
pip install --upgrade imutils
我们在第7-12行解析两个命令行参数
--video # 视频文件的路径
--output # 输出“长时间曝光”文件的路径+文件名
然后做些初始化步骤:
# initialize the Red, Green, and Blue channel averages, along with
# the total number of frames read from the file
(rAvg, gAvg, bAvg) = (None, None, None)
total = 0
# open a pointer to the video file
print("[INFO] opening video file pointer...")
stream = cv2.VideoCapture(args["video"])
print("[INFO] computing frame averages (this will take awhile)...")
在 第16行,我们初始化RGB通道平均值,然后将其合并为最终的长时间曝光图像
我们还初始化第17行的帧总数计数 。
我们正在处理包含所有帧的视频文件,因此有必要打开指向视频捕获的文件指针 stream。
然后计算平均值:
# loop over frames from the video file stream
while True:# grab the frame from the file stream(grabbed, frame) = stream.read()# if the frame was not grabbed, then we have reached the end of# the sfileif not grabbed:break# otherwise, split the frmae into its respective channels(B, G, R) = cv2.split(frame.astype("float"))
我们将从第27行获取帧,然后将帧分向其各自的BGR通道(第35行)
如果读到了视频文件的末尾,跳出循环即可。
在循环的其余部分,我们将移动计算平均值:
# if the frame averages are None, initialize themif rAvg is None:rAvg = RbAvg = BgAvg = G# otherwise, compute the weighted average between the history of# frames and the current frameselse:rAvg = ((total * rAvg) + (1 * R)) / (total + 1.0)gAvg = ((total * gAvg) + (1 * G)) / (total + 1.0)bAvg = ((total * bAvg) + (1 * B)) / (total + 1.0)# increment the total number of frames read thus fartotal += 1
如果是第一次迭代,则将初始RGB平均值设置为第38-41行上获取的相应第一帧通道 。
否则,我们将在第45-48行计算每个通道的运行平均值 。
我们将计算结果存储在相应的RGB通道平均数组中。
最后,我们增加帧的总数,使我们能够保持运行平均值(第51行)
遍历视频文件中的所有帧后,我们可以将(平均)通道合并为一个图像并将其写入磁盘:
# merge the RGB averages together and write the output image to disk
avg = cv2.merge([bAvg, gAvg, rAvg]).astype("uint8")
cv2.imwrite(args["output"], avg)
# do a bit of cleanup on the file pointer
stream.release()
在 第54行,我们利用了cv2.merge
函数,同时在列表中指定我们的每个频道平均值。
并将像素转换为[0-255]范围内的整数。
由于处理视频文件需要花费大量CPU时间,因此我们只是将图像保存到磁盘上。
该脚本的最后一步,释放视频流(第58行)。
第三部分,应用示例
长时间曝光结果
请注意,每个视频都是通过安装在三脚架上的摄像机捕获的,以确保稳定性。
帧示例:
要创建长时间曝光效果,只需执行以下命令
$ time python long_exposure.py --video videos/river_01.mov --output river_01.png
[INFO] opening video file pointer...
[INFO] computing frame averages (this will take awhile)...
real 2m1.710s
user 0m50.959s
sys 0m40.207s
请注意,由于平均过程,水是如何混合成柔滑形式的
让我们继续看河的第二个例子,下面显示的是蒙太奇的帧
请注意,静止的岩石如何保持不变,但是将涌水平均化为连续的薄片,从而模仿了长时间的暴露效果。
这最后一个例子是我最喜欢的水的颜色是惊人的,给予水本身和森林之间形成了鲜明对比
使用OpenCV进行长时间曝光时,它会给输出带来超现实的,梦幻般的感觉
在今天的博客文章中,我们学习了如何使用OpenCV和图像处理技术来模拟长时间曝光的图像。
为了模拟长时间曝光,我们应用了帧平均,即将一组图像平均在一起的过程。我们假设输入的图像/视频是使用安装的摄像机捕获的(否则生成的输出图像会失真),虽然这不是真正的“长时间曝光”,但效果(在视觉上)非常相似。
译
转载和疑问声明
如果你有什么疑问或者想要转载,没有允许是不能转载的哈
赞赏一下能不能转?哈哈,联系我啊,我告诉你呢 ~~
欢迎联系我哈,我会给大家慢慢解答啦~~~怎么联系我? 笨啊~ ~~ 你留言也行
你关注微信公众号1.机器学习算法工程师:2.或者扫那个二维码,后台发送 “我要找朕”,联系我也行啦!
(爱心.gif) 么么哒 ~么么哒 ~么么哒
码字不易啊啊啊,如果你觉得本文有帮助,三毛也是爱!
我祝各位帅哥,和美女,你们永远十八岁,嗨嘿嘿~~~
如何使用python和opencv4实现照片长曝光效果呢?相关推荐
- 使用Python,OpenCV缩放照片(忽略宽高比,保持宽高比)
使用Python,OpenCV缩放照片(忽略宽高比,保持宽高比) 1. 效果图 1.1 保持宽高比效果图 1.2 忽略宽高比效果图 1.3 opencv各插值效果图 2. 原理 3. 源码 参考 这篇 ...
- [转载] 【python】Python中*args和**kwargs的区别(在Python中如何使用可变长参数列表)
参考链接: Python中的*args 和 **kwargs 博客已经搬家到"捕获完成": https://www.v2python.com 或者可以叫做,在Python中如何使用 ...
- python 外部参数过长_介绍python中slice参数过长的处理方法及实例
python教程栏目介绍slice参数过长的处理方法 很多小伙伴对于slice参数的概念理解停留在概念上,切片的参数有三个,分别是step .start .stop .因为参数的值也是多变的,所以我们 ...
- python如何截长图_用python实现对元素的长截图
一.目标 浏览网页的时候,看见哪个元素,就能截取哪个元素当图片,不管那个元素有多长 二.所用工具和第三方库 python ,PIL,selenium pycharm 三.代码部分 长截图整体思路: 1 ...
- python怎么换背景_3行Python代码实现图像照片抠图和换底色的方法
1.项目背景 对于不会PS的小伙伴,抠图是一个难度系数想当高的活儿,某宝照片抠图和证件照换底色均价都是5元RMB,所以今天要介绍的这款神工具,只要 3 行代码 5 秒钟就可以完成高精度抠图,甚至都不用 ...
- 使用Python,OpenCV对照片模拟长时间曝光效果
使用Python,OpenCV对照片模拟长时间曝光效果) 1. 效果图 2. 原理 2.1 长时间曝光简介 2.2 结论 3. 源码 参考 这篇博客将介绍如何使用OpenCV和图像处理技术来模拟长时间 ...
- Python源文件一行字符过长造成的问题
记录一下 Python 源文件一行字符过长从而造成的问题. 首先声明下, 这个问题不是我遇到的, 是在刷华蟒的时候看到的一个帖子, 帖子地址在这儿, 有兴趣的可以看看 起因是帖主在源文件中定义了一个超 ...
- 图片修改大小怎么改?照片长宽怎么修改?
我们在写自媒体文章时,为了整体内容更加美观,在添加图片的时候,都会先修改图片尺寸(https://www.yasuotu.com/geshi),将图片改大小到统一尺寸,那么怎么去调整图片像素尺寸呢?下 ...
- python:实现修改照片分辨率(附完整源码)
python:实现修改照片分辨率 #!/usr/bin/env python # -*- coding: utf-8 -*-__author__ = 'xq'from PIL import Image ...
最新文章
- 机器学习模型五花八门不知道怎么选?这份指南告诉你
- 伟大的密码胜于利剑——RSA2012成都站掠影
- MySQL会回收使用中的连接吗_Node.js实现mysql连接池使用事务自动回收连接的方法示例...
- 【摘录】手机操作系统三国时代的结束
- Maven编译jar出现:无法确定 T 的类型参数的异常的原因和处理方案
- vm虚拟机安装系统后出现operating system not found解决办法(VM装ghost 不能进系统的解决方法)
- php 23种设计模型 - 装饰模式
- 配置汇编环境:使用vs2010+MASM
- 厚积薄发,丰富的公用类库积累,助你高效进行系统开发(10)---各种线程同步的集合类...
- C# File流操作
- LODOP打印当前日期时间的方法
- 算法:First Missing Positive(求缺失的第一个正整数)
- linux mysql导出表中的数据_MySQL导出指定表中的数据
- 内外网双网卡同时上网
- 常用的网站建设程序有哪些?
- 【颜纠日记】PS批量裁剪不同图片-告别重复性操作
- 欢迎使用CSDN-markdown编辑器大范甘迪
- 背包问题之0-1背包算法详解
- 迁移学习论文阅读感想(初步)
- python 少儿不宜图片识别(基于肤色数量)