python --去除人像背景(抠图)

本文介绍了三种去除人像背景的方法:使用remove.bg API、OpenCV人像分割算法以及基于深度学习的模型。首先,通过Python调用remove.bg API实现快速背景移除;其次,利用OpenCV加载预训练模型进行人像检测与分割;最后,采用预训练的深度学习模型进行更精确的人像抠图。这些方法对于图像处理和人像编辑具有实用价值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

方法一

注册

https://www.remove.bg/zh/api#api-reference

实操

import time
import requests
import win32ui
import pyautogui
import PySimpleGUI as sg
import os

a = pyautogui.confirm(text='是否现在开始去除人像背景', title='小毅欧巴', buttons=['开始', '关闭'])
if a == '关闭':
    exit()

dlg = win32ui.CreateFileDialog(1)  # 参数 1 表示打开文件对话框
dlg.SetOFNInitialDir('C:')  # 设置打开文件对话框中的初始显示目录
dlg.DoModal()
filename = dlg.GetPathName()
file, ext = os.path.splitext(filename)
if ext not in ('.jpg', '.JPG', '.PNG', '.png'):
    pyautogui.alert(text='文件仅支持(jpg, png)', title='提示', button='关闭')
    exit()

pyautogui.alert(text=filename, title='确认路径', button='我已确认')

key = 'c6vLHWNS7fDFAvoMXk3uo4mB'
# rmbg = RemoveBg(key, "error.log")
# rmbg.remove_background_from_img_file(filename)
new_file_name = os.path.join(os.path.join(os.path.expanduser('~'), "Desktop"), 'no-bg.png')
with open(filename, 'rb') as f:
    response = requests.post(
        'https://api.remove.bg/v1.0/removebg',
        files={'image_file': f},
        data={
            'size': "regular",
            'bg_color': None
        },
        headers={'X-Api-Key': key})
    with open(new_file_name, 'wb') as removed_bg_file:
        removed_bg_file.write(response.content)

mylist = [1, 2, 3, 4, 5, 6, 7, 8]
for i, item in enumerate(mylist):
    sg.one_line_progress_meter('AI', i + 1, len(mylist), '正在智能清除背景')
    time.sleep(0.1)

方法二

# OpenCV 人像分割
```python
import cv2

# 加载模型
net = cv2.dnn.readNetFromCaffe("model.prototxt", "model.caffemodel")

# 加载图片
image = cv2.imread("image.jpg")

# 执行人像分割
blob = cv2.dnn.blobFromImage(cv2.resize(image, (300, 300)), 1.0, (300, 300), (104.0, 177.0, 123.0))
net.setInput(blob)
output = net.forward()
h, w = image.shape[:2]

# 遍历分割结果,抠出人像
for i in range(output.shape[2]):
confidence = output[0, 0, i, 2]

if confidence > 0.5:
box = output[0, 0, i, 3:7] * np.array([w, h, w, h])
start_x, start_y, end_x, end_y = box.astype("int")

# 确保人像在原图内
start_x, start_y = max(start_x, 0), max(start_y, 0)
end_x, end_y = min(end_x, w - 1), min(end_y, h - 1)

# 抠出人像
roi = image[start_y:end_y, start_x:end_x].copy()

方法三

基于深度学习的人像分割

import numpy as np
import tensorflow as tf
from PIL import Image

# 加载模型和预处理器
model = tf.keras.models.load_model('model.h5')
preprocessor = tf.keras.applications.mobilenet_v2.preprocess_input

# 加载图片
image = Image.open('image.jpg')

# 预处理图片
inputs = preprocessor(np.array(image.resize((224, 224))))

# 执行人像分割
mask = model.predict(np.array([inputs]))[0]

# 处理分割结果,抠出人像
mask = np.array(Image.fromarray((mask * 255).astype('uint8')).resize(image.size))
mask = np.stack([mask, mask, mask], axis=-1)
roi = np.where(mask > 128, image, 0)
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

像风一样的男人@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值