TL; DR
Dies ist der Code zum Überlagern von png_image.png
(Bild mit Alphakanal) oben links von bg.jpg
.
import cv2
frame = cv2.imread("bg.jpg ")
png_image = cv2.imread("alpha.png ", cv2.IMREAD_UNCHANGED) #Lesen Sie mit Alpha-Kanal enthalten
#Festlegen der Einfügezielkoordinaten. Vorerst oben links
x1, y1, x2, y2 = 0, 0, png_image.shape[1], png_image.shape[0]
#Synthetik!
frame[y1:y2, x1:x2] = frame[y1:y2, x1:x2] * (1 - png_image[:, :, 3:] / 255) + \
png_image[:, :, :3] * (png_image[:, :, 3:] / 255)
Die PNG-Datei enthält Daten, die die Transparenz jedes Pixels darstellen, das als "Alpha-Kanal" bezeichnet wird. Der Wertebereich liegt zwischen 0 und 255, was RGB entspricht. Ein Wert von 255 ist zu 100% gültig und ein Wert von 0 ist zu 0% (vollständig transparent).
png_image = cv2.imread("alpha.png ", cv2.IMREAD_UNCHANGED) #Lesen Sie mit Alpha-Kanal enthalten
In normalem "cv2.imread ()" wird es in Form von "numpy.ndarray" von "[h, w, 3]" vorliegen, aber mit "cv2.IMREAD_UNCHANGED" wird "cv2.imread ()" angegeben. Wenn es aufgerufen wird, hat es die Form "[h, w, 4]". BGR
ist BGRA
und endet mit einem Alpha-Kanal.
Kombinieren Sie das Bild nach dem Laden. Es kann jedoch durch den normalen Matrixbetrieb von NuPy synthetisiert werden. Wir ordnen das ursprüngliche Hintergrundbild und das zu zeichnende Bild den numerischen Werten des Alphakanals zu und addieren sie.
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:]
ist das Abrufen des Alphakanals. Der Alpha-Kanalbereich liegt zwischen 0 und 255. Teilen Sie ihn durch 255, um ein Verhältnis von 0 bis 1 zu erhalten. Sie können das endgültige Bild erhalten, indem Sie das zu zeichnende Bild mit dem berechneten Verhältnis multiplizieren, den Hintergrund mit dem "Rest" des Verhältnisses multiplizieren und addieren.
Übrigens, wenn Sie png_image [:,:, 3]
schreiben, werden Sie wütend, wenn die Größe der Matrix nicht übereinstimmt (ich habe einen Fehler gemacht).
bg.jpg
alpha.png
Das Ergebnis von cv2.imwrite (" result.jpg ", frame)
Obwohl es verschiedene nützliche Websites gibt, konnte ich den richtigen Code nicht finden und habe einen Artikel verfasst. (Vielleicht ist es zu offensichtlich, es stattdessen zu schreiben)
Für das Bild habe ich das Material von Cute Free Material Collection Irasutoya verwendet.
Recommended Posts