概要
openCVでα値を扱ってみることにした。BGRにαチャンネルを加えた4チャンネルで扱い、pngで保存することでαチャンネルを持つ画像を生成することができた。また、αチャンネルを持つ画像を2枚作成し、αブレンドを試してみた。


α値を持つpng画像の作成
上半分が青、下半分が赤の画像を作り、横方向にα値をグラデーションさせる。作成した画像をpngで保存した。
import cv2
import numpy as np
w, h = 128, 64
img = np.zeros((h, w, 4), dtype='uint8')
img[:int(h/2),:,0] = 255
img[int(h/2):,:,2] = 255
# α値の設定 左端が0, 右端が253
x = np.tile(range(w), h).reshape(h, w)
img[:, :, 3] = (x / w * 255).astype(np.uint8)
cv2.imwrite('alpha1.png', img)
保存した画像をWindowsフォトで開いてみた。α値=0で透過となることが分かった。

αブレンド
出力画像をout, 前景をf, 背景をbとしてαブレンドの関数を作成した。
def alpha_blend(f, b):
out = np.zeros_like(f, dtype='float32')
out[:,:,3] = f[:,:,3] + (1-f[:,:,3])*b[:,:,3]
for c in range(3):
out[:,:,c] = np.where(out[:,:,3]==0, 0, (f[:,:,c]*f[:,:,3]+b[:,:,c]*(1-f[:,:,3])*b[:,:,3])/out[:,:,3])
return out
結果を確認するため、上下2色の画像を背景画像、緑一色の画像に中央を透過、画像端を不透過とするようにαチャンネルを設定した画像をブレンドしてみる。



単に重ねただけの出力結果となり、期待通りであった。
続いて、風景画像をブレンドしてみることにした。ほぼ同じ場所から秋と冬に撮影した2枚の画像をブレンドしてみる。画像1、画像2のα値を左右グラデーションさせてそれぞれ設定したものをブレンドしてみた。



合成したのが分からないような良い結果が得られた。ただし、画像1, 画像2が微妙にずれているので結果画像にうっすらと映ってしまっている。画像1と画像2の位置ずれを補正してからブレンドすることでさらなる精度向上が期待できると考えた。