python --去除人像背景(抠图)
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)
-