TL; DR
Ceci est le code pour superposer png_image.png
(image avec canal alpha) en haut à gauche de bg.jpg
.
import cv2
frame = cv2.imread("bg.jpg ")
png_image = cv2.imread("alpha.png ", cv2.IMREAD_UNCHANGED) #Lire avec canal alpha inclus
#Définition des coordonnées de destination du collage. Pour le moment, en haut à gauche
x1, y1, x2, y2 = 0, 0, png_image.shape[1], png_image.shape[0]
#Synthétique!
frame[y1:y2, x1:x2] = frame[y1:y2, x1:x2] * (1 - png_image[:, :, 3:] / 255) + \
png_image[:, :, :3] * (png_image[:, :, 3:] / 255)
Le fichier PNG contient des données qui représentent la transparence de chaque pixel appelé «canal alpha». La plage de valeurs est comprise entre 0 et 255, ce qui est identique à RVB. Une valeur de 255 est valide à 100% et une valeur de 0 est de 0% (entièrement transparent).
png_image = cv2.imread("alpha.png ", cv2.IMREAD_UNCHANGED) #Lire avec canal alpha inclus
Dans cv2.imread ()
normal, ce sera sous la forme de numpy.ndarray
de [h, w, 3]
, mais avec cv2.IMREAD_UNCHANGED
, cv2.imread ()
est spécifié. Lorsqu'il est appelé, il sera sous la forme «[h, w, 4]». «BGR» est «BGRA» et se termine par un canal alpha.
Après avoir chargé l'image, combinez-la. Cependant, il peut être synthétisé par le fonctionnement normal de la matrice de NuPy. Ce que nous faisons est d'allouer l'image de fond d'origine et l'image à dessiner par les valeurs numériques du canal alpha et de les ajouter ensemble.
frame[y1:y2, x1:x2] = frame[y1:y2, x1:x2] * (1 - png_image[:, :, 3:] / 255) + \
png_image[:, :, :3] * (png_image[:, :, 3:] / 255)
png_image [:,:, 3:]
est la récupération du canal alpha. La plage du canal alpha est de 0 à 255, divisez donc par 255 pour obtenir un rapport de 0 à 1. Vous pouvez obtenir l'image finale en multipliant l'image à dessiner par le rapport calculé, en multipliant l'arrière-plan par le «restant» du rapport et en les additionnant.
Au fait, si vous écrivez png_image [:,:, 3]
, vous vous fâcherez si la taille de la matrice ne correspond pas (j'ai fait une erreur).
bg.jpg
alpha.png
Le résultat de cv2.imwrite (" result.jpg ", frame)
Bien qu'il existe divers sites utiles, je n'ai pas trouvé le code qui convenait, alors j'ai fait un article. (C'est peut-être trop évident de l'écrire à la place)
Pour l'image, j'ai utilisé le matériel de Cute Free Material Collection Irasutoya.