【问题标题】:How to change the colour of an image using a mask?如何使用蒙版更改图像的颜色?
【发布时间】:2020-11-03 14:19:45
【问题描述】:

我正在编写一个代码来改变一个人面部照片中头发的颜色。这样做我做了一个模型,并且能够得到头发部分的面具。但是现在我遇到了一个问题,如何改变它的颜色。

下面是传递的输出掩码和输入图像。

你能建议我用什么方法把头发的颜色变成不同的颜色吗?

【问题讨论】:

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


    【解决方案1】:

    由于它们具有相同的形状,您可以使用蒙版图像来蒙版面部图像。我们首先需要对其进行二进制阈值处理,以便将其用作黑白蒙版。然后我们可以根据一个值是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))
    

    请注意,您可以通过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')
    

    【讨论】:

    • 嗯...时尚!
    • 我相信 OP 想要改变她头发的颜色,而不是移除它并在其位置放置一个绿色背景。您应该能够通过将颜色与她的头发相结合将头发染成绿色。您可以使用 cv2.addWeighted 来完成。
    • 是的,想了想,更新了。尽管鉴于当前的面具@Tyson,限制很明显
    • 哇,看起来不错!比我预期的要好得多。另一个想法可能是将她的头发转换为 HSV 颜色空间,稍微改变色调,然后将其转换回 BGR,然后再将其遮盖。这可能会改善她头发的深色区域,使其不会变得过于明亮的绿色。跨度>
    • 这听起来是个好主意。当我有更多时间时会试一试:) 再次感谢@Tyson
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 2021-12-26
    • 2016-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多