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

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.xdnf.cn/news/17082.html

相关文章:

  • OpenSpeedy绿色免费版下载,提升下载速度,网盘下载速度等游戏变速工具
  • Datawhale AI夏令营 第三期 task2 稍微改进
  • MyBatis实现SQL
  • Python日志记录库——logaid
  • Centos-Stream 10 安装教程(2025版图文教程)
  • ASP3605I同步降压调节器的高频化设计与多相扩展技术优化方案
  • Python 函数详解
  • 重生之我在暑假学习微服务第十天《网关篇》
  • 微软Dragon Ambient eXperience (DAX) 深度解析
  • 《UE教程》第一章第六回——迁移独立项目(资源)
  • 【学习嵌入式day-17-数据结构-单向链表/双向链表】
  • 【计算机网络】6应用层
  • 深度学习·基础知识
  • selenium自动化收集资料
  • 从汇编角度揭秘C++构造函数(1)
  • 【深度学习新浪潮】混元3D是什么产品?
  • 2025《艾诺提亚失落之歌》逆向工程解包尝试
  • 【模电笔记】—— 直流稳压电源——整流、滤波电路
  • 二叉树——堆及其实现
  • 防御保护07-08
  • 三种灰狼算法求解无人机三维路径规划【MATLAB实现】
  • Android AppSearch 深度解析:现代应用搜索架构与实践
  • 论文阅读笔记:《Curriculum Coarse-to-Fine Selection for High-IPC Dataset Distillation》
  • 《算法导论》第 4 章 - 分治策略
  • uniapp云打包打包安卓app失败,显示:本地安装包生成失败,请重试或者切换到非安心打包模式进行打包
  • 第十七天:原码、反码、补码与位运算
  • 【渲染流水线】主线索引-从数据到图像以UnityURP为例
  • Kafka 的基本操作(1)
  • Go语言实战案例:使用sync.Mutex实现资源加锁
  • 解决docker load加载tar镜像报json no such file or directory的错误