Heim >Backend-Entwicklung >Python-Tutorial >So überlagern Sie ein Bild mit einem bestimmten Teil eines anderen Bildes in opencv

So überlagern Sie ein Bild mit einem bestimmten Teil eines anderen Bildes in opencv

WBOY
WBOYnach vorne
2024-02-05 22:09:11483Durchsuche

So überlagern Sie ein Bild mit einem bestimmten Teil eines anderen Bildes in opencv

Frageninhalt

Ich habe das Bild unten und möchte ganz rechts im Bild einen schwarzen Fleck überlagern. Daher verändere ich die Größe beider Bilder im folgenden Code auf eine bestimmte Größe, erhalte nur den nicht weißen Teil der Überlagerung und füge ihn an bestimmten XY-Koordinaten ein, erhalte jedoch nicht das erwartete Ergebnis. Ich habe gesucht cv2.addweighted, aber keine Option zum Angeben der Option zur Verwendung der Koordinaten der Einfügeüberlagerung gefunden. Kann mir jemand helfen, wie ich das in cv2 implementieren kann?

vr_overlay = "/Users/templates/vertical_overlay.png"

show_image = "/Users/templates/image_3.png"

vr_overlay_co = (0, 0, 100, 412)
img_size = (0, 0, 440, 412)

img = cv2.imread(show_image)
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

v_overlay = cv2.imread(vr_overlay)

resize_v_overlay = cv2.resize(v_overlay, (vr_overlay_co[2], vr_overlay_co[3]))

plt.imshow(resize_v_overlay ,cmap='gray')
plt.axis('off')
plt.show()

resize_img = cv2.resize(img_rgb, (img_size[2], img_size[3]))

plt.imshow(resize_img ,cmap='gray')
plt.axis('off')
plt.show()
resize_img[vr_overlay_co[1]: vr_overlay_co[1] + 
           vr_overlay_co[3],vr_overlay_co[0]: vr_overlay_co[0] + 
           vr_overlay_co[2]] = np.where(resize_v_overlay != [0, 0, 0],
                                        resize_img[vr_overlay_co[1]: vr_overlay_co[1] 
                                                   + vr_overlay_co[3], vr_overlay_co[0]: 
                                                   vr_overlay_co[0] + vr_overlay_co[2],], resize_v_overlay)



plt.imshow(resize_img ,cmap='gray')
plt.axis('off')
plt.show()

Erwartete Ergebnisse:


Richtige Antwort


Dies ist eine Möglichkeit, dies in Python/OpenCV zu tun.

(Mir ist aufgefallen, dass das von Ihnen gepostete Bild nicht die von Ihnen angegebene Größe hat, insbesondere der Farbverlauf. Daher ist eine zusätzliche Verarbeitung erforderlich, um die Größe des Bildes anzupassen. Außerdem hat das Farbverlaufsbild einen weißen Rand, was Sie wahrscheinlich nicht wünschen.)

Geben Sie ein:

Verlauf (mit weißem Rand):

import cv2
import numpy as np

# read the image
img = cv2.imread('people.png')
hh, ww = img.shape[:2]

# read the small gradient
grad = cv2.imread('small_gradient.png')
hg, wg = grad.shape[:2]

# create white image the size of the image
# then insert gradient on right side while trimming off excess white from right side of gradient
ox = ww-wg+1
grad2 = np.full_like(img, (255,255,255))
grad2[0:hh, ox:ww-9+1] = grad[0:hg-1, 0:wg-9]

# blend the img with grad2 via multiply
#result = img.astype(np.float32) * grad2.astype(np.float32) / 255
#result = result.clip(0,255).astype(np.uint8)
#or
scale = 1/255
result = cv2.multiply(img, grad2, scale=scale)

# save results
cv2.imwrite('people_gradient.png', result)

# show results
cv2.imshow('result', result)
cv2.waitKey(0)

Das obige ist der detaillierte Inhalt vonSo überlagern Sie ein Bild mit einem bestimmten Teil eines anderen Bildes in opencv. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen