利用opencv对图像进行长曝光
利用opencv对图像进行长曝光
本文首发于公众号【Opencv视觉实践】,翻译自光头哥哥的博客:
【Long exposure with OpenCV and Python】,仅做学习分享。
原文链接:
https://www.pyimagesearch.com/2017/08/14/long-exposure-with-opencv-and-python/
我最喜欢的摄影技术之一是长曝光,这是一个创造图片的过程,可以展示时间流逝的影响,这是传统摄影无法捕捉到的。
当应用这一技术时,水变得如丝般光滑,夜空中的星星在地球旋转时留下光迹,汽车前灯或尾灯以单一的连续运动波段照亮高速公路。
长时间曝光是一项很棒的技术,但为了捕捉这类照片,将相机安装在三脚架上,使用各种滤镜,计算曝光值,等等。更不用说,你还需要先成为一个熟练的摄影师!
作为一名计算机视觉研究人员和开发人员,我知道很多关于处理图像的知识——但实际上,我是一个很差劲的摄影师。
幸运的是,有一种方法可以通过应用图像/帧平均来模拟长时间曝光。通过对固定相机在给定时间内拍摄的图像进行平均,我们可以模拟长时间曝光。
由于视频只是一系列图像,我们可以很容易地通过平均视频中的所有帧来构造长曝光。其效果是出乎意料的好,就像这篇博客文章的顶部图片。
这篇博文分为三个部分:
首先,我们将讨论如何通过帧平均模拟长曝光。
然后,我们将编写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。
如果你的环境中还没有安装imutils,只需使用pip:
$ 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)...")
在第3行,我们初始化RGB通道的平均,我们稍后将它合并到最终的长曝光图像。
我们还在第4行上初始化了帧总数的计数。
在本教程中,我们使用的是一个包含所有帧的视频文件,因此有必要在第8行打开一个指向视频捕获流的文件指针。
现在让我们开始我们的循环,它将计算平均值:
# 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"))
在我们的循环中,我们将从视频流中获取帧(第4行),并将帧分割成各自的BGR通道(第12行)。注意中间的退出条件——如果一个帧没有从流中抓取,我们就在视频文件的末尾,我们将跳出循环(第8行和第9行)。
在循环的其余部分,我们将执行运行的平均计算:
# 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通道像素值来初始化(只有在第一次循环时才需要这样做,因此使用If语句)。
否则,我们将计算(8-11行)每个通道的平均值。平均计算非常简单——我们用帧的总数total乘以各个通道的平均值,然后加上当前帧各个通道的值,然后将结果除以帧数(我们在分母上加1,因为当前图像是新的一帧)。最后帧总数total变量加1。
一旦我们循环了视频文件中的所有帧,我们可以合并(平均)通道到一个图像并将结果写入磁盘:
# 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()
三:测试结果
让我们通过处理两个示例视频来看看程序的实际操作效果。请注意,每个视频都是由安装在三脚架上的摄像机拍摄的,以确保视频的稳定性。
我们的第一个例子是一个15秒的水流过岩石的视频:我包含了一个视频帧的样本如下:
要创建长曝光效果,只需执行以下命令:
$ 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对图像进行长曝光相关推荐
- android代码查找图像,Android平台上利用opencv进行图像的边沿检测
原标题:Android平台上利用opencv进行图像的边沿检测 近开始接触opencv for Android,从网上down了图像的边沿检测的代码. 测试图片: 在Android2.3.1模拟器上跑 ...
- 利用OpenCV实现图像修复(含源码链接)
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 前一段时间小白分享过关于图像修复技术介绍的推文(点击可以跳转),有 ...
- 利用OpenCV检测图像中的多个水果
OpenCV检测图像中的多个水果 最近面试碰到一个图像算法题,要求: (1)检测一副图像中的多个苹果并标识出来. (2)标识时需要将图像中苹果按照从大到小给定序号,显示出来. 基于以上两点,准备利用C ...
- 利用opencv实现图像马赛克处理的三种方法
前言:本文就图像的马赛克处理,基于opencv提出了三种解决方案,并详细地介绍了三种方法的原理.示例.问题及问题的解决方案. 方法一 原理介绍:利用resize()将图片先缩小,再放大 代码示例: i ...
- 利用OpenCV对图像倾斜矩形目标区域进行固定大小裁剪
文章目录 目的 效果展示 为什么要固定大小裁剪? 代码及解释 原始文件 代码 代码解释 ① 主程序 ② ReadTxt() 函数 ③ rotate() 函数 目的 这篇博客主要介绍如何使用 OpenC ...
- 利用OpenCV进行图像的轮廓检测
简 介: 本文对于OpenCV中的轮廓检测算法进行了讨论,可以看到一些基于轮廓检测的应用.接着对四种不同的提取方式的结果进行了讨论.你还了解了如何将轮廓进行绘制的方法. 关键词: 轮廓检测,二值化 § ...
- C++中利用OpenCV进行图像批量处理
想要对大量图像进行简单处理,我们可以利用代码实现. OpenCV作为开源的图像处理库,安装方便,容易上手,功能强大,受到了很多人的喜爱. 1.背景 笔者正在参加全国大学生智能汽车竞赛.由于放假在家,家 ...
- 利用OpenCV提取图像中的矩形区域(PPT屏幕等)
** 前言 ** 最近参加了大创项目,题目涉及到计算机视觉,学姐发了个修正图像的博客链接,于是打算用这个题目入门OpenCV. 分析问题 照片中的PPT区域总是沿着x,y,z三个轴都有倾斜(如下图), ...
- 利用opencv对图像和检测框做任意角度的旋转
一.钢筋比赛中的数据扩充 #coding:utf-8 #数据集扩增 import cv2 import math import numpy as np import xml.etree.Elemen ...
最新文章
- 情侣必做的100件小事,提升幸福感,快收藏
- 克隆复制可使用原型( Prototype)设计模式
- jvm性能调优实战 - 43OOM内存溢出发生的原因及可能发生OOM的内存区域
- vue elementUI表单输入时触发事件@input
- Repeater 操作HeaderTemplat或FooterTemplat模板中控件
- JS 清空table
- php tp3 操作绑定到类,操作绑定到类 · ThinkPHP3.2.3完全开发手册 · 看云
- scratch跳一跳游戏脚本_cocos creator制作微信小游戏「跳一跳」
- ASP.NET 4.0升级至ASP.NET 4.5需要注意的地方
- NVelocity标签设置缓存的解决方案
- python中reshape_Numpy之reshape()使用详解
- Android 绑定类型服务---使用信使(Messenger)
- ubuntu16.04之升级python3.5到3.6
- 《必玩》!学习大师们的游戏设计经验,激发你的游戏创造力!
- Linux下opengl性能更高,OpenGL超级宝典学习笔记——性能比较
- 高性能Mysql(第三版)笔记
- 移动终端WAPI证书快速下载并自动连接解决方案
- FPGA实现SPI 协议
- python人脸比对算法_用Python实现一个简单的——人脸相似度对比
- jQuery按住滑块拖动验证插件
热门文章
- 青蛙跳台问题(初级)
- 【内网学习笔记】5、BloodHound 的使用
- ‘@Autowired‘ not applicable to local variable
- 配置红帽网络yum常用源地址
- Python一看就懂系列(四)
- CSM认证部分题目分析 1
- 【Unity3D】正交视图与透视视图 ( 正交视图概念 | 透视视图概念 | 观察点 | 正交视图作用 | 摄像机广角设定 | 透视畸变效果 )
- C/C++ Strict Alias 小记
- c语言产生系统年月日,c语言中如何输入年月日
- 电脑待机后黑屏是死机了吗