自定义抠图背景图片,Python抠图
本文主要介绍Python图片批量自动抠图去除背景。只要上传图片,就可以自动去除背景,挖出目标对象。非常方便。先来看看Python图片批量自动抠图的代码。
今天发现一个好东西,叫瞬间抠图,是一个自动抠图去除背景的在线网站。只要上传图片,就可以自动去除背景,挖出目标物体。
无论是动物、汽车还是各种产品,还是人,都可以全自动实现惊人的抠图效果!而且据说可以用发际线AI自动完成。作为一个头发所剩无几的程序员,突然莫名其妙地感觉到来自这个世界的一丝恶意。
这个席子有什么用?比如你可以把人物挖出来,换个背景:
也可以把产品挖出来做成新品推广图:(做电商的朋友肯定懂)
现在这么好用最重要的是:完全免费!
Emmmmmm,这个消息被我几十个前女友知道了。他们陆续发来照片,让我给她去掉照片的背景,挖出她美丽的肖像,再换成马尔代夫的背景。
这么多图片都要一张一张地上传,然后再下载回来,同样的事情我肯定不会做几十遍。
然后,你必须写一个Python自动化脚本程序来完成它。
照做就是了,什么也不说,拿出web自动化的神器Selenium,写几行简单的代码:
Selenium是第三方库,需要先安装,在terminal:pip install selenium中执行。
驱动chromedriver需要根据浏览器chrome的版本下载。
有问题可以加我:youbafu(全网统一id)
从selenium导入web驱动程序
来自selenium . web driver . chrome . Service导入服务
s=Service(r d : \ driver \ chrome driver . exe )
#将浏览器初始化为chrome浏览器
浏览器=webdriver。Chrome(服务)
#打开席子一会儿
browser . get(r https://www . pick want.com )
自动打开网页完成:
但这远远不够。我们需要自动上传图片,然后自动下载。
通过几次手动操作,就可以得到规则,只需要进入编辑界面。
然后循环执行以下步骤:
1.点击网页右上角的重新上传按钮。
2.选择要上传的图片,然后单击“打开”按钮。
3.等几秒钟挖图后,点击网页右上角的下载按钮。
4.弹出对话框后,点击确认下载,图片自动保存。
可以依次自动抠图文件夹里的前女友照片。
要制作自动化脚本,下一步是找到这些按钮,然后模拟点击。在重新下载按钮上点击鼠标右键,在弹出菜单中点击检查,弹出网页的元素查看界面。再次重复该操作,将定位到该按钮的网页代码:
你可以看到重新上传是一个跨度。这里可以取它的上级div,它的类是border_wrap upload_wrap。然后可以编写代码来定位这个元素,然后执行click()操作。
导入时间
从selenium导入web驱动程序
来自selenium . web driver . chrome . Service导入服务
由导入者
s=Service(r d : \ driver \ chrome driver . exe )
#将浏览器初始化为chrome浏览器
浏览器=webdriver。Chrome(服务)
#打开席子一会儿
browser . get(r https://www . pick want.com/#/editor )
时间.睡眠(1)
#导航至重新上传按钮。
upload=browser.find_element(By。CSS_SELECTOR,。border _ wrap . upload _ wrap’)
上传
.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: 盘下的前任女友
这个文件夹里,那么只要读取这个文件夹下的所有图片,依次执行执行一遍上传和下载操作就可以了。
文件夹路径 = rE:\前任女友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(rD:\driver\chromedriver.exe)
# 初始化浏览器为chrome浏览器
browser = webdriver.Chrome(service=s)
# 打开 片刻抠图
browser.get(rhttps://www.pickwant.com)
time.sleep(1)
browser.get(rhttps://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(点击 下载)
文件夹路径 = rE:\前任女友
names = os.listdir(文件夹路径) # 列举出该目录下所有的文件名
for name in names:
path = os.path.join(文件夹路径, name) # 拼接出图片完整路径
点击重新上传()
上传图片(path)
点击下载()
print(恭喜!全部完成)
在完整代码中加入了异常处理,如果遇到需要扫码登录或者验证码,手动操作一下,还会继续执行下去的。
到此这篇关于Python图片批量自动抠图去背景的文章就介绍到这了,更多相关Python批量自动抠图去背景内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。