Если нужно заменить прямоугольник пикселей, то это делается тривиально:
img1[top1:bottom1, left1:right1] = img2[top2:bottom2, left2:right2]
Единственное требование - прямоугольники должны иметь одинаковый размер.
Как следствие, если вторая картинка может заезжать за край первой, то задача усложняется.
Если же нужно работать с альфа-каналом, то для начала его неплохо бы прочитать.
image = cv2.imread('image.png', cv2.IMREAD_UNCHANGED)
UNCHANGED не преобразует в BGR, а грузит как есть, в том числе альфа канал.
И тогда нужно будет сделать что-то типа
mask = image[..., 3] > 0 # если считаем, что чем меньше - тем прозрачнее
background[top:bottom, left:right][mask] = image[mask] # не забываем про равенство размера!