私はまったく同じ寸法の2つの画像を持っています。私がしようとしているのは、次のように、1つを取り、50%透明にし、もう一方の上に直接配置することです。
import Image
background = Image.open("bg.png")
overlay = Image.open("over.png")
background = background.convert("RGBA")
overlay = overlay.convert("RGBA")
background_pixels = background.load()
overlay_pixels = overlay.load()
for y in xrange(overlay.size[1]):
for x in xrange(overlay.size[0]):
background_pixels[x,y] = (background_pixels[x,y][0], background_pixels[x,y][1], background_pixels[x,y][2], 255)
for y in xrange(overlay.size[1]):
for x in xrange(overlay.size[0]):
overlay_pixels[x,y] = (overlay_pixels[x,y][0], overlay_pixels[x,y][1], overlay_pixels[x,y][2], 128)
background.paste(overlay)
background.save("new.png","PNG")
しかし、私が得るのは50%の透明なオーバーレイだけです(そのため、途中までです!)。
Paste()の代わりに blend() を使用してみてください。paste()は、元の画像を貼り付けているものに置き換えるだけのようです。
import Image
background = Image.open("bg.png")
overlay = Image.open("ol.jpg")
background = background.convert("RGBA")
overlay = overlay.convert("RGBA")
new_img = Image.blend(background, overlay, 0.5)
new_img.save("new.png","PNG")
おそらく古すぎる質問です。opencv
を使用して簡単に行うことができます
cv2.addWeighted(img1, alpha, img2, beta, gamma)
#setting alpha=1, beta=1, gamma=0 gives direct overlay of two images
オーバーレイアルファマスクパラメーターを指定し、これが期待した結果をもたらすかどうかを確認します。
background.paste(overlay, overlay.size, overlay)
スクリプト here はまた、blendを使用してタスクを実行します。また、現在の画像でない場合に画像を同じサイズにするために画像のサイズを変更する機能も備えています。
それらを同じ形状にサイズ変更したい場合:
b_h, b_w, b_ch = background.shape
W = 800
imgScale = W/b_w
new_b_h,new_b_w = int(b_h*imgScale), int(b_w*imgScale)
new_background = cv2.resize(background,(new_b_w, new_b_h))
次に、背景と前景の両方に適合する形状を入力できます。
square= np.zeros((new_b_h, new_b_w, b_ch), np.uint8)
square.fill(255)
x= new_b_w
y= new_b_h
offset =0
square[int(y - new_b_h) - offset:int(y)- offset, int(x-new_b_w)- offset:int(x)- offset] = new_background
これでオーバーレイできます:
OPACITY = 0.7
added_image = cv2.addWeighted(new_background,OPACITY,square, 1-OPACITY, 0)
詳細は github にあります