【问题标题】:How to use PIL paste with mask?如何使用 PIL paste 和面膜?
【发布时间】:2018-05-30 16:18:47
【问题描述】:

我正在尝试使用 PIL paste() 函数。我也想戴上口罩,但一直收到此错误:

ValueError:具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()

canvases[0].paste(mnist_images[i],
                  box=tuple(map(lambda p: int(round(p)), positions[i])), mask=mask)

代码无需掩码即可工作。掩码是一个 numpy 数组。我没有看到一个带有面具的例子,文档也不清楚。

https://pillow.readthedocs.io/en/latest/reference/Image.html#PIL.Image.Image.paste

如果给定掩码,则此方法仅更新掩码指示的区域。您可以使用"1""L""RGBA" 图像(在后一种情况下,alpha 波段用作掩码)。如果掩码为 255,则原样复制给定图像。如果掩码为 0,则保留当前值。中间值会将两个图像混合在一起,包括它们的 Alpha 通道(如果有的话)。

我没有 RGBA,如何使用"1""L"

【问题讨论】:

  • “L”表示灰度(单通道)图像,“1”表示双层图像(即只有两个值)。有关图像模式的更多信息,请参阅Pillow concepts page

标签: python numpy python-imaging-library


【解决方案1】:

掩码也必须是 PIL Image。这没有明确提到in the docs,但它确实指出:

您可以使用“1”、“L”或“RGBA”图像(在后一种情况下,alpha 波段用作掩码)。如果掩码为 255,则原样复制给定图像。如果掩码为 0,则保留当前值。中间值会将两个图像混合在一起,包括它们的 Alpha 通道(如果有的话)。

所以这暗示他们需要是 PIL Images。来自Pillow concepts page

图像的模式定义了图像中像素的类型和深度 图片。当前版本支持以下标准模式:

1(1 位像素,黑白,每字节存储一个像素)
L(8 位像素,黑白)
...

然后解决方法是简单地将你的面具变成一个 PIL Image

mask = Image.fromarray(mask)

但是,请注意,对于二进制掩码,PIL 期望掩码内部只有 0 和 255,如上面所述(两者之间的值将混合)。因此,如果您的掩码是 numpy bool 类型,那么您需要执行以下操作:

mask = Image.fromarray(np.uint8(255*mask))

例如:

>>> import numpy as np
>>> import cv2
>>> from PIL import Image
>>> img = Image.fromarray(np.uint8(255*np.random.rand(400, 400, 3)))
>>> sub_img = Image.fromarray(np.uint8(255*np.ones((200, 200, 3))))
>>> mask = Image.fromarray(np.uint8(255*(np.random.rand(200, 200) > 0.7)))
>>> img.paste(sub_img, (0, 0), mask)

在这里,我在左上角的 img 上粘贴了白色的 sub_img,并从粘贴操作中屏蔽了大约 70% 的像素,因此该区域中只有大约 30% 的像素实际出现像白色一样。

【讨论】:

    猜你喜欢
    • 2022-07-27
    • 2010-10-19
    • 2016-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-12
    • 2020-02-09
    • 2020-11-19
    相关资源
    最近更新 更多