После выполнения смешивания вы можете вернуть черных:
def change_background(img, color, recovery_color, intensity, recovery):
mask = np.ones_like(img) * color
blend = (1 - intensity) * img + intensity * mask
# Bring back the important bits (e.g. black from img).
# The closer the image is to the target color,
# the stronger our recovery_mask.
# You may need to tweak the formula.
recovery_mask = 1 - (img - recovery_color)**recovery
result = (1 - recovery_mask) * blend + recovery_mask * img
return result
Для использования:
yellow = np.array([1.0, 1.0, 0.0])
black = np.array([0.0, 0.0, 0.0])
img = change_background(
img,
color=yellow,
recovery_color=black,
intensity=0.2,
recovery=0.5
)
РЕДАКТИРОВАТЬ: Я думал о это немного, и другая идея состоит в том, чтобы просто использовать черно-белое изображение в качестве маски наложения:
def change_background(img, color, intensity):
mask = np.ones_like(img) * color
blend_mask = intensity * (1 - img[..., 0])
blend = (1 - blend_mask) * img + blend_mask * mask
return blend