本文将学习如何使用OpenCV和图像处理技术模拟长曝光图像。为了模拟长时间曝光,我们使用平均一组图像的帧平均。长曝光是摄影师最喜欢的摄影技术之一,它可以拍出展现时间流逝的照片,这是传统技术难以做到的。我们经常使用这种技术来表现流动的夜景或流畅的流水。优秀的长曝光作品是摄影师对快门速度、光圈大小和ISO感光度的绝对控制,那么我们如何使用Python和OpenCV库来实现这种长曝光效果呢?采用长曝光技术后,水流变得如丝般顺滑,夜空中的星星也随着地球的自转留下光迹,头灯/尾灯变成了光柱。长曝光技术很酷,但要拍出这样的照片,我们需要学习一些系统的方法:把相机架在三脚架上,应用各种滤镜,计算曝光值等等。更何况,我们还需要一个熟练的摄影师!作为一名计算机视觉研究人员和程序员,本文作者对图像处理非常了解。虽然是摄影新手,但是有办法通过应用多帧图像平均来模拟长时间曝光的效果。我们可以通过计算在特定时间段内拍摄的图像的平均值来(有效地)模拟长时间曝光效果。而由于视频实际上是一系列图像,我们可以通过计算视频中所有帧的平均值来实现长时间曝光的效果。结果是惊人的长时间曝光效果。一、使用OpenCV和Python实现长曝光效果本文分为三个部分。在本文的第一部分,我们将讨论如何通过帧平均来模拟长曝光效果。然后,我们将编写Python和OpenCV代码,为输入视频创建长时间曝光效果。***,我们将在一些示例视频中使用我们的代码来创建很酷的长时间曝光图像。1.通过多帧图像平均模拟长时间曝光效果通过平均模拟长时间曝光的想法由来已久。事实上,如果我们去流行的摄影网站,我们会找到有关如何使用相机和三脚架手动实现这些效果的教程。我们今天的目标是简单地实现这种方法,因此我们使用Python和OpenCV自动创建输入视频的长曝光图像。给定一个输入视频,我们将计算所有帧的平均值(加权平均值)以创建长时间曝光效果。注意:我们也可以使用多个连续图像来创建这种长时间曝光效果,但由于视频本质上是一系列图像,因此用视频更容易演示此技术。将此技术应用于自定义图像时请记住这一点。我们看到代码并不复杂,适用于使用三脚架拍摄的视频(无需摇晃相机)时效果很好。2、OpenCV实现模拟长曝光效果。我们首先创建一个名为long_exposure.py的新文件,然后插入以下代码:pathtoinputvideofile")ap.add_argument("-o","--output",required=True,help="pathtooutput'longexposure'")args=vars(ap.parse_args())第2-4行导入包,所以我们需要预先安装Imutils和opencv。如果没有安装imutils模块,可以通过pip安装:$pipinstall--upgradeimutils如果你的电脑没有安装配置OpenCV,请自行搜索OpenCV3安装教程,选择适合自己的安装方式系统。我们在第7-12行解析命令行参数。--video:视频文件目录路径--output:输出“长曝光”图像路径+文件名接下来,执行一些初始化步骤:None,None)total=0#openapointertothevideofileprint("[INFO]openingvideofilepointer...")stream=cv2.VideoCapture(args["video"])print("[INFO]computingframeaverages(thiswilltakeawhile)...")我们初始化第16行的RGB通道平均值,稍后将合并到最终的长曝光图像中。我们还在第17行初始化了总帧数。对于本教程,我们正在处理一个包含所有帧的视频文件,因此有必要在第21行创建一个文件指针来捕获视频流。现在我们进入循环语句计算平均值:#loopoverframesfromthevideofilestreamwhileTrue:#grabtheframesfromthefilestream(grabbed,frame)=stream.read()#iftheframewasnotgrabbed,thenwehave#reachedtheendofthesfileifnotgrabbed:break#otherwise,splitthefrmaeintoitsrespective,R2,R2(frame.astype("float"))在循环语句中,我们将从流中捕获帧(第27行)并将每个帧分解为相应的BGR通道变量(第35行)。注意循环语句的退出条件:如果没有从视频文件流的末尾抓取帧,我们就退出循环(第31和32行)。我们将在循环的其他地方执行平均计算:#iftheframeaveragesareNone,initializethemifrAvgisNone:rAvg=RbAvg=BgAvg=G#otherwise,computetheweightedaveragebetweenthehistoryof#framesandthecurrentframeselse:rAvg=((total*rAvg)+(1*R))/(total+1.0)gAvg=((total*gAvg)+(1*G))/(total+1.0)bAvg=((total*bAvg)+(1*B))/(total+1.0)#incrementthetotalnumberofframesreadthusfartotal+=1if这是第一次迭代,我们在第38-41行将RGB的初始平均值设置为抓取的第一帧的通道值(if语句仅在第一次迭代时执行此操作)。否则,我们计算第45-48行抓取图像的每个通道的平均值。平均计算很简单,我们将总帧数乘以通道平均值,加上相应的通??道,然后将结果除以float总帧数(我们在分母total上加一,因为生成了一个新帧).我们将计算结果存储在相应的RGB通道平均值数组中。***,我们增加总帧数以维持运行时平均值(第51行)。一旦我们遍历了视频文件中的所有帧,我们就可以将(平均)通道值合并到一个新图像中并将其写入磁盘:#mergetheRGBaveragestogetherandwritetheoutputimagetodiskavg=cv2.merge([bAvg,gAvg,rAvg]).astype("uint8")cv2.imwrite(args["output"],avg)#doabitofcleanuponthefilepointerstream.release()在第54行,我们使用cv2.merge函数并指定列表中每个图像的通道平均值。因为这些数组包含浮点数(即所有帧的平均值),所以我们需要使用astype("uint8")函数将像素值转换为[0-255]范围内的整数。我们在以下第55行中使用命令行参数路径+文件名将平均图像写入磁盘。我们也可以通过cv2.imshow函数将图像显示在屏幕上,但是由于这会占用大量CPU资源来处理视频文件,所以我们只是将图像保存到磁盘以供进一步查看。脚本的最后一步是通过释放视频流指针来清除内存(第58行)。3.长曝光效果与OpenCV实现对比我们通过处理三个样本视频来测试脚本效果。请注意,每个视频都是由安装在三脚架上的相机拍摄的,稳定性很好。请注意,所用视频均非作者本人拍摄,但均已获得原作者授权;因此,本文作者无法提供源码以外的视频资源下载。但是,如果你想复现作者的实验结果,请参考我提供的原始视频的链接。我们的第一个示例是一个15秒的水击打石头的视频,下面的视频中包含一个示例帧:https://videohive.net/item/mountain-river-water-and-stones-01/16602591图1:示例河水打石框我们只需要执行下面的命令就可以实现长曝光效果。$timepythonlong_exposure.py--videovideos/river_01.mov--outputriver_01.png[INFO]openingvideofilepointer...[INFO]computingframeaverages(thiswilltakeawhile)...real2m1.710suser0m50.959ssys0m40.207s图2:通过Python和OpenCV使用帧平均值该方法实现的河水15秒长曝光渲染图。注意水是如何平均的,以获得柔滑的效果。我们继续第二个河流的例子,再次得到一个蒙太奇效果图如下:图3:另一条河流的示例帧以下命令用于生成长曝光效果图:$timepythonlong_exposure.py--videovideos/river_02.mov--outputriver_02.png[INFO]openingvideofilepointer...[INFO]computingframeaverages(thiswilltakeawhile)...real0m57.881suser0m27.207ssys0m21.792s图4:第二条河流的柔滑长曝光渲染(由OpenCV创建)静止的岩石保持原样,但湍急的水流被平均化为连续的画面,模拟了长时间曝光的效果。***一个例子是我最喜欢的,因为水的颜色很神奇,它使水和森林相得益彰:图5:使用OpenCV创建长时间曝光效果时的洪流穿过森林的示例帧,它会给你一种超现实的梦幻般的感觉:$timepythonlong_exposure.py--videovideos/river_03.mov--outputriver_03.png[INFO]openingvideofilepointer...[INFO]computingframeaverages(thiswilltakeawhile)...real3m17.212suser1m11.826ssys0m56。707s6:除了使用Python和OpenCV制作的梦幻般的长曝光效果图,我们还可以考虑构造不同的Output。2.总结在本文中,我们学习了如何使用OpenCV和图像处理技术来模拟长曝光图像。为了模拟长时间曝光,我们使用平均一组图像的帧平均。我们假设输入图像/视频是用固定相机拍摄的(否则生成的输出图像会失真)。虽然这并不是真正的“长时间曝光”,但效果(在视觉上)非常相似。此外,这使您无需成为专业摄影师或购买昂贵的相机、镜头和滤镜即可应用长时间曝光效果。原文:https://www.pyimagesearch.com/2017/08/14/long-exposure-with-opencv-and-python/心(id:almosthuman2014)》】点此阅读本作者更多好文
