動画を明るく鮮やかにする
動画を明るく鮮やかにします。画像処理ライブラリOpenCVで動画ファイルを読み出し、フレーム毎の画像をBGR色空間からHSV色空間に変換します。画像のS(彩度)、V(明るさ)に対してcv2.LUTでガンマカーブ(γ=1.5)のルックアップテーブルを適用し、その画像をつなぎ合わせて明るく鮮やかな動画にします。
関連記事
環境
準備
動画ファイルは動画ACの「山の草原で体をひねる運動をする女性」をダウンロードさせていただき、jupyter notebookファイル(***.ipynb)と同じディレクトリにファイル名’woman.mp4'で保存しました(動画のサイズは320x180)。このブログにはmovファイルが貼れないのでアニメーションgifファイルに変換したものを下に貼ります。
コード
cv2.VideoCaptureで動画を取り込み、各フレームをcv2.cvtColorでBGRからHSVに色空間を変換します。HSV画像をチャンネル別に分離しS(彩度)、V(明度)に対してcv2.LUTでγ=1.5のガンマカーブのルックアップテーブルを適用、ガンマ補正で彩度と明度を強調します。
from PIL import Image import cv2 import numpy as np # gifファイル作成用イメージリスト images =[] # 動画ファイル作成用イメージリスト frames =[] # 動画ファイルのキャプチャー cap = cv2.VideoCapture('woman.mp4') # フレームの幅取得 width = cap.get(cv2.CAP_PROP_FRAME_WIDTH) # フレームの高さ取得 height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT) # 総フレーム数取得 allframes = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) # 動画ファイルのフレームレート取得 fps = cap.get(cv2.CAP_PROP_FPS) # 保存用動画ファイルのフォーマット設定 fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v') out = cv2.VideoWriter('vivid.mp4', fourcc, fps, (int(width), int(height))) # 変換用ルックアップテーブルの生成 gamma = 1.5 look_up_table = np.zeros((256, 1) ,dtype=np.uint8) for i in range(256): look_up_table[i][0] = (i/255)**(1.0/gamma)*255 # 動画を1コマずつ取り込んで処理 while(cap.isOpened()): ret, frame = cap.read() # キャプチャー画像の取り込み if ret==True: # キャプチャー画像がある場合 # 色空間をBGR->HSVに変換 hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) # チャンネルごとに分割 h, s, v = cv2.split(hsv) # 明度(V)に対してルックアップテーブル適用 v_lut = cv2.LUT(v, look_up_table) # 彩度(S)に対してルックアップテーブル適用 s_lut = cv2.LUT(s, look_up_table) # H,変換後S,変換後Vをマージ merge = cv2.merge([h, s_lut, v_lut]) # HSV->BGR変換 bgr = cv2.cvtColor(merge, cv2.COLOR_HSV2BGR) # VideoWriterにフレームを追加 out.write(bgr) # gifファイル作成用イメージリストにフレームを追加 images.append(Image.fromarray(cv2.cvtColor(bgr, cv2.COLOR_BGR2RGB))) else: # キャプチャー画像がない場合はループ終了 break cap.release() # 再生画像をクローズ out.release() # 出力動画ファイルをクローズ # gif動画保存 images[0].save('vivid.gif', save_all=True, append_images=images[1:], optimize=False, duration=1000/fps, loop=0)
実行結果
明るく鮮やかになった動画が保存されます。
こちらが変換前。
以下のサイトを参考にさせていただきました
Pythonの文法メモ > 【OpenCV】動画ファイルの読み出しとプロパティ取得、キャプチャー画像の保存
Pythonの文法メモ > 【OpenCV】LUTによる画像変換