如何处理 Python 中的遮罩图像

How to handle mask images in Python

我有一些果园地面的图片,看起来像这样:

image1.png

image2.png

现在,我想从image1.png中提取一块栗子区域,然后把它放在image2.png上。

所以我用 Adob​​e Photoshop 制作了一个蒙版图像,结果(导出为 mask.png)如下所示: 可以看到选中的区域非常贴合栗子的边缘。

然而,当我用Python读取导出的蒙版图像时,所选区域不再适合边缘。这是一个看起来像这样的矩形:

result.png

这是我在读取图像并生成时所做的 result.png

import numpy as np 
from PIL import Image 
import matplotlib.pyplot as plt 

# read image1.png
image1 = np.array(Image.open('image1.png').convert('RGB'))
# read mask.png
mask = np.array(Image.open('mask.png').convert('RGB')) 

# Boolean indices representing the selected region
region = np.all(img != 255, axis=-1)
# "region" has a shape of (height, width)
# so we have to add an axis corresponding to color channels
region = np.dstack([region, region, region])

plt.imshow(np.where(region, image1, 255))                                                           
plt.axis('off')
plt.savefig('result.png', bbox_inches='tight')

是否有任何工具可以让我按原样使用蒙版图像(不像 result.png 但像 mask.png)?

您可以试试 OpenCV Python。从技术上讲,您的 mask.png 图像是 RGBA 彩色图像,其中 RGB 代表红-绿-蓝,A 代表透明度。当您使用 np.array(Image.open('mask.png').convert('RGB')) 时,您已将透明通道从图像中移除。

import numpy as np 
import cv2
import matplotlib.pyplot as plt 

mask = cv2.imread('mask.png', cv2.IMREAD_UNCHANGED)

cv2.imwrite('result.png',mask)