专栏首页深度学习和计算机视觉实战:基于OpenCV进行长时间曝光(内含彩蛋)

实战:基于OpenCV进行长时间曝光(内含彩蛋)

在本文中,我们将学习长时间曝光摄影技术,以及如何使用Python和OpenCV(开源计算机视觉库)对其进行仿真。

一、什么是“长时间曝光“?

直接来自维基百科:

长时间曝光,时间曝光或慢速快门摄影涉及使用长时间快门速度来清晰地捕获图像的静止元素,同时使运动元素模糊。长时间曝光摄影可以捕捉到传统摄影无法捕捉到的一个元素:较长的时间。

因此,长时间曝光是一种出色的摄影技术,包括创建可显示时间效果的图像,这是普通摄影无法捕获的。对于初学者来说,这种技术并不容易,因为它需要一种有条理的方法来捕获图像。幸运的是,我们可以用图像处理来模拟这种技术。为此,我们可以使用一个视频(基本上是一系列图像)来计算基于所有视频帧的平均图像。

二、依赖库

在本教程中,我们将使用Python 3和OpenCV。我们将使用OpenCV,因为它是一个著名的开源计算机视觉库,其中提供了许多处理图像和视频的功能。在本教程中,我们将使用OpenCV来操纵视频及其帧。下图优雅地说明了为什么要使用Python:

此外,我们将使用其他两个Python软件包:

  • 单击:提供命令行界面(CLI)。
  • tqdm:在终端上显示一个优雅的进度栏。

我们还将使用Pipenv轻松创建和管理虚拟环境。

三、环境

使用项目根目录中提供的Pipfile,我们可以使用Pipenv通过以下命令创建,安装依赖项并激活虚拟环境:

pip install pipenv # if not installed yet
pipenv install --dev
pipenv shell

四、代码

让我们开始看“入口点”。这是一个CLI命令,我们应该在其中传递一些参数:

  • video_path:本地计算机中视频的路径。
  • image_path:输出图像的路径和文件名。
  • step / -s(可选):用于获取帧的步骤。这是一个可选参数,默认值为1。
@cli.command()
@click.argument("video_path", nargs=1, type=str)
@click.argument("image_path", nargs=1, type=str)
@click.option(
    "--step",
    "-s",
    default=1,
    type=int,
    show_default=True,
    help="Step used to get the frames.",
)
def local_video(video_path, image_path, step):
    """Apply the long exposure algorithm to a local video."""
    long_exposure = LongExposure(video_path, image_path, step)
    long_exposure()

它使用单击修饰符来提供漂亮的命令行界面。如果你们仍然不知道单击,我们建议你们看一下该程序包。这使我们可以像这样调用Python脚本:

python src/long_exposure.py local-video video.mp4 image.png -s 5

如果你们对如何使用有疑问,可以通过help标志来调用它:

python src/long_exposure.py --help

现在,让我们谈谈LongExposure类。这是项目的主类,它在其__init__中接收以下参数:

  • video:本地计算机中的视频路径。
  • output_image_path:必须在其中保存输出图像的路径/文件名。
  • step:用于忽略某些帧的步骤(默认为1)。这对于长视频非常有用。
class LongExposure:
    def __init__(self, video, output_image_path, step=1):
        self.video = video
        self.output_image_path = output_image_path
        self.step = step

平均器的方法仅仅是一个Clojure的是用来递增地计算平均图像,因为我们正在消耗视频帧逐个。

 @staticmethod
    def averager():
        """Calculate the average using a clojure."""
        count = 0
        total = 0.0

        def average(value):
            nonlocal count, total
            count += 1
            total += value
            return total / count

        return average

由于这是一个可调用的类,因此__call__方法是该类的主要方法,它主要负责:

  • 加载视频;
  • 通过视频帧进行迭代以计算平均图像(针对每个颜色通道);
  • 合并颜色通道;以及
  • 将映像保存在磁盘上。
def __call__(self):
        logging.info("Processing video %r with step %r", self.video, self.step)

        # Open a pointer to the video file
        stream = cv2.VideoCapture(self.video)

        # Get the total frames to be used by the progress bar
        total_frames = int(stream.get(cv2.CAP_PROP_FRAME_COUNT))

        r, g, b = None, None, None
        r_avg, g_avg, b_avg = self.averager(), self.averager(), self.averager()

        for count in tqdm(range(total_frames)):
            # Split the frame into its respective channels
            _, frame = stream.read()

            if count % self.step == 0:
                # Get the current RGB
                b_curr, g_curr, r_curr = cv2.split(frame.astype("float"))
                r, g, b = r_avg(r_curr), g_avg(g_curr), b_avg(b_curr)

        # Merge the RGB averages together and write the output image to disk
        avg = cv2.merge([b, g, r]).astype("uint8")
        logging.info("Saving image as %r", self.output_image_path)
        cv2.imwrite(self.output_image_path, avg)

        # Release the stream pointer
        stream.release()

请注意,cv2来自OpenCV,而tqdm(在循环中)仅用于显示进度条。如你们所见,这里没有魔术,代码非常简单,几乎可以自己解释。现在,让我们看看结果。

五、结果

我已使用以下YouTube视频应用长时间曝光效果:

本文分享自微信公众号 - 小白学视觉(NoobCV),作者:小白

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-03-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 教程 | 摄影爱好者玩编程:利用Python和OpenCV打造专业级长时曝光摄影图

    选自pyimagesearch 机器之心编译 参与:乾树、蒋思源 在本文中,我们将学习如何使用 OpenCV 和图像处理技术来模拟长时曝光图像。为了模拟长时曝...

    机器之心
  • 利用opencv对图像进行长曝光

    【Long exposure with OpenCV and Python】,仅做学习分享。

    周旋
  • CVPR2019 | 港中文&腾讯优图等提出:暗光下的图像增强

    论文地址:http://jiaya.me/papers/photoenhance_cvpr19.pdf

    小白学视觉
  • 元数据(MetaData)

    元数据是用来描述数据的数据(Data that describes other data)。单单这样说,不太好理解,我来举个例子。 下面是契诃夫的小说《套中人》...

    ruanyf
  • 直击现场,VRLA重磅来袭你准备好了吗?

    VRPinea
  • 直方图均衡 Histogram Equalization

    在说明直方图均衡之前,先说说亮度直方图的概念。为了评估一个图像的色调转换,首先需要建立亮度直方图。亮度直方图就是图像中亮度分布的图表。在横轴上表示亮度值从黑色到...

    caoqi95
  • 新玩法!用软件快速评估蛋白条带曝光程度?

    Western Blot实验有非常多的注意事项,只要把细节控制好就能得到漂亮的图。

    Mark Chen
  • [实战] 图片转素描图

    我们知道图片除了最普通的彩色图,还有很多类型,比如素描、卡通、黑白等等,今天就介绍如何使用 Python 和 Opencv 来实现图片变素描图。

    kbsc13
  • 2D景观转3D风景大片,无惧复杂光线与遮挡,人类离「躺着旅行」的梦想又近了一步

    上班的时候想旅行,休假的时候想躺着,这是大多数年轻人的状态。如果能够躺在床上旅行,岂不美哉?

    机器之心
  • 全程剖析Western blot原理,你才能掌控它

    最近,有人在后台私信小编,说他(她)的朋友最近被WB烦的不行,希望能够出几期实验相关教程,解答他们在WB中遇到的难题。

    百味科研芝士
  • 宛如白昼,谷歌发布最强夜景拍照AI算法,单摄秒杀一众苹果华为三星

    是的,这张照片拍摄于夜晚,用普通模式拍照只能拍出勉强看到的酒杯和水果,在谷歌的夜视模式下,就能像白天一样,所有物品细节一清二楚。

    量子位
  • 宛如白昼,谷歌发布最强夜景拍照AI算法,单摄秒杀一众苹果华为三星

    是的,这张照片拍摄于夜晚,用普通模式拍照只能拍出勉强看到的酒杯和水果,在谷歌的夜视模式下,就能像白天一样,所有物品细节一清二楚。

    量子位
  • ISP(图像信号处理)介绍

    ISP(Image Signal Processing) 图像信号处理。主要用来对前端图像传感器输出信号处理的单元,以匹配不同厂商的图象传感器。相机用图像处理器...

    FPGA开源工作室
  • 解密:二叉树的秘密

    昨天的万粉闯关活动让我始料未及,推文才刚刚发出十分钟左右,阳光普照奖就被抢完了,不到两小时,五个关卡所有红包也被清空,读者真是卧虎藏龙,高手如云啊~

    轩辕之风
  • 特征提取方法(一):HOG原理及OpenCV实现

    方向梯度直方图(Histogram of Oriented Gradient, HOG)于2005年提出,是一种常用的特征提取方法,HOG+SVM在行人检测中有...

    chaibubble
  • 基于OpenCV的彩色空间互转

    图像彩色空间互转在图像处理中应用非常广泛,而且很多算法只对灰度图有效;另外,相比RGB,其他颜色空间(比如HSV、HSI)更具可分离性和可操作性,所以很多图像算...

    Datawhale
  • 2018年最后几天学什么?给你关注度最高的10篇文章

    【导语】我们从 12 月里近1400篇机器学习文章进行了排名,并挑选出最受大家关注的十篇文章。这些文章的内容主要是由 Google、DeepMind、OpenA...

    AI科技大本营
  • 高端智能电视派系之争:华为小米、三星索尼、海信创维

    从乐视、小米相继在2013年发布自己的智能电视产品开始算起,国内的智能电视潮流已兴起7年有余,至今智能电视在整个电视市场中的渗透率已经接近100%。

    刘旷
  • 机器视觉系统硬件:工业相机

    相机是机器视觉系统的核心部件,广泛应用于各个领域,如生产监控、测量任务和质量控制等。工业相机通常比常规的标准数字相机更加坚固耐用,这是因为它们必须能够应对各种复...

    用户7699929

扫码关注云+社区

领取腾讯云代金券