如何提取图像轮廓并仅保留轮廓?求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
相关产品推荐
相关产品推荐

