当前位置: 首页 > news >正文

python-自定义抠图

在 Python 中,实现“抠图”功能有多种方式。常用的方法包括:
1、基于颜色抠图(容易实现,适合背景比较纯色的图像)
2、基于语义分割/深度学习模型抠图(适用于复杂背景)
3、基于传统图像分割算法如GrabCut(效果较好,操作简单)

方法一:基于颜色抠图(适合纯色背景)

from PIL import Image
import numpy as np
img = Image.open('input.jpg').convert('RGBA')
arr = np.array(img)# 假设背景为白色(255,255,255)
r, g, b, a = arr[..., 0], arr[..., 1], arr[..., 2], arr[..., 3]
mask = (r > 240) & (g > 240) & (b > 240)  # 白色阈值可调整arr[mask, 3] = 0  # 白色背景设为透明
result = Image.fromarray(arr)
result.save('extract.png')

说明:
mask 用于选出接近白色的像素,把alpha通道设为0,即该处变透明。
适用于背景单一、与主体区分明显的图片。

方法二:使用GrabCut自动前景分割(适用于普通照片)
需要用到 OpenCV:

pip install opencv-python pillow numpy
import cv2
import numpy as np
from PIL import Imageinput_path = 'input.jpg'
img = cv2.imread(input_path)
mask = np.zeros(img.shape[:2], np.uint8)# 矩形框(左上x,左上y,宽,高)——可适当根据图片调整
rect = (50, 50, img.shape[1]-100, img.shape[0]-100)bgdModel = np.zeros((1, 65), np.float64)
fgdModel = np.zeros((1, 65), np.float64)# GrabCut分割
cv2.grabCut(img, mask, rect, bgdModel, fgdModel, 5, cv2.GC_INIT_WITH_RECT)
mask2 = np.where((mask==2)|(mask==0), 0, 1).astype('uint8')
img_cut = img * mask2[:, :, np.newaxis]# 转成PIL图片,添加透明通道
img_pil = Image.fromarray(cv2.cvtColor(img_cut, cv2.COLOR_BGR2RGBA))
data = np.array(img_pil)
alpha = np.any(data[..., :3] != [0,0,0], axis=-1) * 255
data[..., 3] = alpha
extract = Image.fromarray(data)
extract.save('grabcut_extract.png')

说明:
cv2.grabCut方法自带半自动抠图能力,初次使用可通过调整rect参数确定主体大致范围。
抠好后保留前景,背景都去掉或者变透明。

方法三:基于深度学习的自动抠图

pip install rembg pillow
from rembg import remove
from PIL import Imageinput_path = 'input.jpg'
output_path = 'rembg_extract.png'img = Image.open(input_path)
out = remove(img)
out.save(output_path)
http://www.dtcms.com/a/316688.html

相关文章:

  • 【分析学】内积空间中的线性算子
  • lumerical——多模干涉耦合器(MMI)
  • 机械学习--决策树(实战案例)
  • lumerical——Y分支功分器
  • Linux学习-数据结构(链表)
  • GISBox一键转换IFC到3DTiles
  • 【PCIE044】基于 JFM7VX690T 的全国产化 FPGA 开发套件
  • 分布式网关技术 + BGP EVPN,解锁真正的无缝漫游
  • 防火墙安全策略练习
  • PBX Feature Code(功能码)
  • 【DAB收音机】DAB系统架构介绍
  • mq_unlink系统调用及示例
  • 图像处理控件Aspose.Imaging教程:使用 C# 将 SVG 转换为 EMF
  • C++ 变量初始化方式总结 | 拷贝初始化 | 列表初始化 | 值初始化
  • 【PCB】3. 信号部分设计
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘keras’问题
  • Nginx入门:高性能Web服务器详解
  • 商用密码应用安全性评估(密评)实施指南:法律依据与核心要点解析
  • 神坛上的transformer
  • 如何测量滚珠花键的旋转方向间隙?
  • PYQT的QMessageBox使用示例
  • unity之 贴图很暗怎么办
  • Redis作为MySQL缓存的完整指南:从原理到实战
  • 《算法导论》第 4 章 - 分治策略
  • Nature Neuroscience | 如何在大规模自动化MRI分析中规避伪影陷阱?
  • 虚拟电场:能源互联网的隐形交响乐团
  • 基于SD地图增强无图车道线和拓扑推理
  • 【25-cv-23395】宠物/婴儿玩具品牌BESTSKY商标维权!
  • 面向对象编程基础:类的实例化与对象内存模型详解
  • Java基础面试题(1)—Java优势(JVM,JRE,JIT,Java类,方法)