Pythonでいろいろやってみる

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

コラージュ写真を作る

写真から人物を切り抜いて、別の写真に貼り付けます。 人物写真から、人物が白(1)・それ以外が黒(0)のマスク、人物が黒(0)・それ以外が白(1)のマスクを生成しそれぞれを人物、背景と要素のかけ合わせを行い 、2つの画像を足し合わせることでコラージュ画像を作ります。

人物のマスク処理
f:id:T_A_T:20190411231209p:plain

背景のマスク処理
f:id:T_A_T:20190411231254p:plain

使った関数・メソッド
  • cv2.imread() : 画像ファイルの読み出し
  • cv2.cvtColor() : 画像の色空間変換
  • cv2.threshold() : 画像の二値化
  • np.where() : 条件を満たすndarrayの要素の置換
  • cv2.imwrite() : 画像を保存する
環境
  • windows10 home
  • Anaconda 3/ jupyter notebook 5.6.0
  • Python 3.7.0
  • OpenCV 4.0.0
準備

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

f:id:T_A_T:20190411221918j:plain
kabukicho.jpg

コード
import cv2  # OpenCVのインポート
import numpy as np  # numpyのインポート

img_1 = cv2.imread('masaki.jpg')   # 前景になる画像の読み出し
img_2 = cv2.imread('kabukicho.jpg')   #  背景になる画像の読み出し

threshold=240  # マスク作成時の二値化閾値
img_1_gray = cv2.cvtColor(img_1, cv2.COLOR_BGR2GRAY) # 前景画像をグレースケール変換
ret, img_1_binary= cv2.threshold(img_1_gray, threshold, 255, cv2.THRESH_BINARY)  # 閾値で二値化しマスク画像を作成(人物を黒に)

mask_bgr = cv2.cvtColor(img_1_binary, cv2.COLOR_GRAY2BGR)  # ndarrayの型合わせのためGRAY→BGRに変換
mask_bgr_bin = np.where(mask_bgr == 255, 1, 0)  # マスクの白(255)を1に、それ以外を0に変換(01マスクを生成)
mask_bgr_bin_inv = np.where(mask_bgr == 255, 0, 1)  # マスクの白(255)を0に、それ以外を1に変換(反転01マスクを生成)

img_3 = img_1 * mask_bgr_bin_inv  # 前景画像に反転01マスクを掛け人物だけ抜き出す(それ以外は黒)
img_4 = img_2 * mask_bgr_bin  # 背景画像に1マスクを掛け人物以外の部分を抜き出す(それ以外は黒)

img_marged = img_3 + img_4  # 前景、背景を併せる

cv2.imwrite('img_marged.jpg',img_marged)  # 画像の保存

実行結果

人物が切り抜かれ背景画像に貼り付けられます。

f:id:T_A_T:20190411222030j:plain

以下のサイトを参考にさせていただきました

note.nkmk.me >>Python, OpenCV, NumPyで画像のアルファブレンドとマスク処理

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

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