如何使用带面膜的PIL膏?

Kon*_*ong 4 python numpy python-imaging-library

我正在尝试使用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)
Run Code Online (Sandbox Code Playgroud)

代码无需掩码即可运行.面具是一个numpy数组.我还没有看到带掩码的示例,文档也不清楚.

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

如果给出了掩码,则此方法仅更新掩码指示的区域.可以使用任一"1","L""RGBA"图像(在后一种情况下,α频带被用作掩模).掩码为255时,给定图像按原样复制.掩码为0时,保留当前值.中间值将两个图像混合在一起,包括它们的alpha通道.

我没有RGBA所以如何使用"1""L"

alk*_*asm 8

面具也必须是PIL Image.这在文档中没有明确提及,但它确实说明:

您可以使用"1","L"或"RGBA"图像(在后一种情况下,alpha波段用作蒙版).掩码为255时,给定图像按原样复制.掩码为0时,保留当前值.中间值将两个图像混合在一起,包括它们的alpha通道.

所以这暗示他们需要成为PIL Image.从Pillow概念页面:

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

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

那么解决方法是简单地你的面具变成一个PIL Image

mask = Image.fromarray(mask)
Run Code Online (Sandbox Code Playgroud)

但是,请注意,对于二进制掩码,PIL期望掩码在其中仅包含0和255(如上所述)(将混合之间的值).因此,如果你的面具是一个numpy bool类型,那么你想做的事情如下:

mask = Image.fromarray(np.uint8(255*mask))
Run Code Online (Sandbox Code Playgroud)

例如:

>>> 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)
Run Code Online (Sandbox Code Playgroud)

蒙面糊

在这里,我贴了白sub_imgimg左上角,而屏蔽掉了〜从粘贴操作的像素的70%,因此,只有约30%,在区域内的像素的居然出来为白色.