PaddlePaddle证件照换底换大小工具

PaddlePaddle证件照换底换大小工具

这个工具是在AI抠图的基础上,再加上换底和换大小功能做成的小软件,拥有简易的GUI界面。接着往下看完,你就能拥有一款自己专属证件照小工具了!

一、简介

  • 先来看看效果吧
  • 图片源自网络
  • 首先是原图

  • 然后是中间的扣图结果

  • 可以看到基本扣的十分干净

  • 然后再看看最终的红色二寸照片

  • 可以看到效果是非常不错的

接下来看看我们的GUI界面,让这样一款小工具更加简便好用

  • 首先是进入界面,非常简洁,选取照片后点击你想要格式的按钮即可

  • 如果你没有选去就点击的话会有报错提示

  • 如果正常选择文件,完成转换的进程之后,会提示成功和保存的位置

  • 进入文件夹就可以看到成果了

二、实现方式

1.扣图模型

扣图模型我们选择的是Paddle的deeplabv3p_xception65_humanseg模型。
这是一个已经训练好的模型,我们可以直接使用,简便易用。

2.接下来来看代码实现

首先导入要用到的库

import paddlehub as hub
from PIL import Image
import numpy as np
import tkinter.filedialog
import tkinter as tk
from tkinter import ttk
import tkinter.messagebox
import sys

先看我们的图片处理函数,这一部分直接利用现成的模型,提取图片,并进行合成

def process(path):

    global rawpath

    tpath = [rawpath]
    input_dict = {"image": tpath}

    results = module.segmentation(data=input_dict)

    # 查看results内容
    # for result in results:
    #     print(result)

    # 图像背景和前景融合

    base_image = Image.open(path).convert('RGB')

    fore_image = Image.open(f'humanseg_output/test.png').resize(base_image.size)

    # 图片加权合成
    scope_map = np.array(fore_image)[:, :, -1] / 255
    scope_map = scope_map[:, :, np.newaxis]
    scope_map = np.repeat(scope_map, repeats=3, axis=2)
    res_image = np.multiply(scope_map, np.array(fore_image)[:, :, :3]) + np.multiply((1 - scope_map),
                                                                                     np.array(base_image))

    # 保存图片
    res_image = Image.fromarray(np.uint8(res_image))
    res_image.save(f'humanseg_output/2.png')

    tkinter.messagebox.showwarning(title='提示', message='已保存到humanseg_output文件夹')

    sys.exit()

接下来是GUI部分

callbackClose函数是关闭程序时的提示框

selectPath函数是选取文件的函数

def callbackClose():
    tkinter.messagebox.showwarning(title='警告', message='点击了关闭按钮')
    sys.exit(0)


def selectPath():
    global rawpath

    # 选择文件path_接收文件地址
    path_ = tkinter.filedialog.askopenfilename()

    # 通过replace函数替换绝对文件地址中的/来使文件可被程序读取
    # 注意:\\转义后为\,所以\\\\转义后为\\
    path_ = path_.replace("/", "\\\\")
    rawpath = path_
    # path设置path_的值
    path.set(path_)



下面六个函数对应六种不同的处理方式

  • 白色、蓝色、红色,一寸,两寸

def white_1():  # 当acction被点击时,该函数则生效

    if rawpath is '':
        tkinter.messagebox.showwarning(title='错误', message='未选择文件')
        sys.exit()

    action1.configure(state='disabled')  # 将按钮设置为灰色状态,不可使用状态
    process('photo/white_1.png')


def blue_1():  # 当acction被点击时,该函数则生效

    if rawpath is '':
        tkinter.messagebox.showwarning(title='错误', message='未选择文件')
        sys.exit()

    action2.configure(state='disabled')  # 将按钮设置为灰色状态,不可使用状态
    process('photo/blue_1.png')


def red_1():  # 当acction被点击时,该函数则生效

    if rawpath is '':
        tkinter.messagebox.showwarning(title='错误', message='未选择文件')
        sys.exit()

    action3.configure(state='disabled')  # 将按钮设置为灰色状态,不可使用状态
    process('photo/red_1.png')


def white_2():  # 当acction被点击时,该函数则生效

    if rawpath is '':
        tkinter.messagebox.showwarning(title='错误', message='未选择文件')
        sys.exit()

    action4.configure(state='disabled')  # 将按钮设置为灰色状态,不可使用状态
    process('photo/white_2.png')


def blue_2():  # 当acction被点击时,该函数则生效

    if rawpath is '':
        tkinter.messagebox.showwarning(title='错误', message='未选择文件')
        sys.exit()

    action5.configure(state='disabled')  # 将按钮设置为灰色状态,不可使用状态
    process('photo/blue_2.png')


def red_2():  # 当acction被点击时,该函数则生效

    if rawpath is '':
        tkinter.messagebox.showwarning(title='错误', message='未选择文件')
        sys.exit()

    action6.configure(state='disabled')  # 将按钮设置为灰色状态,不可使用状态
    process('photo/red_2.png')

然后是主函数,加载模型,和GUI的主界面的建立。

if __name__ == '__main__':

    rawpath = ""
    module = hub.Module(name="deeplabv3p_xception65_humanseg")  # 调用模型, version='1.0.0'

    main_box = tk.Tk()
    #变量path
    path = tk.StringVar()

    main_box.title("证件照换底换大小")  # 添加标题
    tk.Label(main_box, text="目标路径:").grid(row=0, column=0)

    ttk.Label(main_box, text="请保证路径及名称不含中文").grid(column=1, row=1)
    ttk.Label(main_box, text="原文件最好也是证件照").grid(column=1, row=2)

    tk.Entry(main_box, textvariable=path).grid(row=0, column=1)
    tk.Button(main_box, text="路径选择", command=selectPath).grid(row=0, column=2)

    main_box.protocol("WM_DELETE_WINDOW", callbackClose)

    action1 = ttk.Button(main_box, text="白色一寸", command=white_1)  # 创建一个按钮, text:显示按钮上面显示的文字, command:当这个按钮被点击之后会调用command函数
    action1.grid(column=0, row=3)  # 设置其在界面中出现的位置 column代表列 row 代表行

    action2 = ttk.Button(main_box, text="蓝色一寸", command=blue_1)  # 创建一个按钮, text:显示按钮上面显示的文字, command:当这个按钮被点击之后会调用command函数
    action2.grid(column=0, row=4)  # 设置其在界面中出现的位置 column代表列 row 代表行

    action3 = ttk.Button(main_box, text="红色一寸", command=red_1)  # 创建一个按钮, text:显示按钮上面显示的文字, command:当这个按钮被点击之后会调用command函数
    action3.grid(column=0, row=5)  # 设置其在界面中出现的位置 column代表列 row 代表行

    action4 = ttk.Button(main_box, text="白色二寸", command=white_2)  # 创建一个按钮, text:显示按钮上面显示的文字, command:当这个按钮被点击之后会调用command函数
    action4.grid(column=2, row=3)  # 设置其在界面中出现的位置 column代表列 row 代表行

    action5 = ttk.Button(main_box, text="蓝色二寸", command=blue_2)  # 创建一个按钮, text:显示按钮上面显示的文字, command:当这个按钮被点击之后会调用command函数
    action5.grid(column=2, row=4)  # 设置其在界面中出现的位置 column代表列 row 代表行

    action6 = ttk.Button(main_box, text="红色二寸", command=red_2)  # 创建一个按钮, text:显示按钮上面显示的文字, command:当这个按钮被点击之后会调用command函数
    action6.grid(column=2, row=5)  # 设置其在界面中出现的位置 column代表列 row 代表行

    main_box.mainloop()

最后,当所有代码调试完成之后,您就可以对程序进行打包了,生成一个EXE文件,这样,您就真正拥有了一款属于您自己的证件照小工具了!!!

运行代码请点击:https://aistudio.baidu.com/aistudio/projectdetail/532084?shared=1

Github地址为:https://github.com/chenqianhe/Certificate_photo_for_background_color

欢迎点击fork,star,like三连

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值