如何处理 Python 中的遮罩图像
How to handle mask images in Python
我有一些果园地面的图片,看起来像这样:
image1.png
image2.png
现在,我想从image1.png
中提取一块栗子区域,然后把它放在image2.png
上。
所以我用 Adobe 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)
我有一些果园地面的图片,看起来像这样:
image1.png
image2.png
现在,我想从image1.png
中提取一块栗子区域,然后把它放在image2.png
上。
所以我用 Adobe 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)