PythonのOpenCVで写真や画像を合成する
OpenCV を使って画像を合成します。OpenCV を使うときは cv2 というライブラリをインポートしましょう。


import cv2
img1 = cv2.imread('president.jpg')
img2 = cv2.imread('park.jpg')
height, width = img1.shape[:2]
img2[0:height, 0:width] = img1
cv2.imwrite('new.jpg', img2)

画像を cv2.imread で読み、画像オブジェクトを作ります。上に貼りたい画像のサイズ(縦と横の長さ)を取得し、背景のオブジェクトの一部をそのオブジェクトに置換します。
置換後のオブジェクトを書きだして合成した画像ができます。imwrite は画像を書きだす関数です。
ポイントはオブジェクトを置換する img2[0:height, 0:width] = img1 にあります。カッコの引数は次のような意味を持ちます。
yt:yb,xl:xr
yt ... y 座標の上
yb ... y 座標の下
xl ... x 座標の左
xr ... x 座標の右
4 つの座標は、上にする画像の頂点を表します。次のプログラムは、上にする画像を隅からずらして合成しています。
import cv2
img1 = cv2.imread('president.jpg')
img2 = cv2.imread('park.jpg')
height, width = img1.shape[:2]
img2[100:height + 100, 200:width + 200] = img1
cv2.imwrite('new.jpg', img2)
画像を上から 100、左から 200 ずれた位置に合成しています。

ずらしてのせることを考慮すると、次のような関数を作ると便利かもしれない。
import cv2
def add(f1, f2, out, top, left):
img1 = cv2.imread(f1)
img2 = cv2.imread(f2)
height, width = img1.shape[:2]
img2[top:height + top, left:width + left] = img1
cv2.imwrite(out, img2)
add('president.jpg', 'park.jpg', 'new.jpg', 30, 60)
add という関数を作りました。この関数は 1 番目に合成したい画像、2 番目に合成の背景にしたい画像、3 番目に出力先、4 番目に合成する位置の y 座標、5番目に x 座標を指定します。

上は add で作成した画像です。上から 30、左から 60 の位置にリンカーンの肖像があります。