画像をグラデーションをつけて合成する
2枚の画像をグラデーションを付けて合成します。opencvのメソッドcv2.addWeightedを使います。片方の画像のウエイトを左→右で減らし、もう片方の画像のウエイトを逆に左→右で増やすことで左右にウエイトを変えて合成します。合成する画像は同じサイズでないといけません。
使った関数・メソッド
- cv2.imread() : 画像ファイルの読み出し
- np.zeros() : 値が0のndarrayの生成
- cv2.addWeighted() : 画像の重み付き重ね合わせ
- cv2.imwrite() : 画像の保存
環境
準備
画像ファイルはフリー写真素材ぱくたそからダウンロードさせていただき、jupyter notebookファイル(***.ipynb)と同じディレクトリに保存しました。

ramen.jpg

mountain.jpg
コード
import cv2 #OpenCVのインポート
import numpy as np # numpyのインポート
img_1 = cv2.imread('ramen.jpg') # ramen.jpgを読み出しオブジェクトimg_1に代入
img_2 = cv2.imread('mountain.jpg') # mountain.jpgを読み出しオブジェクトimg_2に代入
height,width = img_1.shape[:2] # 画像サイズ取得
img= np.zeros((height,width,3), dtype='int') # 合成画像用ndarrayの生成
# 画像幅分のfor文
# weightを0→1へと変化させる
# 画像同士をx座標ごとweightを変えながら合成する
for i in range(width):
weight = i/width
img[:,i,:] = cv2.addWeighted(img_1[:,i,:],1-weight,img_2[:,i,:],weight,0)
cv2.imwrite('ramen_and_mountain_grad.jpg',img) # 画像保存
実行結果
左がラーメンのウエイト1、右が山のウエイト1の合成画像が生成されます。

別の画像でもやってみます。

woman.jpg

man.jpg
コード
女性の写真を濃く、男性の写真を薄くするため
woman.jpgのウエイトを左1→右0.7
man.jpgのウエイトを左0→右0.3
としています。
import cv2 # OpenCVのインポート
import numpy as np # numpyのインポート
img_1 = cv2.imread('woman.jpg') # woman.jpgを読み出しオブジェクトimg_1に代入
img_2 = cv2.imread('man.jpg') # man.jpgを読み出しオブジェクトimg_2に代入
height,width = img_1.shape[:2] # 画像サイズ取得
img= np.zeros((height,width,3), dtype='int') # 合成画像用ndarrayの生成
# 画像幅分のfor文
# weightを0→0.3へと変化させる
# 画像同士をx座標ごとweightを変えながら合成する
for i in range(width):
weight = i/width*0.3
img[:,i,:] = cv2.addWeighted(img_1[:,i,:],1-weight,img_2[:,i,:],weight,0)
cv2.imwrite('woman_and_man_grad.jpg',img) # 画像保存
実行結果
