【发布时间】:2021-02-15 20:18:41
【问题描述】:
我想将图像 (jpg/jpeg) 的背景设为透明白色。
下面是我的代码,它将绿色背景转换为白色(正确识别人的边缘): Input image 到 Output image
def change_bg(img, bg=(255, 255, 255)):
# convert to hsv
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# threshold using inRange
range1 = (20, 80, 80)
range2 = (90, 255, 255)
mask = cv2.inRange(hsv, range1, range2)
mask = 255 - mask
# apply morphology opening to mask
kernel = np.ones((3, 3), np.uint8)
mask = cv2.morphologyEx(mask, cv2.MORPH_ERODE, kernel)
mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)
# antialias mask
mask = cv2.GaussianBlur(mask, (0, 0), sigmaX=3, sigmaY=3, borderType=cv2.BORDER_DEFAULT)
mask = skimage.exposure.rescale_intensity(mask, in_range=(127.5, 255), out_range=(0, 255))
result = img.copy()
result[mask == 0] = bg
return result
使用下面的代码,我将 jpeg 图像转换为 png,但我看到一些不透明的白色像素:Result image
def white_to_transe(image):
"""
@input: PIL image
@return:
"""
image = image.convert('RGBA')
# Transparency
newImage = []
for item in image.getdata():
if item[:3] == (255, 255, 255):
newImage.append((255, 255, 255, 0))
else:
newImage.append(item)
image.putdata(newImage)
print(image.mode, image.size)
return newImage
那么,如何获得干净的白色透明背景呢?
用下面更新white_to_transe后,它可以工作,但它会影响白色像素,比如白衬衫:
for item in image.getdata():
if item[0] > 240 and item[1] > 240 and item[2] > 240:
newImage.append((255, 255, 255, 0))
是否有可能,我们在change_bg 函数中添加透明而不是白色(全部 255)?
【问题讨论】:
标签: python-3.x opencv python-imaging-library