python - 如何使用 mask 更改图像的颜色?

标签 python python-3.x opencv computer-vision opencv3.0

我正在编写一个代码来改变一个人面部图片中头发的颜色。这样做我做了一个模型,并且能够得到头发部分的面具。但是现在我遇到了如何改变它的颜色的问题。
下面是传递的输出掩码和输入图像。
enter image description here enter image description here
你能告诉我可以用来把头发的颜色变成不同颜色的方法吗?

最佳答案

由于它们都具有相同的形状,因此您可以使用 mask 图像 mask 脸部图像。我们首先需要对其进行二进制阈值处理,因此可以将其用作黑白掩码。然后我们可以根据一个值是 0 还是 255 进行 bool 索引,并分配一个新的颜色,比如绿色?

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))
enter image description here
现在我们可以使用 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))
enter image description here
请注意,您可以通过 alphabeta 参数设置加权总和中的权重,具体取决于您希望新颜色占主导地位的程度。请注意,如前所述,新图像将从加权和 dst = src1*alpha + src2*beta + gamma 中获得。让我们尝试使用另一种颜色并将权重设置为凸组合,alpha 值范围从 0.50.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')
enter image description here

关于python - 如何使用 mask 更改图像的颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62891917/

相关文章:

python - 如何使用 webdriver 获取文本区域的文本内容?

Python Pandas 索引错误 : List Index out of range

python - 为键 : value from two dimension list 创建字典

python - 如何使用drawcontours为给定坐标绘制徒手线?

python - 如何使用 tkinter 在 python 中嵌入 python 解释器框架?

python - Python 中 `os.chmod` 的异步版本

Python:在没有输入被分解的情况下打印行

python - 如何在 Python 中输入提示某种数据类型的(任意)集合?

python - 使用cv2.imread的屏幕截图和语法错误

c++ - OpenCV - 错误