cv2. 画像の合成1

画像の合成は2つの画像を用意して足す。cv2.add が基本的な関数です。

cv2.multiple()も3つ目で使います。

3パターン説明します。

・画像+画像
・画像+定数
・画素の位置に応じてグラデーションを付けた足し算(αブレンディングなど)

今回、元にした画像は以下の2つ、c:/temp/tes1.bmp、c:/temp/tes2.bmp として用意しました。

1:画像+画像

同じサイズの画像を2個用意して足します。

import cv2

img1=cv2.imread('c:/temp/tes1.bmp')
img2=cv2.imread('c:/temp/tes2.bmp')

imo=cv2.add(img1,img2)
cv2.imwrite('c:/temp/add.bmp',imo)
cv2.imshow('add',imo)

cv2.waitKey(0)
cv2.destroyAllWindows()

↓こちらが結果の画像

2:画像+数値

全面にベタで単色を足します。RGB値をそれだけ上げます例えばこの例はRGB=(128,128,0)でグリーンを足した場合の例です。

import cv2
import numpy as np
img1=cv2.imread('c:/temp/tes1.bmp')

height=img1.shape[0] #画像の高さを知る
width=img1.shape[1]   #画像の幅を知る

beta=np.zeros((height,width,3),np.uint8)
beta[:,:]=[128,128,0]  #べた緑の絵を造る

#足す
imo=cv2.add(img1,beta)
cv2.imwrite('c:/temp/addScalar.bmp',imo)
cv2.imshow('addScalar',imo)

cv2.waitKey(0)
cv2.destroyAllWindows()

↓こちらが結果の画像

3:画素の位置に応じてグラデーションを付けた足し算(αブレンディングなど)

今回の例では重みづけ関数を作りました。重みづけ関数を作っ

import cv2
import math
import numpy as np
def create_filter(rows,cols):
    weight=np.zeros((rows,cols,3),np.float32)
    center=(rows/2,cols/2)#これはリスト??タプル?
    radius=math.sqrt(center[0]**2+center[1]**2)

    for r in range(rows):
        for c in range(cols):
            #中心からの距離
            distance=math.sqrt((center[0]-r)**2+(center[1]-c)**2)

            radian=distance/radius

            Y=1.0-radian

            weight[r,c]=[Y,Y,Y]
    return weight

img1=cv2.imread('c:/temp/tes1.bmp').astype(np.float32)/255
img2=cv2.imread('c:/temp/tes2.bmp').astype(np.float32)/255

rows,cols=img1.shape[:2]

weight=create_filter(rows,cols)#ネガポジフィルタを造る
i_weight=1.0-weight

img1n=cv2.multiply(img1,weight)#ネガポジフィルタをそれぞれにかける
img2n=cv2.multiply(img2,i_weight)

imo=cv2.add(img1n,img2n)

cv2.imwrite('c:/temp/img1n.bmp',img1n)
cv2.imshow('img1n',img1n)

cv2.imwrite('c:/temp/img2n.bmp',img2n)
cv2.imshow('img2n',img2n)

cv2.imwrite('c:/temp/imo.bmp',imo)
cv2.imshow('add',imo)

cv2.waitKey(0)
cv2.destroyAllWindows()

左から、フィルタとかけたImg1、Img2、足した場合の画像

このように、重み関数(Filter)を特定のルールで作って、それと掛け合わせてから足すことで、どのような重みづけをした足し算もできます。これでαブレンディングもできます。

αブレンディングはそのまま画素に係数を変えながらかけて足す方法もありますが、フィルタが用意されていてcv2の関数で計算するので、動画などで使う場合、今回の手法のほうが計算が早くなります。

Pythonで始めるOpenCV 4プログラミング [ 北山直洋 ]

価格:3,630円
(2023/6/21 00:18時点)
感想(0件)

Learn OpenCV 4.5 with Python 3.7 by Examples Implement Computer Vision Algorithms Provided by OpenCV with Python for Image Processing, Object Detection and Machine Learning【電子書籍】[ James Chen ]

価格:2,280円
(2023/6/21 00:20時点)
感想(0件)

コメント

タイトルとURLをコピーしました