天天看點

[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/