Home  >  Article  >  Backend Development  >  How to overlay an image to a specific part of another image in opencv

How to overlay an image to a specific part of another image in opencv

WBOY
WBOYforward
2024-02-05 22:09:11396browse

How to overlay an image to a specific part of another image in opencv

Question content

I have the image below and I want to overlay a black patch on the far right side of the image. So I am resizing both images to a specific size in the code below and getting only the non-white part of the overlay and pasting it at specific x,y coordinates but not getting the expected result. I looked at cv2.addweighted but didn't find any option to specify the option to use the coordinates of the paste overlay. Can anyone guide me on how to implement this in cv2?

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()

Expected results:


Correct answer


Here is one way to do this in python/opencv.

(I noticed that the image you posted is not the dimensions you stated, especially the gradient. So additional processing is required to match the dimensions of the image. Also the gradient image has a white border, which I suspect you want. )

enter:

Gradient (with white border):

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)

The above is the detailed content of How to overlay an image to a specific part of another image in opencv. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete