证件照快速抠图更换背景 - Python OpenCV图像分割

news2024/11/25 8:21:09

需要更换证件照的背景,大多软件App直接收费或者需要支付后才可去水除印,本文公开不收费,欢迎使用,代码可在IDE如PyCharm或者Linux上直接运行,程序会自动安装依赖库OpenCV,如果觉得不错随手点个赞哦 :)

1.常用的图像分割算法

下面提供两种常用的图像分割算法,精确的图像分割之后可用于证件照替换背景。

1.1. GrabCut算法:

GrabCut是一种基于迭代优化的分割算法,它可以根据用户提供的矩形区域自动分割前景和背景。这个算法在前面的示例代码中已经提到过,它可以更精确地分割出前景对象,并进行背景替换。

1.2. 神经网络图像分割:

近年来,深度学习技术的发展使得神经网络图像分割算法变得流行。例如,U-Net、Mask R-CNN和DeepLab等神经网络模型可以用于图像分割任务。这些模型在训练阶段使用大量标注的图像数据,可以更准确地分割出前景对象。你可以通过使用已经训练好的模型或自行训练一个模型来进行图像分割和背景替换。

2.图像分割证件照快速抠图更换背景

2.1. 证件照背景色颜色定义RGB

尝试使用OpenCV库中的GrabCut算法进行图像分割证件照快速抠图更换背景。

常见证件照的背景颜色 RGB 值,注意OpenCV 颜色通道顺序为 B G R

# 定义常用背景颜色,注意OpenCV 颜色通道顺序为 B G R
blue_BGR = (240, 167, 2) # 蓝色
white_BGR = (255, 255, 255) # 白色
red_BGR = (27, 0, 217) # 红色
blue_white_BGR = (196, 146, 52) # 蓝白渐变色
light_gray_BGR = (210, 210, 210) # 浅灰色

2.2. 完整Python源码

图像分割证件照快速抠图更换背景

完整Python源码:

import cv2
import numpy as np
import concurrent.futures


def process_image(image, new_background_color):
    # 如果原图尺寸太大,可以进行图像压缩
    scale_percent = 50  # 压缩比例(50%)

    # 计算压缩后的图像尺寸
    width = int(image.shape[1] * scale_percent / 100)
    height = int(image.shape[0] * scale_percent / 100)
    dim = (width, height)

    # 调整图像尺寸
    resized_image = cv2.resize(image, dim, interpolation=cv2.INTER_AREA)

    # 进行图像处理
    result = grabcut_segmentation(resized_image, new_background_color)

    # 返回处理结果
    return result


def grabcut_segmentation(image, new_background_color):
    # 创建掩膜
    mask = np.zeros(image.shape[:2], np.uint8)

    # 定义GrabCut算法所需的前景和背景模型
    bgd_model = np.zeros((1, 65), np.float64)
    fgd_model = np.zeros((1, 65), np.float64)

    # 定义矩形区域,包含前景对象(根据实际需要调整矩形位置和大小)
    height, width = image.shape[:2]
    rect = (10, 10, width - 10, height - 10)

    # 执行GrabCut算法, 通过调整num_iterations参数来控制迭代次数,以平衡速度和准确性
    num_iterations = 5
    cv2.grabCut(image, mask, rect, bgd_model, fgd_model, num_iterations, cv2.GC_INIT_WITH_RECT)

    # 创建前景和背景掩膜
    mask_foreground = np.where((mask == 2) | (mask == 0), 0, 1).astype('uint8')
    mask_background = 1 - mask_foreground

    # 创建纯色背景图像
    background = np.zeros_like(image, np.uint8)
    background[:] = new_background_color

    # 将前景放在白色背景上
    foreground = cv2.bitwise_and(image, image, mask=mask_foreground)
    result = cv2.add(foreground, cv2.bitwise_and(background, background, mask=mask_background))

    return result


# 安装所需的依赖库
# 使用pip安装OpenCV
try:
    import cv2
except ImportError:
    import os
    import sys
    import subprocess

    def install(package):
        subprocess.check_call([sys.executable, "-m", "pip", "install", package])

    install("opencv-python")

# 定义常用背景颜色,注意OpenCV 颜色通道顺序为 B G R
blue_BGR = (240, 167, 2) # 蓝色
white_BGR = (255, 255, 255) # 白色
red_BGR = (27, 0, 217) # 红色
blue_white_BGR = (196, 146, 52) # 蓝白渐变色
light_gray_BGR = (210, 210, 210) # 浅灰色

new_background_color = blue_BGR  # 新的背景色

# 原图像和输出图像
image_path = 'input.jpg'
output_path = 'output.jpg'

# 读取原图像
image = cv2.imread(image_path)

# 使用多线程处理单张照片
with concurrent.futures.ThreadPoolExecutor() as executor:
    result = executor.submit(process_image, image, new_background_color)

# 获取处理结果
result = result.result()

# 显示和保存处理结果
cv2.imshow('Result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

# 保存结果图像
cv2.imwrite(output_path, result)

2.3. 代码运行,结果展示

3. 简单粗暴快速更换证件照背景颜色

最简单的办法是,圈出需要替换的颜色的范围,然后直接替换成期望的颜色即可。适用于主题前景包括人脸发色服装颜色跟背景颜色明显反差,比如红色和蓝色背景效果都不错。

3.1. 获取背景颜色RGB范围

使用画图/Paint工具打开需要处理的图片,使用颜色提取工具获得具体的颜色RGB值,随机取样几个点,如背景中心,头发和背景颜色边缘处,人脸和背景颜色边缘处,服装和背景颜色边缘处,获取背景色RGB的取值范围。

3.2. 替换背景颜色RGB取值范围

根据上述样本点的背景颜色RGB值,调整下面的背景颜色RGB取值范围,注意OpenCV 颜色通道顺序为 B G R

# 定义颜色范围 注意OpenCV 颜色通道顺序为 B G R
# 蓝色
lower_blue = np.array([100, 0, 0])  # 蓝色的下限(BGR格式)
upper_blue = np.array([255, 100, 100])  # 蓝色的上限(BGR格式)

3.3. 更换背景颜色完整Python源码

不需要压缩原图,不需要并行加速处理,因为处理方法简单,速度飞快。有时,最简单的办法就可以解决最初的需求。

import cv2
import numpy as np

# 用法
input_image_path = 'input_original.jpg'  # 输入图像路径
output_image_path = 'output_original.jpg'  # 输出图像路径

# 定义颜色范围 注意OpenCV 颜色通道顺序为 B G R
# 蓝色
lower_blue = np.array([100, 0, 0])  # 蓝色的下限(BGR格式)
upper_blue = np.array([255, 100, 100])  # 蓝色的上限(BGR格式)

# 红色
lower_red = np.array([0, 0, 100])  # 红色的下限(BGR格式)
upper_red = np.array([100, 100, 255])  # 红色的上限(BGR格式)

# 定义常用背景颜色,注意OpenCV 颜色通道顺序为 B G R
blue_BGR = [240, 167, 2] # 蓝色
white_BGR = [255, 255, 255] # 白色
red_BGR = [27, 0, 217] # 红色
blue_white_BGR = [196, 146, 52] # 蓝白渐变色
light_gray_BGR = [210, 210, 210] # 浅灰色

replacement_color = light_gray_BGR  # 替换的颜色(白色)

# 读取原始图像
image = cv2.imread(input_image_path)

# 创建蓝色的掩膜
blue_mask = cv2.inRange(image, lower_blue, upper_blue)

# 将蓝色区域替换为指定新的背景颜色
image[np.where(blue_mask)] = replacement_color

# 保存替换后的图像
cv2.imwrite(output_image_path, image)

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

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

相关文章

美客多平台运营策略揭秘,卖家如何实现安全稳定的测评!

要在美客多平台上取得成功,卖家需要具备一定的运营策略。本文将为大家分享一些关键的运营策略,帮助卖家在美客多平台上实现可持续发展。 一:优化商品页面,提升转化率 在美客多平台上,商品页面是吸引用户注意力的关键。…

c++中的map和set

文章目录 1. 关联式容器2. 键值对3. 树形结构的关联式容器3.1 set3.1.1 set的介绍3.1.2 set的使用 3.2 map3.2.1 map的介绍3.2.2 map的使用 3.3 multiset3.3.1 multiset的介绍3.3.2 multiset的使用 3.4 multimap3.4.1 multimap的介绍3.4.2 multimap的使用 1. 关联式容器 在初阶…

pycharm配置远程服务器

1.首先在服务器的一个位置创建一个文件夹 作为我们的工作文件夹,这里就命名为hhr。 2.配置我们的解释器 (实验室服务器python环境都配好了,我们只需要找到就可以了),这里可以连上Xhell之后输入python打开python解释器…

网工内推 | IT高级运维工程师,周末双休,包吃包住,14-20k

01 深圳朗特智能控制股份有限公司 招聘岗位:IT高级运维工程师 职责描述: 1、对集团网络基础架构的建设、运维、安全制定相关标准和准则; 2、负责集团数据中心、核心设备、信息安全的管理和运维; 3、执行网络、服务器、核心交换机…

【已解决】Operation timed out 问题

概述 今天遇到了这样一个有点奇葩的问题,再阿里云服务器上部署了Mysql服务,再使用NaviCat的过程中链接不上,connect to address IP地址: Operation timed out,最后是服务器防火墙的问题。 查看Mysql服务/端口 1.查看Mysql是否启…

解决loadDep:omelette: sill install loadAllDepsIntoIdealTree

报错信息如下: 解决方案: 1、设置为淘宝的镜像源 npm config set registry https://registry.npm.taobao.org 2、 命令检验是否成功 npm config get registry 3、继续运行npm install即可 npm install 运行效果:

C/C++ 中的函数返回局部变量以及局部变量的地址?

C/C中,函数内部的一切变量(函数内部局部变量,形参)都是在其被调用时才被分配内存单元。形参和函数内部的局部变量的生命期和作用域都是在函数内部(static变量的生命期除外)。子函数运行结束时,所有局部变量的内存单元会被系统释放。在C中&…

帮助文档Api

帮助文档Api 按照帮助文档的使用步骤学习Scanner类的使用,并实现键盘录入一个字符串,最后输出在控制台 部分Scanner的api文档如下: package com.api.Demo01;// 需要导入 Scanner包 import java.util.Scanner;public class Test01 {public sta…

千兆以太网传输层 UDP 协议原理与 FPGA 实现(UDP接收)

文章目录 前言心得体会一、 UDP 协议简单回顾二、UDP接收实现三、完整代码展示四、仿真测试(1)模拟电脑数据发送,(2)测试顶层文件编写(3)仿真文件(4)仿真波形前言 在前面我们对以太网 UDP 帧格式做了讲解,UDP 帧格式包括前导码+帧界定符、以太网头部数据、IP 头部数…

Ride基本使用

基本使用步骤: 创建项目(New Project)创建模块(New Directory)创建测试套件(New Suite)创建测试用例(New Test Case)创建资源文件(New Resource)创建业务关键字(New User Keyword)常用关键字用例编写robot报告显示 创建项目(New Project) File --> New Project…

程序无法启动,提示“找不到msvcp140.dll”或“msvcp140.dll缺失报错”解决方法

大家好!今天我来给大家分享一下msvcp140.dll丢失的解决方法。我们都知道,在运行一些软件或游戏时,经常会遇到“找不到msvcp140.dll”的错误提示,这会让我们非常苦恼。那么,这个问题该怎么解决呢?下面我将为…

如何理解分布式锁?

分布式锁的实现有哪些? 1.Memcached分布式锁 利用Memcached的add命令。此命令是原子操作,只有在key不存在的情况下,才能add成功,也就意味着线程得到了锁。 2.Reids分布式锁 和Memcached的方式类似,利用Redis的setn…

“益路同行”栏目专访第12期——泰格智能AI英语·李勤骞老师

中国善网在本届(第十届)慈展会上特别推出了《益路同行》采访栏目,《益路同行》栏目旨在寻觅公益之路上同行者的故事,挖掘公益更深层次的内涵,探索新时代公益发展道路。希望公益企业、人物、故事被更多人看到&#xff0…

HEC-RAS 1D/2D水动力与水环境模拟技术案例实践及拓展应用

水动力与水环境模型的数值模拟是实现水资源规划、环境影响分析、防洪规划以及未来气候变化下预测和分析的主要手段。然而,一方面水动力和水环境模型的使用非常复杂,理论繁复;另一方面,免费的水动力和水环境软件往往缺少重要功能&a…

蓝桥杯 字符串和日期

有一个类型的题目是找到输出图形的规律&#xff0c;然后将其实现。观察下面的图形。你想想你该怎么输出这个图形呢? ABBB#include<stdio.h> int main(){printf(" A\n");printf("BBB\n");return 0; }那么&#xff0c;对于如下的图形&#xff1a; ABB…

9 家用热水器用户行为分析与事件识别

第9章 家用热水器用户行为分析与事件识别 9.1 了解家用热水器用户行为分析的背景与步骤9.1.1 热水器采集数据基本情况9.1.2 熟悉家用热水器用户行为分析的步骤与流程 9.2 预处理热水器用户用水数据9.2.1 删除冗余特征9.2.2 划分用水事件9.2.3 确定单次用水事件时长阈值9.2.4 代…

C++并发与多线程(4) | 传递临时对象作为线程参数的一些问题Ⅰ

一、陷阱1 写一个传递临时对象作为线程参数的示例: #include <iostream> #include <vector> #include <thread> using namespace std;void myprint(const int& i, char* pmybuf) {cout << i << endl;cout << pmybuf << endl;r…

Python 无废话-基础知识列表list详讲

本文详细的介绍了在Python中如何处理list数据类型&#xff0c;涉及了Python 基础知识列表list 详讲&#xff0c;包含list 定义、遍历循环、元素获取、切片、添加、删除、查找元素&#xff0c;以后列表在函数、copy中使用。 列表List数据类型 列表特征 1) 列表中的各个元素&…

06. 机器学习入门2 - 理解特征和向量

文章目录 机器学习初探特征和向量机器学习的通用框架梯度下降 Hi, 你好。我是茶桁。 上一节课&#xff0c;咱们用一个案例引入了机器学习的话题&#xff0c;并跟大家讲了一下「动态规划」。 那这节课&#xff0c;我们要真正进入机器学习。 机器学习初探 在正式开始之前&…

什么是CAS机制?

CAS和Synchronized的区别是什么&#xff1f;适合什么样的场景&#xff1f;有什么样的优点和缺点&#xff1f; 示例程序&#xff1a;启动两个线程&#xff0c;每个线程中让静态变量count循环累加100次。 public class ThreadTest {private static int count 0;public static …