画像

PythonのOpenCVで写真や画像を合成する

最終更新日 2023.02.18

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 の位置にリンカーンの肖像があります。