Python图片批量自动抠图去背景的代码详解

今天发现个好东西啊,叫片刻抠图,是一个在线对图片自动抠图去除背景的网站。只要上传图片,就可以自动把背景去掉把目标对象抠出来。

不管是动物、汽车或各种产品,还是人物,都可以全自动做到令人惊艳的抠图效果!而且还说可以做到发丝级 AI 自动抠图,作为一个头发存留不多的程序员,突然莫名感觉到一丝来自这个世界的恶意。

这个抠图有什么用?比如可以把人物抠出来换个背景:

也可以把产品抠出来做成新的商品宣传图:(做电商的朋友肯定懂)

这么好用的东西,现在最关键的是:完全免费!

emmmmmm,这个消息被我的几十个前任女友知道了,她们纷纷发来照片,要我给她把照片背景给去掉,把她美美的人像给抠出来,之后好换上马尔代夫的背景。

这么多的图片要一张张传上去,再下载回来,同样的事情做几十遍那我肯定不会做的。

那么,必须要写个 Python 自动化脚本程序来搞定了。

说干就干,二话不说就掏出网页自动化的神器Selenium,写简单几行代码:

"""
Selenium是第三方库,需要先安装,在Teminal里执行:pip install selenium
驱动程序 chromedriver 需要根据浏览器 chrome 的版本下载
有问题的可以加我:youbafu  (全网统一id)
from selenium import webdriver
from selenium.webdriver.chrome.service import Service

s = Service(r'D:\driver\chromedriver.exe')
# 初始化浏览器为chrome浏览器
browser = webdriver.Chrome(service=s)
# 打开 片刻抠图
browser.get(r'https://www.pickwant.com')

就完成了自动打开网页:

但这是远远不够的,我们需要实现自动上传图片,然后自动下载。

通过几次手动操作得出规律,我们只要进入到编辑界面

然后循环执行以下步骤:

1、点击网页右上角的重新上传按钮。

2、选择要上传的图片,点打开按钮。

3、等几秒抠好图后,点网页右上角下载按钮。

4、弹出对话框后,再点确认下载就会自动保存图片。

就可以依次把文件夹里的前女友们的图片完成自动抠图了。

要做出自动化脚本,接下来就是找到这些按钮,然后模拟点击就可以了。在重新下载按钮上点鼠标右键,在弹出的菜单中点检查,弹出了网页的元素查看界面,再重复操作一次,就定位到了这个按钮的网页代码:

可以看到重新上传是个 span ,这里可以取它的上级 div,它的class是border_wrap upload_wrap,那么就可以写代码定位到这个元素,然后执行click()操作了。

import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By

s = Service(r'D:\driver\chromedriver.exe')
# 初始化浏览器为chrome浏览器
browser = webdriver.Chrome(service=s)
# 打开 片刻抠图
browser.get(r'https://www.pickwant.com/#/editor')
time.sleep(1)
# 定位到 重新上传 按钮
upload = browser.find_element(By.CSS_SELECTOR, '.border_wrap.upload_wrap')
upload.click()

这里要特别说明的是,根据 CSS 的基本语法,id用#表示,class用.来表示,如果中间有空格也是用.来拼接,下级标签用>来拼接。

<div data-v-0373fdbc="" class="border_wrap upload_wrap"></div>

对于这样的 div 标签,其class是 border_wrap upload_wrap ,所以 By.CSS_SELECTOR 的查找元素的参数就是 ‘.border_wrap.upload_wrap’ 。

代码执行后,弹出一个选择文件的对话框:

这时候问题来了,这个对话框是 Windows 系统级别的,不受Selenium控制,怎么办?

不要慌,这难不倒霸夫老师,既然是 Windows 系统弹窗,那总得受系统控制吧!

那就祭出 pywin32 库来对付它,在终端命令行(Terminal)里输入命令安装库:

pip install pywin32

然后再打开查看 Windows 窗口信息的神器spy++,拿到窗口的类名和层次结构关系,就可以写出以下的自动选择文件并点击按钮的函数代码了:

import win32con # win32库里包含了很多模块
import win32gui # 这里导入具体用到的模块
def 上传图片(文件路径):
    dialog = win32gui.FindWindow('#32770', u'打开')  # 对话框
    ComboBoxEx32 = win32gui.FindWindowEx(dialog, 0, 'ComboBoxEx32', None)
    ComboBox = win32gui.FindWindowEx(ComboBoxEx32, 0, 'ComboBox', None)
    Edit = win32gui.FindWindowEx(ComboBox, 0, 'Edit', None)  # 上面三句依次寻找对象,直到找到输入框Edit对象的句柄
    button = win32gui.FindWindowEx(dialog, 0, 'Button', None)  # 打开按钮
    time.sleep(0.5)
    win32gui.SendMessage(Edit, win32con.WM_SETTEXT, None, 文件路径)  # 往输入框输入绝对地址
    time.sleep(0.5)
    win32gui.SendMessage(dialog, win32con.WM_COMMAND, 1, button)  # 点 打开 按钮
    time.sleep(5)

先写好这个函数备用,等下要上传哪张图片,只要调用函数时把图片的文件路径作为参数传入,就可以完成目标了。

上传图片后,只要稍等一两秒就自动完成抠图了。这时候再点网页右上角下载按钮,等弹出对话框后,再点确认下载就会自动保存图片。

前面我们学习了定位元素的方法了,再定位这两个按钮对我们来说不是什么困难了。

但是,你都能坚持看到这里了,霸夫老师必须要教你个更牛X的更方便的技巧了:

下载按钮上点鼠标右键,在弹出的菜单中点检查,弹出了网页的元素查看界面,再重复操作一次,就定位到了这个按钮的网页代码。然后在它的上一级的这个div标签上点鼠标右键,选择Copy,再选择Copy selector

然后回到python代码编辑窗口,粘贴就可以获得准确的定位参数:

#app > div > div:nth-child(1) > div.col-md-12.wonx_row.top_bar > div.border_wrap.download_wrap

这样就省去了辛辛苦苦去理解和转化参数,大大提高效率,接下来就可以轻松写出定位元素和点击的代码:

download = browser.find_element(By.CSS_SELECTOR, '#app > div > div:nth-child(1) > div.col-md-12.wonx_row.top_bar > div.border_wrap.download_wrap')
download.click() # 点击 下载
time.sleep(0.5)
comfirm = browser.find_element(By.CSS_SELECTOR, '#app > div > div.container > div.dialog-content > div > div.download_wrap')
comfirm.click()  # 点击 确认下载
time.sleep(1)

单张图片的上传和下载流程都写完了,接下来要写个获取文件夹下所有图片的函数,来实现依次把每个前任的图片都完成抠图的任务。

我把她们的照片都放在电脑的 E: 盘下的前任女友这个文件夹里,那么只要读取这个文件夹下的所有图片,依次执行执行一遍上传和下载操作就可以了。

文件夹路径 = r'E:\前任女友'
names = os.listdir(文件夹路径)  # 列举出该目录下所有的文件名
for name in names:
    path = os.path.join(文件夹路径, name)  # 拼接出图片完整路径
    # 点击重新上传() # 等待封装
    上传图片(path)
    # 点击下载() # 等待封装

所有的逻辑都理清楚了,模块也基本写好了,接下来就把代码整合一下,来看完整代码:

"""
片刻抠图
图片批量自动抠图去背景
作者:有霸夫
有问题请加vx:youbafu
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
import win32con
import win32gui
import os

s = Service(r'D:\driver\chromedriver.exe')
# 初始化浏览器为chrome浏览器
browser = webdriver.Chrome(service=s)
# 打开 片刻抠图
browser.get(r'https://www.pickwant.com')
time.sleep(1)
browser.get(r'https://www.pickwant.com/#/editor')
time.sleep(2)
def 点击重新上传():
    while True:
        try:
            # 定位到 重新上传 按钮
            upload = browser.find_element(By.CSS_SELECTOR, '.border_wrap.upload_wrap')
            upload.click()
        except:
            print('请先扫描登录或完成验证码识别')
        else:
            print('点击 重新上传')
            break
        finally:
            time.sleep(1)
def 上传图片(文件路径):
    dialog = win32gui.FindWindow('#32770', u'打开')  # 对话框
    ComboBoxEx32 = win32gui.FindWindowEx(dialog, 0, 'ComboBoxEx32', None)
    ComboBox = win32gui.FindWindowEx(ComboBoxEx32, 0, 'ComboBox', None)
    Edit = win32gui.FindWindowEx(ComboBox, 0, 'Edit', None)  # 上面三句依次寻找对象,直到找到输入框Edit对象的句柄
    button = win32gui.FindWindowEx(dialog, 0, 'Button', None)  # 打开按钮
    if Edit is not None and button is not None:
        time.sleep(0.5)
        win32gui.SendMessage(Edit, win32con.WM_SETTEXT, None, 文件路径)  # 往输入框输入绝对地址
        print('上传:', 文件路径)
        win32gui.SendMessage(dialog, win32con.WM_COMMAND, 1, button)  # 点 打开 按钮
        time.sleep(5)
def 点击下载():
            download = browser.find_element(By.CSS_SELECTOR, '.border_wrap.download_wrap')
            download.click()
            time.sleep(0.5)
            confirm = browser.find_element(By.CSS_SELECTOR, '.dialog-content>.content_wrap>.download_wrap')
            confirm.click()
            print('点击 下载')
文件夹路径 = r'E:\前任女友'
names = os.listdir(文件夹路径)  # 列举出该目录下所有的文件名
for name in names:
    path = os.path.join(文件夹路径, name)  # 拼接出图片完整路径
    点击重新上传()
    上传图片(path)
    点击下载()
print('恭喜!全部完成')

在完整代码中加入了异常处理,如果遇到需要扫码登录或者验证码,手动操作一下,还会继续执行下去的。

到此这篇关于Python图片批量自动抠图去背景的文章就介绍到这了,更多相关Python批量自动抠图去背景内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python用5行代码实现批量抠图的示例代码

    前言 对于会PhotoShop的人来说,抠图是非常简单的操作了,有时候几秒钟就能扣好一张图.不过一些比较复杂的图,有时候还是要画点时间的,今天就给大家带了一个非常快速简单的办法,用Python来批量抠取人像. 效果展示 开始吧,我也不看好什么自动抠图,总觉得不够精确,抠不出满意的图.下面我就直接展示一下效果图吧.我们先看看原图 这张图片背景未纯色,我们平时用PhotoShop抠起来也比较简单,对我们计算机来说也不是什么难题,下面是效果图: 因为本身是PNG图片,而且原图是白色背景,所以看不出什么

  • Python PyQt5干货满满小项目轻松实现高效抠图去背景

    目录 简介 1.获取API 2.API使用方法 3.可视化桌面制作 4.逻辑实现 5.美化 6.信号与槽绑定 7.全部代码 8.界面展示 简介 结合学习的PyQt5,弄点小项目,做次记录. 此项目是使用了removebg的API,进行实现抠图功能,将人物的背景扣去.将次功能封装到桌面上. 1.获取API 先打开removebg的网站 点击上面的工具和API 再点击API Docs 最后点击Get API Key,当然要先登录 2.API使用方法 在API Docs 下面有使用方法 3.可视化桌面

  • Python图片批量自动抠图去背景的代码详解

    今天发现个好东西啊,叫片刻抠图,是一个在线对图片自动抠图去除背景的网站.只要上传图片,就可以自动把背景去掉把目标对象抠出来. 不管是动物.汽车或各种产品,还是人物,都可以全自动做到令人惊艳的抠图效果!而且还说可以做到发丝级 AI 自动抠图,作为一个头发存留不多的程序员,突然莫名感觉到一丝来自这个世界的恶意. 这个抠图有什么用?比如可以把人物抠出来换个背景: 也可以把产品抠出来做成新的商品宣传图:(做电商的朋友肯定懂) 这么好用的东西,现在最关键的是:完全免费! emmmmmm,这个消息被我的几十

  • Python实现批量采集商品数据的示例详解

    目录 本次目的 知识点 开发环境 代码 本次目的 python批量采集某商品数据 知识点 requests 发送请求 re 解析网页数据 json 类型数据提取 csv 表格数据保存 开发环境 python 3.8 pycharm requests 代码 导入模块 import json import random import time import csv import requests import re import pymysql 核心代码 # 连接数据库 def save_sql(t

  • Python 带有参数的装饰器实例代码详解

    demo.py(装饰器,带参数的装饰器): def set_level(level_num): def set_func(func): def call_func(*args, **kwargs): if level_num == 1: print("----权限级别1,验证----") elif level_num == 2: print("----权限级别2,验证----") return func() return call_func return set_f

  • python静态web服务器实现方法及代码详解

    1.编写TCP服务器程序. 2.获取浏览器发送的http请求消息数据. 3.读取固定的页面数据,将页面数据组装成HTTP响应消息数据并发送给浏览器. 4.HTTP响应报文数据发送完成后,关闭服务于客户端的套接字. 实例 # 时间: 2021/10/21 20:38 import socket if __name__ == '__main__': # 创建tcp服务端套接字 tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_

  • Android实现图片自动切换功能(实例代码详解)

    在Android中图片的自动切换不仅可以实现自动切换,而且还可以使用手动切换.而且一般在切换的时候,在图片下方还带有其他内容的切换,用来标记是第几个图片的切换. 这种效果在我们日常生活中很常见,例如某宝购物,一些商城都可以使用到,用户体验度极好,今天小编就通过实例代码给大家分享android 图片自动切换功能的实现. 实现效果如下: 具体的示例代码如下: 布局代码: <?xml version="1.0" encoding="utf-8"?> <S

  • C#插入图片到Excel表格单元格代码详解

    dll文件获取及引用: 方法1:通过官网下载dll文件包,并解压.解压文件后,将bin文件夹下的Spire.Xls.dll文件引用到C#程序. 方法2:通过Nuget网站获取dll. C#代码示例 using Spire.Xls; using System.Drawing; namespace InsertImage_XLS { class Program { static void Main(string[] args) { //创建Workbook对象 Workbook workbook =

  • Python 统计位数为偶数的数字代码详解

    问题描述 给出一个整数数组 nums,请返回其中位数为偶数的数字的个数. 示例 1: 输入:nums = [12,345,2,6,7896] 输出:2 解释: 12 是 2 位数字(位数为偶数) 345 是 3 位数字(位数为奇数) 2 是 1 位数字(位数为奇数) 6 是 1 位数字 位数为奇数) 7896 是 4 位数字(位数为偶数) 因此只有 12 和 7896 是位数为偶数的数字 示例 2: 输入:nums = [555,901,482,1771] 输出:1 解释: 只有 1771 是位

  • python实现语音常用度量方法的代码详解

    语音信号处理一般都要进行主观评价实验和客观评价实验. 主观评价:邀请测听者对语音进行测听,给出主观意见得分 客观评价:根据算法来衡量语音质量 主观投票受多种因素影响,如个体受试者的偏好和实验的语境(其他条件).一个好的客观质量度量应该与许多不同的主观实验有很高的相关性 信噪比(SNR) 有用信号功率与噪声功率的比(此处功率为平均功率),也等于幅度比的平方 其中:$P_{signal}$为信号功率(平均功率或者实际功率):$P_{noise}$为噪声功率:$A_{signal}$为信号幅度:$A_

  • Python sqlalchemy时间戳及密码管理实现代码详解

    一.时间戳 实际开发中,我们一般希望create_time和update_time这两个属性能自动设置,所以在建表的时候需要在model上特殊处理一下: from sqlalchemy.sql import func class User(db.Model): __tablename__ = 'user' id = db.Column(db.Integer, primary_key = True) email = db.Column(db.String(128)) password_hash =

  • 基于Python的XML格式的文件示例代码详解

    XML文件是可拓展标记语言,是一种简单的数据存储语言,被设计用来传输和存储数据 在Python中XML的一些方法 读取文件和内容 #引用xml模块 from xml.etree import ElementTree as ET # ET去打开xml文件 tree = ET.parse("files/xo.xml") # 获取根标签 root = tree.getroot() print(root) # <Element 'data' at 0x7f94e02763b0> f

随机推荐