画像を比較明合成する
比較明合成は、複数の画像を比較して最も明るい画素を採用し合成画像を作成する手法です。同じ位置から撮影した星空やホタルの写真の合成に使われ、一枚だとわずかな光ですが合成することでそれぞれの写真の明るい部分(星やホタルの光)が集約され派手な写真にすることができます。
三脚に固定したカメラで夜の道路を長時間露光して撮影すると車のライトの光跡がレーザービームのように写ります。このレーザービーム写真を3枚比較明合成することで派手な写真にします。
使った関数・メソッド
- cv2.imread() : 画像ファイルの読み出し
- cv2.imwrite() : 画像の保存
- cv2.cvtColor() : 色空間の変換
環境
準備
画像サイズ800x540pxのレーザービームの写真3枚を、jupyter notebookファイル(***.ipynb)と同じディレクトリにファイル名'1.jpg','2.jpg','3.jpg'で保存しました。
コード
読み出した画像をBGR色空間から色相(Hue)、彩度(Saturation・Chroma)、明度(Value・Brightness)の三つの成分からなるHSV色空間に変換します。3つの画像の同じ座標のピクセルの明度Vを比較し、その値が大きいピクセルを採用します。それを全座標に渡って行い明度Vが大きいピクセルを集めた画像を生成します。
import cv2 import numpy as np # 元画像を格納するリスト img_list = [] # 画像をHSV色空間で読み出してリストに追加 img_list.append(cv2.cvtColor(cv2.imread('1.JPG'),cv2.COLOR_BGR2HSV)) img_list.append(cv2.cvtColor(cv2.imread('2.JPG'),cv2.COLOR_BGR2HSV)) img_list.append(cv2.cvtColor(cv2.imread('3.JPG'),cv2.COLOR_BGR2HSV)) # 画像の高さ、幅取得 height, width = img_list[0].shape[:2] # 比較明合成用ndarray生成 img = np.zeros((height, width, 3), np.uint8) # 3つの画像の同じ座標を比較し最もV値が大きい画素を採用 # imgを書き換える for y in range(height): for x in range(width): vmax = 0 for i in range(3): # 3つの画像の同じ座標のV値を比較 value = img_list[i][y,x][2] if vmax < value: vmax = value img[y,x]=img_list[i][y,x] # 比較明合成した画像をHSV色空間からBGR色空間に変換しファイルを保存 img_bgr = cv2.cvtColor(img, cv2.COLOR_HSV2BGR) cv2.imwrite('composite.jpg', img_bgr)
実行結果
比較明合成された画像composite.jpgが保存されます。3つの写真のレーザービームが足し合わされ派手な写真になりました。