天天看点

[Python与图像处理]利用Python与Opencv实现图像长曝光

如何使用OpenCV和Python实现摄影中常见的长曝光效果

  该任务可简单实现摄影中的长曝光效果。

什么是长曝光?

  长曝光是摄影中的一种技术,当采用这项技术之后,流水、云朵可以像丝绸一般柔顺、汽车的轨迹照亮整条公路、星星伴随着地球的旋转呈现圆形的轨迹,从而在图像中呈现出时间流逝的美感。

具体的效果如下图所示:左图为视频序列(流动的水),右图为长曝光效果图

[Python与图像处理]利用Python与Opencv实现图像长曝光
[Python与图像处理]利用Python与Opencv实现图像长曝光
[Python与图像处理]利用Python与Opencv实现图像长曝光

代码如下所示:

#coding:utf-8
#*********************************************************************************************************
'''
说明:利用python/opencv实现摄影中的图像长曝光
算法思路:
        1)读取视频图像,将每一帧图像进行通道分离;
        2)采用简单的平均思想,对序列帧进行处理;
		3)合并处理后分离的三通道图像;
'''

import cv2
import numpy as np
import argparse

ap = argparse.ArgumentParser()
ap.add_argument("-v", "--video", required=True,help="path to input video file")
args = vars(ap.parse_args())

if __name__ == '__main__':
    print( '[INFO] 读取视频流......' )
    cap = cv2.VideoCapture( args['video'] )
    num = 0
    ( ravg, gavg, bavg ) = ( None, None, None )
    while True:
        while ( num < 300 ):#只处理本地视频的前300帧,因为后续视频与当前场景不同
        #你可以根据自己的视频选择        
            ret, frame = cap.read()
            print( num )
            if not ret:
                print('    视频流读取失败或读取完成    ')
                break
            #图片通道分离
            cv2.imshow( 'frame', frame )
            cv2.waitKey( 20 )
            ( B, G, R ) = cv2.split( frame )
            if ravg is None:
                ravg, gavg, bavg = R, G, B
            else:
                ravg = ( R + num * ravg ) / ( num + 1 )
                gavg = ( G + num * gavg ) / ( num + 1 )
                bavg = ( B + num * bavg ) / ( num + 1 )
            num += 1            
        #通道合并为长曝光图像
        long_exposure_img = cv2.merge( [ bavg, gavg, ravg ] ).astype( 'uint8' ) 
        cv2.imshow( 'Long_exposure', long_exposure_img )
        cv2.waitKey( 0 )  
           

参考链接:Adrian Rosebrock大神

https://www.pyimagesearch.com/2017/08/14/long-exposure-with-opencv-and-python/