2022年5月6日金曜日

【OpenCV】画像のアルファブレンド

 アルファブレンドは2つ(以上)の画像を係数を用いて合成する方法。画像処理ライブラリOpenCVaddWeightedによるアルファブレンドおよびndarrayの和によるアルファブレンドについて説明する。


OpenCVを使うには次のようにインポートが必要。
import cv2

例に用いる画像'buiding.jpg', 'girl.jpg'(幅450x高さ300ピクセル)は以下を使用(フリー写真素材ぱくたそより)

'buiding.jpg'



'girl.jpg'





1. addWeightedによるアルファブレンド

 addWeightedは2つの画像を係数をかけて合成する。合成する画像のサイズは同じでないといけない。
書式は以下。

cv.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]] ) -> dst

src1src2が合成する2つの画像。下式のようにalphasrc1に対する係数、betasrc2に対する係数、gammaはオフセットとなる。

dst = src1*alpha + src2*beta + gamma

 カラー画像のように複数のチャンネルがある場合は、各チャンネルごとに合成される。また、画素値の上限255を超えた場合は255となり飽和(白飛び)する。


alpha:0.5beta:0.5gamma:0として画像を合成する例

import cv2

src1 = cv2.imread('building.jpg')
src2 = cv2.imread('girl.jpg')

blend = cv2.addWeighted(src1, 0.5, src2, 0.5, 0)	

cv2.imwrite('blend.jpg', blend)



alpha:0.2beta:0.2gamma:150として画像を合成する例

import cv2

src1 = cv2.imread('building.jpg')
src2 = cv2.imread('girl.jpg')

blend = cv2.addWeighted(src1, 0.25, src2, 0.25, 150)	

cv2.imwrite('blend.jpg', blend)



2. ndarrayの和によるアルファブレンド

 OpenCVの画像はnumpy.ndarrayなので演算による合成が可能。addWeightedalpha:0.2beta:0.2gamma:150と同じ処理をする例。addWeightedと同じ結果が得られる。

import cv2

src1 = cv2.imread('building.jpg')
src2 = cv2.imread('girl.jpg')

blend = src1*0.25 + src2*0.25 + 150	

cv2.imwrite('blend.jpg', blend)



 addWeightedで合成できるのは2つの画像だがnumpy.ndarrayの演算では合成する画像の数に制限はない。
さらに3つ目の画像'mountain.jpg'を合成する例。

'mountain.jpg' (幅450x高さ300ピクセル)は以下を使用(フリー写真素材ぱくたそより)



import cv2

src1 = cv2.imread('building.jpg')
src2 = cv2.imread('girl.jpg')
src3 = cv2.imread('mountain.jpg')

blend = src1*0.3 + src2*0.3 + src3*0.3	

cv2.imwrite('blend3.jpg', blend)




3. リファレンス

OpenCV > Operations on arrays > addWeighted()

使用したバージョン:Python 3.10.4 / OpenCV 4.5.5

0 件のコメント:

コメントを投稿