AI证件照抠图

news2025/2/25 9:03:55

AI证件照抠图

  • AI证件照抠图
    • 1. 环境导入
    • 2. main.py
    • 3. 实现效果展示

AI证件照抠图

*免费AI证件照抠图

1. 环境导入

mkdir /home/aistudio/external-libraries
pip install  onnxruntime scikit-image -i https://mirrors.aliyun.com/pypi/simple/ \
     -t /home/aistudio/external-libraries

2. main.py

# AI证件照抠图

# 1 设置环境变量 (每次重新进入此项目或者重启内核后,都要执行此代码)
# 在py文件里面运行环境
import sys

sys.path.append('./external-libraries')
# 在ipynb里面运行环境
import os

os.environ['PYTHONPATH'] = os.environ.get('PYTHONPATH', '') + ':./external-libraries'

# 2定义remove background的函数


import sys

sys.path.append('./external-libraries')

# 在ipynb里面运行环境
import os

os.environ['PYTHONPATH'] = os.environ.get('PYTHONPATH', '') + ':./external-libraries'

import onnxruntime as ort
import cv2
import numpy as np
from PIL import Image, ImageDraw
import re
from skimage import io
#pip install  onnxruntime -i https://mirrors.aliyun.com/pypi/simple/  -t /home/aistudio/external-libraries
class BriaRMBG_ONNX:
    def __init__(self, model_path):
        self.session = ort.InferenceSession(model_path)

    def __call__(self, input_tensor):
        input_name = self.session.get_inputs()[0].name
        outputs = self.session.run(None, {input_name: input_tensor})
        return outputs


def preprocess_image(im: np.ndarray, model_input_size: list) -> np.ndarray:
    if len(im.shape) < 3:
        im = cv2.cvtColor(im, cv2.COLOR_GRAY2BGR)  # 将灰度图像转换为BGR格式
    im = cv2.resize(im, model_input_size, interpolation=cv2.INTER_LINEAR)  # 调整图像大小
    im = im.astype(np.float32)  # 将图像数据类型转换为float32
    im /= 255.0  # 归一化到[0, 1]范围
    mean = [0.5, 0.5, 0.5]
    std = [1.0, 1.0, 1.0]
    im -= mean
    im /= std
    return im[np.newaxis, :, :, :]


def postprocess_image(result: np.ndarray, im_size: list) -> np.ndarray:
    result = result[0]  # 移除batch维度
    ma = np.max(result)
    mi = np.min(result)
    result = (result - mi) / (ma - mi)  # 归一化到[0, 1]范围
    result = (result * 255).astype(np.uint8)  # 将数据类型转换回uint8
    result = cv2.resize(result, [im_size[1], im_size[0]], interpolation=cv2.INTER_LINEAR)  # 调整图像大小
    return result


def add_background_to_image(input_image_path, output_image_path, background_color, out_size=None):
    """
    给透明背景的PNG人像图像添加任意颜色的背景。

    :param input_image_path: 输入图像的路径
    :param output_image_path: 输出图像的路径
    :param background_color: 背景颜色 (R, G, B)
    :param size: 输出图像的大小 (width, height) 默认与输入图像相同
    """
    # 打开输入图像
    image = Image.open(input_image_path)

    # 如果图像不是PNG格式,先转换为PNG
    if image.format != 'PNG':
        image = image.convert('RGBA')

    if out_size is None:
        out_size = image.size

    image
    out_image = Image.new('RGB', image.size, background_color)
    out_image.paste(image, (0, 0), image)

    out_image.resize(out_size)

    # 保存新的图像
    out_image.save(output_image_path)


def rmbg(input_image_path, background_color, out_size_w, out_size_h, size_opt):
    if size_opt == "保持原图大小":
        shape = cv2.imread(input_image_path).shape
        out_size = (int(shape[0]), int(shape[1]))
    else:
        out_size = (int(out_size_w), int(out_size_h))

    match = re.search(r'^(.+/)([^.]+)(\..+)$', input_image_path)  # 使用正则表达式找到图片名称和扩展名
    path, filename, ext = match.groups()  # 获取组:路径、文件名、扩展名
    new_filename = filename + "_rmgb" + ext  # 修改文件名
    out_path = path + new_filename  # 抠图
    new_filename = filename + "_bg" + ext
    output_image_path = path + new_filename  # 证件照

    net = BriaRMBG_ONNX(f"./rmbg/onnx/model.onnx")

    # prepare input
    model_input_size = [1024, 1024]
    orig_im = io.imread(input_image_path)
    orig_im_size = orig_im.shape[0:2]
    image = preprocess_image(orig_im, model_input_size)
    image = np.transpose(image, (0, 3, 1, 2))  # ONNX通常需要CHW格式

    # inference
    result = net(image)

    # post process
    result_image = postprocess_image(result[0][0], orig_im_size)

    # save result
    pil_im = Image.fromarray(result_image)
    no_bg_image = Image.new("RGBA", pil_im.size, (0, 0, 0, 0))
    orig_image = Image.open(input_image_path)
    no_bg_image.paste(orig_image, mask=pil_im)
    no_bg_image.save(out_path)

    print(background_color, out_size)
    add_background_to_image(out_path, output_image_path, background_color, out_size)

    return out_path, output_image_path

import cv2
import matplotlib.pyplot as plt



# 输入图片的路径
#input_img = './rmbg/photo/wj.png'
input_img='./jpgtopng/t.png'
# 证件照的背景颜色
#color = "#FFFFFF" # 白色(用于护照、签证、身份证等)
#color = "#438EDB" # 蓝色(用于毕业证、工作证等)
color = "#FF0000" # 红色(用于一些特殊的证件照)

# 证件照的大小
width = 295
height = 413  # 一寸(295像素 x 413像素)

# 是否保持原图大小
# size_opt = "不保持原图大小"
size_opt = "保持原图大小" # 如果选了这个会保持输入图片的大小,忽略上面的 证件照的大小 参数



# color, width, height 这三个参数不影响抠图,只会影响证件照的结果
out_path, output_image_path = rmbg(input_img, color, width, height, size_opt)

print('抠图后的图片: ', out_path)
print('证件照: ', output_image_path)

3. 实现效果展示

# 展示图片

from PIL import Image
import matplotlib.pyplot as plt

# print('原图')
image_input = Image.open(input_img)

# print('抠图后的图片')
image_rmbg = Image.open(out_path)

# print('证件照')
image_bg = Image.open(output_image_path)


# 设定图片显示的大小
fig, axs = plt.subplots(3, 1, figsize=(5, 15))

# 在每个子图上显示一张图片
axs[0].imshow(image_input)
axs[0].axis('off')  # 不显示坐标轴
axs[0].set_title(' original')

axs[1].imshow(image_rmbg)
axs[1].axis('off')  # 不显示坐标轴
axs[1].set_title(' remove background')

axs[2].imshow(image_bg)
axs[2].axis('off')  # 不显示坐标轴
axs[2].set_title('with background')

# 调整子图之间的间距
plt.tight_layout()

# 显示画布
plt.show()

*原图

在这里插入图片描述

*抠图

在这里插入图片描述
*证件照

在这里插入图片描述

可以需要需要选择背景色

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1585750.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mysql【索引覆盖、索引下推、索引合并、索引跳跃】介绍

索引覆盖、索引下推、索引合并、索引跳跃都是Mysql对索引的优化手段&#xff0c;它们的思想就是尽量让查询数据走索引&#xff0c;那它们有什么区别呢&#xff1f; 一、首先介绍一下MySQL体系结构 上图来自MySQL官方文档。 通常把MySQL从上至下分为以下几层&#xff1a; MySQ…

arXiv苹果公司新论文“Self-Play”方法训练车辆道路merge的策略

arXiv苹果公司新论文“Self-Play”方法训练车辆道路merge的策略 附赠自动驾驶学习资料和量产经验&#xff1a;链接 苹果于2020年1月28日上传arXiv新论文“Towards Learning Multi-agent Negotiations via Self-Play“。 摘要&#xff1a; 做出复杂、鲁棒和安全的串行决策是智能…

使用 Python 的 LSTM 进行股市预测

目录 一、说明 二、为什么需要时间序列模型&#xff1f; 三、下载数据 3.1 从 Alphavantage 获取数据 3.1 从 Kaggle 获取数据 3.3 数据探索 3.4 数据可视化 四、将数据拆分为训练集和测试集 五、数据标准化 六、通过平均进行一步预测 6.1 标准平均值 6.2 指数移动平均线 6.3 如…

包拯断案 | 集群备份续集:三招解决定时备份延迟@还故障一个真相

今天&#xff0c;小编给大家讲述自己亲身遇到的一个数据库集群备份问题&#xff0c;希望帮助DBA运维的你绕开这个烦恼&#xff0c;轻松找到答案&#xff01; 1、数据库集群在进行定时备份时&#xff08;从节点备份&#xff09;&#xff0c;出现了主从延迟较大的告警&#xff0c…

泽众Testone自动化测试平台,测试用例支持单个调试执行,同步查看执行日志

泽众Testone自动化测试平台之前版本&#xff0c;测试用例批量和单个执行&#xff0c;必须要通过测试集操作执行&#xff0c;操作略繁琐&#xff0c;我们通过本轮优化升级&#xff0c;测试用例直接可以单个调试执行&#xff0c;同步查看执行日志&#xff0c;操作上去繁就简&…

Windows搭建Jellyfin影音服务结合内网穿透实现公网访问本地视频文件

文章目录 1. 前言2. Jellyfin服务网站搭建2.1. Jellyfin下载和安装2.2. Jellyfin网页测试 3.本地网页发布3.1 cpolar的安装和注册3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5. 结语 1. 前言 随着移动智能设备的普及&#xff0c;各种各样的使用需求也被开发出来&…

windows ffmpeg7 通过rtsp拉取h265裸流

点击下边那个链接会转到github 下载完成后&#xff0c;添加include、lib到工程。 添加头文件&#xff1a; extern "C" { #include "libavcodec/avcodec.h" #include "libavformat/avformat.h" #include "libavformat/avio.h" #inclu…

总体标准差、样本标准差、标准误(标准误差)

下面是样例&#xff1a; 参考文章如何做好SCI论文中的标准误差图 - 知乎 (zhihu.com)

鸿蒙HarmonyOS 与 Android 的NDK有什么不一样?

鸿蒙&#xff08;HarmonyOS&#xff09;和Android的NDK&#xff08;Native Development Kit&#xff09;是两个不同的概念&#xff0c;它们在设计理念、架构、开发方式和目标平台等方面存在着一些显著的不同。让我们详细比较它们的特点和区别。 1. 设计理念和架构&#xff1a; …

雪亮工程视频联网综合管理/视频智能分析系统建设方案(二)

一、我国雪亮工程当前建设需求 1&#xff09;加强社会治安防控感知网络建设 加强社会治安防控智能感知网络建设&#xff0c;针对城中村、背街小巷、城乡结合部等重点区域建设安装视频监控设备&#xff0c;减少死角和盲区&#xff0c;与已有感知系统结合&#xff0c;形成高低搭…

【教程】四种方法将App打包为IPA文件类型

摘要 本教程总结了将App应用程序打包为IPA包的四种常用方法&#xff0c;包括Apple推荐的方式、iTunes拖入方法、自动编译脚本和解压改后缀名方法。每种方法都有其特点和适用场景&#xff0c;在实际开发中可以根据需求选择合适的方式进行打包。通过本教程&#xff0c;您将了解到…

windows10系统下TP-LINK万兆网卡属性配置高级说明

文章目录 打开配置属性说明ARP Offload&#xff1a;ARP地址解析协议卸载Downshift retries:降档重试次数Energy-Efficient Ethernet:高能效以太网Flow Control:流量控制Interrupt Moderation:中断调整Interrupt Moderation Rate:中断调节率IPv4 Checksum Offload:IPv4校验和卸载…

盲盒小程序带来的乐趣技术用代码如何形容?

星耀海贼萌袋抽卡潮玩小程序app盲盒软件定制 盲盒小程序带来的乐趣&#xff0c;技术人员可以用代码来形容&#xff0c;虽然代码本身并不具备直接描述情感的能力&#xff0c;但我们可以借助一些编程元素和概念来隐喻性地表达这种乐趣。 随机性的乐趣&#xff1a;盲盒小程序的核…

Jackson配置处理LocalDateTime、LocalDate等java8时间类型失效的问题解决

目录 前言 一、问题排查过程 1.1 SpringMvc是如何处理请求报文和响应报文 1.2 JacksonConfig配置排查 二、导致Jackson配置失效的原因 2.1 没有addSerializer 2.2 添加了EnableMvc注解 2.3 另外有地方配置了Jacksonhttpconver覆盖了配置 总结 前言 上一篇文章《使用Ja…

利用alibaba.item_get API接口,跨境电商如何快速获取商品详情?

利用alibaba.item_get API接口&#xff0c;跨境电商可以快速获取商品详情&#xff0c;为业务的开展提供有力支持。alibaba.item_get API接口是阿里巴巴开放平台提供的一项服务&#xff0c;它允许开发者通过调用API接口&#xff0c;获取阿里巴巴平台上商品的详细信息。以下是如何…

QT 线程之movetothread

上文列举了qt中线程的几种方法&#xff0c;其中2种方法最为常见。 这两种方法都少不了QThread类&#xff0c;前者继承于QThread类&#xff0c;后者复合QThread类。 本文以实例的方式描述了movetothread&#xff08;&#xff09;这种线程的方法&#xff0c;将QObject的子类移动…

如何使用Tomcat+cpolar搭建本地站点并发布到公网分享好友远程访问

文章目录 前言1.本地Tomcat网页搭建1.1 Tomcat安装1.2 配置环境变量1.3 环境配置1.4 Tomcat运行测试1.5 Cpolar安装和注册 2.本地网页发布2.1.Cpolar云端设置2.2 Cpolar本地设置 3.公网访问测试4.结语 前言 Tomcat作为一个轻量级的服务器拥有强大功能&#xff0c;由于其可以实…

Python初级第二次作业

一、 def reverse(num):anumt0b0cnumwhile a//10>0:if a%10>0:t1aa//10print(t)for i in range(t,-1,-1):if c%100:b0else:b(c%10)*(10**i)c//10print(b) if bnum:return Trueelse:return Falsedef isPalind(num):kreverse(num)if kTrue:print(f"{num}是回文&…

分类模型决策边界、过拟合、评价指标、PR、ROC曲线

文章目录 1、线性逻辑回归决策边界1.2、使用自定义函数绘制决策边界1.3、三分类的决策边界1.4、多项式逻辑回归决策边界 2、过拟合和欠拟合2.2、欠拟合2.3、过拟合 3、学习曲线4、交叉验证5、泛化能力6、混淆矩阵7、PR曲线和ROC曲线 x2可以用x1来表示 1、线性逻辑回归决策边界 …

【找工作最强助手】全平台自动投简历脚本:(boss、前程无忧、猎聘、拉勾、智联招聘)

get-jobs【工作无忧】 &#x1f4bc;自动投简历(Boss直聘、猎聘、拉勾、51job、智联招聘) 项目链接&#xff1a;https://github.com/loks666/get_jobs最新文档以上面的链接为主 特色功能 支持国内全部招聘平台(Boss直聘、猎聘、拉勾、51job、智联招聘)内置driver驱动&#xf…