如何使用OpenCV和Python实现摄影中常见的长曝光效果
该任务可简单实现摄影中的长曝光效果。
什么是长曝光?
长曝光是摄影中的一种技术,当采用这项技术之后,流水、云朵可以像丝绸一般柔顺、汽车的轨迹照亮整条公路、星星伴随着地球的旋转呈现圆形的轨迹,从而在图像中呈现出时间流逝的美感。
具体的效果如下图所示:左图为视频序列(流动的水),右图为长曝光效果图
代码如下所示:
#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/