Pythonでいろいろやってみる

Pythonを使った画像処理や機械学習などの簡単なプログラムを載せています。

画像をグラデーションをつけて合成する

2枚の画像をグラデーションを付けて合成します。opencvのメソッドcv2.addWeightedを使います。片方の画像のウエイトを左→右で減らし、もう片方の画像のウエイトを逆に左→右で増やすことで左右にウエイトを変えて合成します。合成する画像は同じサイズでないといけません。

使った関数・メソッド
  • cv2.imread() : 画像ファイルの読み出し
  • np.zeros() : 値が0のndarrayの生成
  • cv2.addWeighted() : 画像の重み付き重ね合わせ
  • cv2.imwrite() : 画像の保存
環境
  • windows10 home
  • Anaconda 3/ jupyter notebook 5.6.0
  • Python 3.7.0
  • OpenCV 4.0.0
準備

画像ファイルはフリー写真素材ぱくたそからダウンロードさせていただき、jupyter notebookファイル(***.ipynb)と同じディレクトリに保存しました。
f:id:T_A_T:20191001203534j:plain
ramen.jpg

f:id:T_A_T:20191001203635j:plain
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の合成画像が生成されます。 f:id:T_A_T:20191001212205j:plain


別の画像でもやってみます。
f:id:T_A_T:20191001212443j:plain
woman.jpg

f:id:T_A_T:20191001212546j:plain
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)  # 画像保存
実行結果

f:id:T_A_T:20191001212931j:plain

ブログランキングに参加しています

にほんブログ村 IT技術ブログへ
にほんブログ村