使用 Python PIL 从徽标中删除边框
Remove border from Logo using Python PIL
您好,我想使用 python 的枕头库从该徽标中删除白色边框。我想到的唯一方法是从图像中提取所有白色,但是这也去除了马的白眼,这是我想保留的东西。
我有什么。
https://i.stack.imgur.com/DX2LE.png
我想要的。
https://i.stack.imgur.com/IPVqi.png
这不是一项艰巨的任务,但我需要为很多徽标执行此操作,因此我希望以自动化的方式执行此操作。这是一些从源中提取图像的代码。感谢任何人可以提供的任何帮助。
from PIL import Image
import pandas as pd
import requests
filename = "https://a.espncdn.com/combiner/i?img=/i/teamlogos/ncaa/500/68.png"
image = Image.open(requests.get(filename, stream=True).raw)
我更喜欢使用 OpenCV,但我们可以使用 PIL。
- 使用 here
中的示例将白色替换为透明度
- 获取 alpha 通道。
使用 ImageDraw.floodfill 用 255
颜色填充周围的零 alpha。
(只有眼睛保持黑色)。
- 反转 alpha - 使眼睛变成白色而不是黑色。
- 将白眼贴在带有“透明白”的图像上。
代码示例(读取本地图片):
from PIL import Image, ImageDraw, ImageOps
import numpy as np
#
def white_to_transparency(img):
x = np.asarray(img.convert('RGBA')).copy()
x[:, :, 3] &= (255 * (x[:, :, :3] != 255).any(axis=2)).astype(np.uint8) # Small modification: &= is used instead of = (in the original code).
return Image.fromarray(x)
filename = "68.png"
image = Image.open(filename)
im_white_transparent = white_to_transparency(image)
#
# Extract alpha channel as new Image
alpha = im_white_transparent.getchannel('A')
#
# Fill alpha channel with 255, only the inner part stays 0
ImageDraw.floodfill(alpha, xy=(0, 0), value=255, thresh=200)
mask = ImageOps.invert(alpha) # Invert alpha - make the eye white instead of black
im_white_transparent.paste(image, (0, 0), mask) # Paste the white eye on the image with "transparent white".
# Show images for testing
im_white_transparent.show()
alpha.show()
mask.show()
结果:
im_white_transparent
:
(更改为暗模式以查看透明背景):
具有与棋盘图案透明度相同的结果:
mask
:
您好,我想使用 python 的枕头库从该徽标中删除白色边框。我想到的唯一方法是从图像中提取所有白色,但是这也去除了马的白眼,这是我想保留的东西。
我有什么。 https://i.stack.imgur.com/DX2LE.png
我想要的。 https://i.stack.imgur.com/IPVqi.png
这不是一项艰巨的任务,但我需要为很多徽标执行此操作,因此我希望以自动化的方式执行此操作。这是一些从源中提取图像的代码。感谢任何人可以提供的任何帮助。
from PIL import Image
import pandas as pd
import requests
filename = "https://a.espncdn.com/combiner/i?img=/i/teamlogos/ncaa/500/68.png"
image = Image.open(requests.get(filename, stream=True).raw)
我更喜欢使用 OpenCV,但我们可以使用 PIL。
- 使用 here 中的示例将白色替换为透明度
- 获取 alpha 通道。
使用 ImageDraw.floodfill 用255
颜色填充周围的零 alpha。
(只有眼睛保持黑色)。 - 反转 alpha - 使眼睛变成白色而不是黑色。
- 将白眼贴在带有“透明白”的图像上。
代码示例(读取本地图片):
from PIL import Image, ImageDraw, ImageOps
import numpy as np
#
def white_to_transparency(img):
x = np.asarray(img.convert('RGBA')).copy()
x[:, :, 3] &= (255 * (x[:, :, :3] != 255).any(axis=2)).astype(np.uint8) # Small modification: &= is used instead of = (in the original code).
return Image.fromarray(x)
filename = "68.png"
image = Image.open(filename)
im_white_transparent = white_to_transparency(image)
#
# Extract alpha channel as new Image
alpha = im_white_transparent.getchannel('A')
#
# Fill alpha channel with 255, only the inner part stays 0
ImageDraw.floodfill(alpha, xy=(0, 0), value=255, thresh=200)
mask = ImageOps.invert(alpha) # Invert alpha - make the eye white instead of black
im_white_transparent.paste(image, (0, 0), mask) # Paste the white eye on the image with "transparent white".
# Show images for testing
im_white_transparent.show()
alpha.show()
mask.show()
结果:
im_white_transparent
:
(更改为暗模式以查看透明背景):
具有与棋盘图案透明度相同的结果:
mask
: