J'essaie de fusionner deux images RGBA (avec une forme de (h,w,4)), en tenant compte de leurs canaux alpha.
Exemple :
Ce que j'ai essayé
J'ai essayé de le faire en utilisant opencv pour cela, mais j'obtiens des pixels étranges sur l'image de sortie.
Images utilisées :
y
import cv2
import numpy as np
import matplotlib.pyplot as plt
image1 = cv2.imread("image1.png", cv2.IMREAD_UNCHANGED)
image2 = cv2.imread("image2.png", cv2.IMREAD_UNCHANGED)
mask1 = image1[:,:,3]
mask2 = image2[:,:,3]
mask2_inv = cv2.bitwise_not(mask2)
mask2_bgra = cv2.cvtColor(mask2, cv2.COLOR_GRAY2BGRA)
mask2_inv_bgra = cv2.cvtColor(mask2_inv, cv2.COLOR_GRAY2BGRA)
# output = image2*mask2_bgra + image1
output = cv2.bitwise_or(cv2.bitwise_and(image2, mask2_bgra), cv2.bitwise_and(image1, mask2_inv_bgra))
output[:,:,3] = cv2.bitwise_or(mask1, mask2)
plt.figure(figsize=(12,12))
plt.imshow(cv2.cvtColor(output, cv2.COLOR_BGRA2RGBA))
plt.axis('off')
Ce que j'ai compris, c'est que j'ai ces pixels bizarres parce que j'ai utilisé cv2.bitwise_and (qui fonctionne parfaitement avec les canaux alpha binaires). J'ai essayé d'utiliser différentes approches
Question
Existe-t-il une approche pour faire cela (tout en gardant l'image de sortie comme une image 8bit).