同じサイズではない2つの画像をアルファブレンドする必要があります。同じサイズにサイズ変更することで、それらを合成することができたので、ロジックの一部を取得しました。
import cv2 as cv
def combine_two_color_images_composited(foreground_image, background_image):
foreground = cv.resize(foreground_image, (400,400), interpolation=cv.INTER_CUBIC).copy()
background = cv.resize(background_image, (400,400), interpolation=cv.INTER_CUBIC).copy()
alpha =0.5
# do composite of foreground onto the background
cv.addWeighted(foreground, alpha, background, 1 - alpha, 0, background)
cv.imshow('composited image', background)
cv.waitKey(10000)
大きい方の画像と同じサイズのマスクを作って、それを最初の画像で使う必要があるのではないかと思います。もしそうなら、私はまだCV2でマスキングを行う方法を知りません....これは私のプロジェクトのほんの一部にすぎないので、マスキングがどのように機能するかを学ぶために多くの時間を費やすことができたものではありません。
私はあちこちを検索しましたが、私が見つけたコードは、画像を(並べて)一緒に「追加」するようなことをします。
2つの画像を組み合わせるには、numpyスライスを使用して、前景をブレンドする背景画像の部分を選択してから、新しくブレンドした部分を背景に再度挿入します。
def combine_two_color_images(image1, image2):
foreground, background = image1.copy(), image2.copy()
foreground_height = foreground.shape[0]
foreground_width = foreground.shape[1]
alpha =0.5
# do composite on the upper-left corner of background image.
blended_portion = cv.addWeighted(foreground,
alpha,
background[:foreground_height,:foreground_width,:],
1 - alpha,
0,
background)
background[:foreground_height,:foreground_width,:] = blended_portion
cv.imshow('composited image', background)
cv.waitKey(10000)
編集:前景を指定された場所に配置するには、以前と同じようにnumpyインデックスを使用します。Numpyインデックス作成は非常に強力であり、多くの場合に役立ちます。上記のドキュメントをリンクしました。本当に一見の価値があります。
def combine_two_color_images_with_anchor(image1, image2, anchor_y, anchor_x):
foreground, background = image1.copy(), image2.copy()
# Check if the foreground is inbound with the new coordinates and raise an error if out of bounds
background_height = background.shape[1]
background_width = background.shape[1]
foreground_height = foreground.shape[0]
foreground_width = foreground.shape[1]
if foreground_height+anchor_y > background_height or foreground_width+anchor_x > background_width:
raise ValueError("The foreground image exceeds the background boundaries at this location")
alpha =0.5
# do composite at specified location
start_y = anchor_y
start_x = anchor_x
end_y = anchor_y+foreground_height
end_x = anchor_x+foreground_width
blended_portion = cv.addWeighted(foreground,
alpha,
background[start_y:end_y, start_x:end_x,:],
1 - alpha,
0,
background)
background[start_y:end_y, start_x:end_x,:] = blended_portion
cv.imshow('composited image', background)
cv.waitKey(10000)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加