You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何提取图像轮廓并仅保留轮廓?求Python(如PIL)实现方案

基于PIL的图像轮廓提取解决方案

以下是完全基于Pillow(PIL)的实现方案,无需外部工具,适合Windows用户:

核心思路

通过灰度转换、边缘检测滤镜提取图像边缘,再处理透明度保留仅轮廓,可根据需求调整轮廓粗细和清晰度。

步骤1:安装依赖

先确保已安装Pillow:

pip install pillow

步骤2:完整代码实现

from PIL import Image, ImageFilter, ImageOps

# 加载你的目标PNG图像
img = Image.open("你的图像文件名.png").convert("RGBA")

# 转为灰度图,简化边缘检测的计算
gray_img = img.convert("L")

# 可选:阈值预处理,过滤杂色(根据图像调整threshold值,范围0-255)
threshold = 130
gray_img = gray_img.point(lambda x: 255 if x > threshold else 0, '1')

# 应用边缘检测滤镜:FIND_EDGES提取基础边缘,EDGE_ENHANCE_MORE可强化边缘
edges = gray_img.filter(ImageFilter.FIND_EDGES)

# 反转颜色:将深色边缘转为白色,浅色背景转为黑色
edges_inverted = ImageOps.invert(edges)

# 转为RGBA格式,准备设置透明背景
edges_rgba = edges_inverted.convert("RGBA")

# 处理透明度:将黑色背景设为完全透明,保留白色轮廓
pixel_data = edges_rgba.getdata()
new_pixels = []
for pixel in pixel_data:
    # 检测黑色像素(RGB均为0),设为透明
    if pixel[:3] == (0, 0, 0):
        new_pixels.append((0, 0, 0, 0))
    else:
        # 可修改此处改变轮廓颜色,比如改为红色(255, 0, 0, 255)
        new_pixels.append(pixel)

edges_rgba.putdata(new_pixels)

# 可选:膨胀滤镜加粗轮廓,参数3表示3x3的膨胀范围,数值越大轮廓越粗
edges_rgba = edges_rgba.filter(ImageFilter.MaxFilter(3))

# 保存最终轮廓图像
edges_rgba.save("提取的轮廓.png")

参数调整建议

  • 如果轮廓太细:增大MaxFilter的参数(比如改为5),或替换FIND_EDGES为EDGE_ENHANCE_MORE
  • 如果杂色太多:调整threshold阈值,数值越高过滤的杂色越多
  • 想要彩色轮廓:修改new_pixels.append(pixel)为指定颜色,比如new_pixels.append((255, 0, 0, 255))得到红色轮廓

内容的提问来源于stack exchange,提问作者Tony

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 14:00:15