Python图片批量自动抠图去背景的代码详解
作者:itips 发布时间:2022-11-30 17:20:39
今天发现个好东西啊,叫片刻抠图,是一个在线对图片自动抠图去除背景的网站。只要上传图片,就可以自动把背景去掉把目标对象抠出来。
不管是动物、汽车或各种产品,还是人物,都可以全自动做到令人惊艳的抠图效果!而且还说可以做到发丝级 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('恭喜!全部完成')
在完整代码中加入了异常处理,如果遇到需要扫码登录或者验证码,手动操作一下,还会继续执行下去的。
来源:https://www.cnblogs.com/xyou/p/16048807.html
猜你喜欢
- 背景总结统计工作中几个常用用法在python统计函数库scipy.stats的使用范例。正态分布以正态分布的常见需求为例了解scipy.st
- 以前写过一个标签效果,外观虽然好看,但代码不太规范,实现的方法比较繁冗。需要注意的是标签的背景图,两种状态,激活的标签背景为蓝色,反之为灰色
- 在《多进程并发与同步》中介绍了进程创建与信息共享,除此之外python还提供了更方便的进程间通讯方式。进程间通讯multiprocessin
- Django cors跨域问题前后端分离项目中的跨域问题 即同源策略同源策略:同源策略/SOP(Same origin policy)是一种
- var InterestKeywordListString = $("#userInterestKeywordLabel"
- CSS中最常用的布局类属性,一个是Float(CSS浮动属性Float详解),另一个就是CSS定位属性Position。1. positio
- 本文实例为大家分享了python名片管理系统的具体代码,供大家参考,具体内容如下import oslist_all = []def page
- 页面是这样的我尝试了很多次,都不响应。代码是这样的import xlrd###导入数据def read_data(workboo
- 简介本文主要介绍python数组循环语法。主要方式有元素遍历,索引遍历,enumerate, zip, list内部等。普通循环list1
- 数组新的shape属性应该要与原来的配套,如果等于-1的话,那么Numpy会根据剩下的维度计算出数组的另外一个shape属性值。举个例子:x
- 代码之余,将代码过程重要的一些代码段备份一下,如下的代码内容是关于Python从ftp服务器下载文件的的代码,希望能对小伙伴有用途。#cod
- 需要用到的包:beautifulsoup4 html5lib image requests redis PyMySQLpip安装所有依赖包:
- asp三天学好ADO对象之第二天 今天来说一下Recordset对象的一些方法。1、AddNew 方法创建可更新 Recordset 对象的
- python爬虫用mongodb的原因:1、文档结构的存储方式简单讲就是可以直接存json,list2、不要事先定义”表”,随时可以创建3、
- 本文主要介绍的是python3中对str(字符串)的使用操作总结,文中介绍的非常详细,需要的朋友们下面来一起看看吧。__add__函数 (在
- 我生平不爱学习,所以说不出什么洋洋洒洒的大道理,貌似也写不出妙语连珠的学术文章,有感于现在宅到极致的生活状态,故一篇图文并茂的文章诞生了(大
- flask之模板继承为什么要用模板继承?原因很简单,因为模板继承能让我们在实现效果的前提下少些很多代码!咱废话不多说,先来看个小例子,看完我
- 从本篇开始讲述如何用css实现网页的布局,即如何用css控制网页内各个元素的显示位置。如果你是一个初学者,很可能觉得做一个网页的第一步就是布
- Apache 从2.2升级到 Apache2.4.x 后配置文件 httpd.conf 的设置方法有了大变化,以前是将 deny from
- 每位SQL Server开发员都有自己的首选操作方法。我的方法叫做分子查询。这些是由原子查询组合起来的查询,通过它们我可以处理一个表格。将原