当前位置: 首页 > 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.lryc.cn/news/611459.html

相关文章:

  • Python日志记录库——logaid
  • mq_unlink系统调用及示例
  • RC和RR的区别
  • 一文搞定JavaServerPages基础,从0开始写一个登录与人数统计页面
  • Python 函数详解
  • SpringCloud学习------Hystrix详解
  • 通俗版23种设计模式解析
  • 苍穹外卖Day10
  • 智慧酒店:科技赋能下的未来住宿新体验
  • Datawhale AI夏令营 第三期 task2 稍微改进
  • 山东省天地图API申请并加载到QGIS和ArcGIS Pro中
  • 数据结构 实现单链表
  • LeetCode347.前K个高频元素(hash表+桶排序)
  • Chisel芯片开发入门系列 -- 18. CPU芯片开发和解释8(流水线架构的代码级理解)
  • 思途Mybatis学习 0805
  • LeetCode 刷题【31. 下一个排列】
  • 《Python基础》第3期:使用PyCharm编写Hello World
  • C++ 变量初始化方式总结 | 拷贝初始化 | 列表初始化 | 值初始化
  • 【C语言】动态内存管理详解
  • Kafka 的基本操作(1)
  • 国内办公安全平台新标杆:iOA一体化办公安全解决方案
  • 【基础】第八篇 Java 位运算符详解:从基础到实战应用
  • 【java】大数据insert的几种技术方案和优缺点
  • 一种基于机器学习的关键安全软件WCET分析方法概述与实际工作原理举例
  • 多传感器融合
  • 机器人权利:真实还是虚幻,机器人权利研究如何可能,道德权利与法律权利
  • nodejs 编程基础01-NPM包管理
  • 《计算机“十万个为什么”》之 面向对象 vs 面向过程:编程世界的积木与流水线
  • 【android bluetooth 协议分析 01】【HCI 层介绍 30】【hci_event和le_meta_event如何上报到btu层】
  • 零基础人工智能学习规划之路