首页 > 解决方案 > Python图像遮罩和去除背景

问题描述

我有两个图像:太阳穴和面具(心脏)。我想用心形遮住寺庙,去掉黑色背景。结果应该是从镜腿上切下的心形切口,背景为白色或透明。

背景

白心

标签: pythonimage-processingmaskmasking

解决方案


您可以使用pillowputalpha将灰度图像 (L​​ ) 作为通道添加到 RGB 图像alpha- 因此它将具有透明背景。但是两个图像必须是相同的大小。

from PIL import Image

# load images
img_org  = Image.open('temple.jpg')
img_mask = Image.open('heart.jpg')

# convert images
#img_org  = img_org.convert('RGB') # or 'RGBA'
img_mask = img_mask.convert('L')    # grayscale

# the same size
img_org  = img_org.resize((400,400))
img_mask = img_mask.resize((400,400))

# add alpha channel    
img_org.putalpha(img_mask)

# save as png which keeps alpha channel 
img_org.save('output-pillow.png')

在此处输入图像描述


顺便提一句:

您可以使用其他功能pillow仅调整蒙版大小并保持心脏的原始比例。

黑色给全透明,白色保持原色,但你也可以灰色使像素半透明。


编辑:

cv2

import cv2

# load images
img_org  = cv2.imread('temple.jpg')
img_mask = cv2.imread('heart.jpg')

# convert colors
#img_org  = cv2.cvtColor(img_org, ???)
img_mask = cv2.cvtColor(img_mask, cv2.COLOR_BGR2GRAY)

# the same size
img_org  = cv2.resize(img_org,  (400,400))
img_mask = cv2.resize(img_mask, (400,400))

# add alpha channel 
b, g, r = cv2.split(img_org)
img_output = cv2.merge([b, g, r, img_mask], 4)

# write as png which keeps alpha channel 
cv2.imwrite('output-cv2.png', img_output)

顺便说一句: cv2使用BGRogRGB


推荐阅读