画像をグラデーションをつけて合成する
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) # 画像保存
実行結果