はじめに
OpenCV を使ってアルファブレンド(透過合成)を行う場合、addWeighted をよく使います。
書式
dst = cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]])
1 2 3 4 5 6 7 8 9 10 11 12 |
import cv2 src1 = cv2.imread("sample1.jpg") src2 = cv2.imread("sample2.jpg") alpha = 0.3 blended = cv2.addWeighted(src1, alpha, src2, 1 - alpha, 0) cv2.imshow("debug", blended) cv2.waitKey(0) cv2.destroyAllWindows() |
ところがこの API は、入力する src1 と src2 が同じ画像サイズである必要があります。
ということで、本記事ではサイズの異なる画像をアルファブレンドする方法をご紹介します。
異なるサイズの画像をアルファブレンド
画像の準備
先ずは画像を準備します。
記事上では同じサイズに見えますが、sample1 は sample2 の 6倍ほどのサイズ(画素)です。
アルファブレンドを行うコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
import cv2 as cv import numpy as np def __overlay(background, overlay, x, y, alpha=None): back_width = background.shape[1] back_height = background.shape[0] if x >= back_width or y >= back_height: return background h, w = overlay.shape[0], overlay.shape[1] if x + w > back_width: w = back_width - x overlay = overlay[:, :w] if y + h > back_height: h = back_height - y overlay = overlay[:h] if overlay.shape[2] < 4: overlay = np.concatenate( [ overlay, np.ones((overlay.shape[0], overlay.shape[1], 1), dtype = overlay.dtype) * 255 ], axis = 2) overlay_img = overlay[..., :3] if alpha is None: alpha = overlay[..., 3:] / 255.0 background[y:y+h, x:x+w] = (1.0 - alpha) * background[y:y+h, x:x+w] + alpha * overlay_img return background def main(): # read images back_img = cv.imread('sample1.jpg') over_img = cv.imread('sample2.jpg') # alpha blending img = __overlay(back_img, over_img, 50, 50, 0.6) cv.imwrite('result.jpg', img) if __name__ == '__main__': main() |
アルファブレンドの結果