由于两者具有相同的形状,因此可以使用掩模图像来屏蔽面部图像。我们首先需要对其执行二进制阈值处理,以便将其用作黑白掩模。然后,我们可以根据一个值是 0
还是 255
进行布尔索引,并分配一个新颜色,例如绿色?
import cv2
mask = cv2.imread('eBB2Q.jpg')
face = cv2.imread('luraB.jpg')
_, mask = cv2.threshold(mask, thresh=180, maxval=255, type=cv2.THRESH_BINARY)
# copy where we'll assign the new values
green_hair = np.copy(face)
# boolean indexing and assignment based on mask
green_hair[(mask==255).all(-1)] = [0,255,0]
fig, ax = plt.subplots(1,2,figsize=(12,6))
ax[0].imshow(cv2.cvtColor(face, cv2.COLOR_BGR2RGB))
ax[1].imshow(cv2.cvtColor(green_hair, cv2.COLOR_BGR2RGB))
现在,我们可以使用cv2.addWeighted
将新图像与原始图像结合起来,它将返回两个图像的加权和,因此我们只会在掩膜区域看到差异:
green_hair_w = cv2.addWeighted(green_hair, 0.3, face, 0.7, 0, green_hair)
fig, ax = plt.subplots(1,2,figsize=(12,6))
ax[0].imshow(cv2.cvtColor(face, cv2.COLOR_BGR2RGB))
ax[1].imshow(cv2.cvtColor(green_hair_w, cv2.COLOR_BGR2RGB))
请注意,您可以通过alpha
和beta
参数设置加权和中的权重,具体取决于您希望新颜色占主导地位的程度。请注意,如前所述,新图像将从加权和dst = src1*alpha + src2*beta + gamma
中获得。让我们尝试另一种颜色,并将权重设置为凸组合,其中alpha值范围从0.5
到0.9
:
green_hair = np.copy(face)
# boolean indexing and assignment based on mask
green_hair[(mask==255).all(-1)] = [0,0,255]
fig, axes = plt.subplots(2,2,figsize=(8,8))
for ax, alpha in zip(axes.flatten(), np.linspace(.6, .95, 4)):
green_hair_w = cv2.addWeighted(green_hair, 1-alpha, face, alpha, 0, green_hair_w)
ax.imshow(cv2.cvtColor(green_hair_w, cv2.COLOR_BGR2RGB))
ax.axis('off')