如何使用opencv或PIL用原始目标图像颜色对图像遮罩的部分着色?

2024-05-16 22:55:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要帮助创建一个遮罩的图像,其中部分图像是黑色由于遮罩,但有些部分仍然保留图像的原始颜色。想象一下,一个暴徒戴着滑雪面罩,眼睛和嘴巴的一部分是暴徒的皮肤,而脸的其余部分则被滑雪面罩覆盖。 example

基本上我想要的是眉毛,眼睛和嘴唇部分应该保留原来的形象,但其余的面具保持白色,如上图。 到目前为止,通过使用PIL,我已经成功地创建了一个面具,并填写了黑色的“眼睛”部分的内部

def getmask(img,jawline,eyebrows,eyes,mouth):
    img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
    imArray = np.asarray(img)
    # create mask
    polygon = jawline.flatten().tolist()
    maskIm = Image.new('L', (imArray.shape[1], imArray.shape[0]), 0)
    ImageDraw.Draw(maskIm).polygon(polygon, outline=1, fill='white')
    #ImageDraw.Draw(maskIm).polygon(polygon, outline=(1))
    # draw eyes
    righteyes=eyes[0:6].flatten().tolist()
    ImageDraw.Draw(maskIm).polygon(righteyes, outline=1,fill='black')
    lefteyes=eyes[6:].flatten().tolist()
    ImageDraw.Draw(maskIm).polygon(lefteyes, outline=1,fill='black')
    mask = np.array(maskIm)
    # draw eyebrows
    rightbrows=eyebrows[0:6].flatten().tolist()
    ImageDraw.Draw(maskIm).polygon(rightbrows, outline=2, fill='black')
    leftbrows=eyebrows[6:].flatten().tolist()
    ImageDraw.Draw(maskIm).polygon(leftbrows, outline=2, fill='black')
    # draw mouth
    mouth=mouth.flatten().tolist()
    ImageDraw.Draw(maskIm).polygon(mouth, outline=1, fill='black')

    mask = np.array(maskIm)
    return mask

那些下颚线,眉毛,眼睛,嘴巴包含了(x,y)坐标为脸的相关部分,我只需要保留眉毛,眼睛和嘴巴部分的颜色。希望有人能帮我解决


Tags: imgmaskfillblack眼睛draweyespolygon
1条回答
网友
1楼 · 发布于 2024-05-16 22:55:32

如果你有一个遮罩,你想保留的区域是白色的,那么你只需在原始图像上用它做一个bitwise_or。你知道吗

在你的情况下,我们必须反转掩模,使背景是黑色的,投资回报率是白色的。你知道吗

mask = cv2.bitwise_not(mask)
masked = cv2.bitwise_or(image, image, mask=mask)

下面是一个输出示例:
masked image
对于他的脸的其余部分是黑色的,你只需要在面具中将ROI之外的所有值设置为黑色。一种方法是使用
提供的坐标 np.where(mask != 0)

示例代码:
https://colab.research.google.com/drive/1vCMhgDXmuFMJpxChuLN6TDEqgXi7V8CT

相关问题 更多 >