使用 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.floodfill255 颜色填充周围的零 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: