当前位置: 首页 > 后端技术 > Python

Python批量自动抠图去除背景

时间:2023-03-26 18:44:35 Python

批量自动抠图去除背景今天发现一个好东西,叫瞬间抠图(pickwant.com),是一个自动抠图去除背景的在线网站。只要上传一张图片,就可以自动去除背景,裁剪出目标物体。无论是动物、汽车、各种产品,还是人,都能自动实现惊人的抠图效果!而且据说还有头发级的AI可以自动切图。作为一个头发稀少的程序员,突然莫名的感觉到了一丝来自这个世界的恶意。这个抠图有什么用?比如可以把人物抠出来换背景:也可以把商品抠出来做新品宣传图:(做电商的朋友一定要明白)这么有用的东西,现在最重要的是:它是完全免费的!emmmmmmm,这个消息被我的几十个前女友知道了,纷纷发来照片,让我给她去掉照片的背景,剪出她漂亮的头像,然后换成马尔代夫的背景。这么多图片要一张一张上传,然后再下载回来,我绝对不会做几十次同样的事情。然后,您必须编写一个Python自动化脚本程序来完成它。干就干,拿出网页自动化神器Selenium,写几行简单的代码:"""Selenium是第三方库,需要先安装,在Teminal中执行:pipinstallseleniumdriverchromedriver需要根据浏览如果下载chrome版本有问题可以加我:youbafu(全网统一id)"""fromseleniumimportwebdriverfromselenium.webdriver.chrome.serviceimportServices=Service(r'D:\driver\chromedriver.exe')#初始化浏览器为chrome浏览器browser=webdriver.Chrome(service=s)#打开片刻截取图片browser.get(r'https://www.pickwant.com')完成并自动打开网页:但这还远远不够,我们需要自动上传图片,然后自动下载。通过多次手动操作获取规则,我们只需要进入编辑界面,然后循环执行以下步骤:1.点击网页右上角的重新上传按钮。2.选择要上传的图片并单击打开按钮。3、等几秒剪出图片后,点击页面右上角的下载按钮。4.弹出对话框后,点击确定下载,图片会自动保存。然后就可以自动把文件夹里前女友的照片一张一张剪下来了。要做一个自动化的脚本,下一步就是找到这些按钮,然后模拟点击。在重新下载按钮上点击鼠标右键,在弹出的菜单中点击勾选,弹出网页元素查看界面。再次重复操作,会定位到这个按钮的网页代码:可以看到re-upload是一个span,这里可以取它的上级div,它的类是border_wrapupload_wrap,然后可以写代码到找到这个元素,然后执行click()操作。importtimefromseleniumimportwebdriverfromselenium.webdriver.chrome.serviceimportServicefromselenium.webdriver.common.byimportBys=Service(r'D:\driver\chromedriver.exe')#初始化浏览器为chromebrowserbrowser=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标签,它的类是border_wrapupload_wrap,所以By.CSS_SELECTOR的搜索元素的参数是'.border_wrap.upload_wrap'。代码执行后,弹出选择文件的对话框:这时候,问题来了。该对话框是Windows系统级别的,不受Selenium控制。我应该怎么办?不要惊慌,这不会给八福君添麻烦,既然是Windows系统弹窗,肯定是系统控制的!然后使用pywin32库进行处理,在终端命令行(Terminal)输入安装库的命令:pipinstallpywin32然后打开spy++,查看Windows窗口信息的神器,获取类名和层级结构窗口,可以编写如下自动选择文件点击按钮显示的功能代码:importwin32con#win32库包含很多模块importwin32gui#导入这里用到的具体模块def上传图片(文件路径):dialog=win32gui.FindWindow('#32770',u'open')#dialogComboBoxEx32=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,filepath)#在输入框中输入绝对地址time.sleep(0.5)win32gui.SendMessage(dialog,win32con.WM_COMMAND,1,button)#点击openbuttontime.sleep(5)先写这个函数,等待哪张图片上传。只需在调用函数时将图片的文件路径作为参数传入,即可完成目标。上传图片后,稍等一两秒,抠图就会自动完成。此时点击网页右上角的下载按钮,等待弹出对话框,点击确定下载,图片会自动保存。前面我们已经学习了定位元素的方法,我们定位这两个按钮并不难。不过,如果你能坚持看到这个,巴服老师一定要教你一个更强大更方便的技巧:右击下载按钮,在弹出的菜单中点击勾选,就会弹出网页的元素勾选界面再次重复操作,找到该按钮的网页代码。然后在其上层的div标签上点击鼠标右键,选择Copy,再选择Copyselector。然后回到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)单图上传下载过程结束,next是需要写一个获取文件夹中所有图片的函数,从而实现依次切出前任每张图片的任务。我把他们的照片都放在了电脑E盘下前女友的文件夹里,所以就把这个文件夹里的所有照片都读出来,一张一张的进行上传下载操作。folderpath=r'E:\ex-girlfriend'names=os.listdir(folderpath)#列出该目录下的所有文件名fornameinnames:path=os.path.join(folderpath,name)#拼接出来图片的完整路径#点击重新上传()#等待打包上传图片(路径)#点击下载()#等待打包逻辑都清楚了,模块基本写好了,和然后代码集成了看一下完整代码:"""批量切出图片自动批量去除背景.webdriver.common.byimportByimportwin32conimportwin32guiimportoss=Service(r'D:\driver\chromedriver.exe')#初始化浏览器为chrome浏览器browser=webdriver.Chrome(service=s)#打开抠图浏览器一会.get(r'https://www.pickwant.com')time.sleep(1)browser.get(r'https://www.pickwant.com/#/editor')time.sleep(2)def点击重新上传():whileTrue:try:#找到重新上传按钮上传=browser.find_element(By.CSS_SELECTOR,'.border_wrap.upload_wrap')upload.click()except:print('请先扫描登录或完成验证码识别')else:print('点击重新上传')breakfinally:time.sleep(1)def上传图片(文件路径):dialog=win32gui.FindWindow('#32770',u'open')#dialogComboBoxEx32=win32gui.FindWindowEx(dialog,0,'ComboBoxEx32',None)ComboBox=win32gui.FindWindowEx(ComboBoxEx32,0,'ComboBox',None)Edit=win32gui.FindWindowEx(ComboBox,0,'Edit',None)#上面三句依次查找对象,直到找到对象的句柄inputboxEditobjectbutton=win32gui.FindWindowEx(dialog,0,'Button',None)#如果Edit不为None且button不为None则打开按钮:time.sleep(0.5)win32gui.SendMessage(Edit,win32con.WM_SETTEXT,None,filepath)#在输入框中输入绝对地址print('Upload:',filepath)time.sleep(0.5)win32gui.SendMessage(dialog,win32con.WM_COMMAND,1,button)#点击打开按钮time.sleep(5)def点击下载():whileTrue:try:download=browser.find_element(By.CSS_SELECTOR,'.border_wrap.download_wrap')download.click()time.sleep(0.5)confirm=browser.find_element(By.C小号S_SELECTOR,'.dialog-content>.content_wrap>.download_wrap')confirm.click()except:print('请先扫描登录或完成验证码识别')else:print('点击下载')breakfinally:时间。sleep(1)folderpath=r'E:\ex-girlfriend'names=os.listdir(folderpath)#列出该目录下的所有文件名fornameinnames:path=os.path.join(file文件夹路径,name)#拼出图片完整路径点击重新上传()上传图片(路径)点击下载()print('Congratulations!Alldone')完整代码添加异常处理,如果遇到,需要扫码登录或者验证码,手动操作,会一直执行下去。如有任何疑问,请联系优巴福(优巴福)。祝大家玩得开心。