python-修改图片背景色
在Python中,可以使用图像处理库(如OpenCV或Pillow)来修改图片的背景色。通常,修改背景色的流程包括以下步骤:
1、对图片进行分割,识别前景和背景。
2、对背景区域进行颜色替换。
下面是两种实现方法:基于OpenCV和Pillow。
方法1:使用OpenCV修改背景色
OpenCV 提供了许多工具,可以对图片进行处理,例如背景分割和颜色替换。可以使用掩码(mask)来区分前景和背景。
示例代码
import cv2
import numpy as npdef change_background_color(image_path, new_background_color=(255, 0, 0)):# 读取图像image = cv2.imread(image_path)# 转换为RGB格式image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)# 创建初始的掩码(mask)mask = np.zeros(image.shape[:2], dtype=np.uint8)# 使用 GrabCut 算法分割前景和背景bg_model = np.zeros((1, 65), np.float64) # 背景模型fg_model = np.zeros((1, 65), np.float64) # 前景模型rect = (10, 10, image.shape[1]-10, image.shape[0]-10) # 初始化矩形框,接近整个图像cv2.grabCut(image, mask, rect, bg_model, fg_model, 5, cv2.GC_INIT_WITH_RECT)# 转换 mask 为二值化:前景为 1,背景为 0mask = np.where((mask == cv2.GC_PR_FGD) | (mask == cv2.GC_FGD), 1, 0).astype('uint8')# 分离前景和背景foreground = cv2.bitwise_and(image, image, mask=mask)# 处理背景:将背景设置为新的颜色background = np.full_like(image, new_background_color, dtype=np.uint8)background_mask = 1 - maskbackground = cv2.bitwise_and(background, background, mask=background_mask)# 合并前景和背景result = cv2.add(foreground, background)# 转换回 BGR 并保存结果result_bgr = cv2.cvtColor(result, cv2.COLOR_RGB2BGR)cv2.imwrite("result.jpg", result_bgr)print("背景修改完成,已保存到 result.jpg")cv2.imshow("Result Image", result_bgr)cv2.waitKey(0)cv2.destroyAllWindows()
# 调用函数,设置背景颜色为红色
change_background_color("input.jpg", new_background_color=(255, 0, 0)) # 背景改为红色
说明:
cv2.grabCut:用来对图片进行分割,生成前景和背景的掩码。
新背景颜色通过 np.full_like() 填充为固定颜色。
最终图像通过 cv2.add() 合并前景和新背景。
方法2:使用Pillow修改背景色
对于简单的图片可以直接使用基于颜色分割的方法来修改背景色。例如,设置某个 RGB 背景颜色为新颜色。
示例代码
from PIL import Imagedef change_background_color(image_path, new_background_color=(255, 0, 0)):# 打开图片image = Image.open(image_path).convert("RGBA")data = image.getdata()# 定义新的像素数据new_data = []for item in data:if item[0] > 240 and item[1] > 240 and item[2] > 240: # 判断背景区域(接近白色)new_data.append((*new_background_color, 255)) # 替换为新的背景颜色else:new_data.append(item) # 保留原来的前景内容# 应用新的数据并保存图片image.putdata(new_data)image.save("result.png")print("背景修改完成,已保存到 result.png")
# 修改背景颜色为红色
change_background_color("input.png", new_background_color=(255, 0, 0))
说明:
item[0] > 240 and item[1] > 240 and item[2] > 240: 检查像素是否接近白色(背景色),可以根据具体图片调整此逻辑。
新的背景颜色通过 (255, 0, 0) 指定。
方法3:在复杂图片中使用预定义分割(如 Deeplab)
对于复杂图片(背景颜色复杂、不均匀),基于深度学习的语义分割可以更准确地识别前景和背景。使用 TensorFlow 的 Deeplab 模型进行图像语义分割,然后替换背景颜色。
示例代码
import tensorflow as tf
import tensorflow_hub as hub
import numpy as np
import cv2
from PIL import Image# 加载 DeepLab 模型
def load_model():model_url = "https://tfhub.dev/google/tf2-preview/deeplabv3/4" # DeepLab 模型的 URLmodel = hub.load(model_url) # 加载模型return model# 进行语义分割
def segment_image(image_path, model):# 加载图片original_image = Image.open(image_path)original_image = original_image.convert("RGB") # 转换为 RGB 格式original_image = np.array(original_image)# 调整大小以符合模型输入resized_image = tf.image.resize(original_image, [513, 513])resized_image = tf.cast(resized_image, tf.uint8)# 语义分割segmentation_result = model.signatures['serving_default'](tf.constant(resized_image[tf.newaxis, ...]))mask = segmentation_result['semantic_predictions'][0].numpy()# 将 mask 调整到原始图片大小mask_resized = cv2.resize(mask, (original_image.shape[1], original_image.shape[0]), interpolation=cv2.INTER_NEAREST)return original_image, mask_resized# 修改背景颜色
def change_background_color(image, mask, new_background_color=(255, 0, 0)):# 创建新的背景background = np.full_like(image, new_background_color, dtype=np.uint8)# 通过 mask 识别前景和背景foreground = np.where(mask[..., None] == 15, image, background) # 15是指定目标类的标签(需根据数据决定)return foreground# 主流程
def main():# 图片路径image_path = "input.jpg" # 替换为你的图片路径new_background_color = (255, 0, 0) # 红色背景# 加载 DeepLab 模型model = load_model()# 使用模型进行分割original_image, mask = segment_image(image_path, model)# 修改背景颜色result_image = change_background_color(original_image, mask, new_background_color)# 保存结果result_image_pil = Image.fromarray(result_image)result_image_pil.save("output.jpg")print("背景修改完成,已保存到 'output.jpg'")# 执行流程
main()
代码解析
1. 加载 DeepLab 模型
通过 tensorflow_hub 加载预训练模型,这里使用 DeepLabV3(版本 4),适合进行复杂图片的语义分割。
模型预训练地址:
https://tfhub.dev/google/tf2-preview/deeplabv3/4
2. 图像预处理
将输入图片转为 RGB 格式,并调整大小为 513x513,这是 DeepLab 模型的标准输入大小。
3. 获取语义分割 Mask
DeepLab 模型输出一个 mask 数组,里面包含每个像素的分类标签。例如:
分类标签 0 可能表示背景,
标签 15 可能表示人类(或者其他目标类,需根据 DeepLab 模型的标签定义调整)。
4. 修改背景颜色
使用 np.where 根据分割得到的 Mask 区别前景和背景:
将原始图片中属于背景的部分替换为新背景颜色。
保存处理后的图片。
注意事项
1、选择合适的算法:
如果背景颜色比较单一,可以使用简单的颜色分割(基于 RGB)。
如果背景复杂且目标内容较多,需要使用前景分割算法(如 GrabCut 或基于深度学习的模型)。
2、调整颜色阈值:
在图像中分割背景时,可以调整 RGB 值或分割算法的参数以获得更好的效果。
3、图片质量和背景复杂度:
对于图片背景较复杂或有渐变,会对分割算法提出更高的要求。
相关文章:
python-修改图片背景色
在Python中,可以使用图像处理库(如OpenCV或Pillow)来修改图片的背景色。通常,修改背景色的流程包括以下步骤: 1、对图片进行分割,识别前景和背景。 2、对背景区域进行颜色替换。 下面是两种实现方法&#x…...

卡洛诗,将高端西餐的冗余价值转化为普惠体验
西餐市场正经历一场结构性变革,一二线城市的高端西餐陷入内卷,而下沉市场却因品质与价格断层陷入选择困境——消费者既不愿为高价西餐的面子溢价买单,又难以忍受快餐式西餐的粗糙体验。这一矛盾催生了万亿级的市场真空地带,萨莉亚…...
【ROS2】ROS节点启动崩溃:rclcpp::exceptions::RCLInvalidArgument
1、问题描述 启动ROS节点时,直接崩溃,打印信息如下: terminate called after throwing an instance of rclcpp::exceptions::RCLInvalidArgumentwhat(): failed to create guard condition: context argument is null, at ./src/rcl/guard_condition.c:65 [ros2run]: Abo…...

Flutter在键盘的上方加一个完成按钮
有些情况下,输入框在输入键盘弹出后, 需要在键盘的上方显示一个toolbar , 然后 toolbar 上面一个完成按钮,点完成按钮把键盘关闭。 如图: 直接上代码,这样写的好处是,把 TextField 给封装了&…...

SQL注入---05--跨站注入
1 权限说明 select * from mysql.user; 这里的Y表示我前面的命令权限为root,n表示不支持root权限 导致结果: 如果为root的话,我就可操作这些命令并且可以进行跨数据库攻击,但是如果不是高权限root就无法执行这些操作 2 root权限…...
Vue 学习随笔系列二十三 -- el-date-picker 组件
el-date-picker 组件 文章目录 el-date-picker 组件el-date-picker 只有某些日期可选 el-date-picker 只有某些日期可选 <template><div><el-form ref"form" size"mini":model"form" :rules"rules"label-width"8…...

【免费分享】虚拟机VM(适用于 Windows)17.6.3
—————【下 载 地 址】——————— 【本章下载一】:https://drive.uc.cn/s/7c4da5cd2af64 【本章下载二】:https://pan.xunlei.com/s/VOQDkRRKc5OUVTauZezaiDEHA1?pwdpybg# 【百款黑科技】:https://ucnygalh6wle.feishu.cn/wiki/…...
Oracle中的select1条、几条、指定范围的语句
在Oracle中,可以使用不同的方法来选择一条记录、多条记录或指定范围内的记录。以下是具体的实现方式: 1. 查询单条记录 使用ROWNUM伪列限制结果为1条: SELECT * FROM your_table WHERE ROWNUM 1;特点:Oracle会在结果集生成时分…...

2025 后端自学UNIAPP【项目实战:旅游项目】5、个人中心页面:微信登录,同意授权,获取用户信息
一、框架以及准备工作 1、前端项目文件结构展示 2、后端项目文件结构展示 3、登录微信公众平台,注册一个个人的程序,获取大appid(前端后端都需要)和密钥(后端需要) 微信公众平台微信公众平台&…...
校园网规划与设计方案
一、项目概述 校园网是学校实现信息化教学、科研与管理的重要基础设施,其性能与稳定性直接影响学校的整体发展。随着学校规模不断扩大、教学科研活动日益丰富,对校园网的带宽、可靠性、安全性以及智能化管理等方面提出了更高要求。本规划与设计方案旨在构建一个高速、稳定、…...

蓝桥杯算法题 -蛇形矩阵(方向向量)
🎁个人主页:工藤新一 🔍系列专栏:C面向对象(类和对象篇) 🌟心中的天空之城,终会照亮我前方的路 🎉欢迎大家点赞👍评论📝收藏⭐文章 文章目录 P…...

配置VScodePython环境Python was not found;
Python was not found; run without arguments to install from the Microsoft Store, or disable this shortcut from Settings > Manage App Execution Aliases. 候试试重启电脑。 在卸载重装python后会出现难以解决的局面,系统变量,命令行&#…...

ollama 重命名模型
ollama 重命名模型 ollama list# 查看列表 ollama list # 生成原模型的Modelfile文件 ollama show --modelfile qwen3:32b > Modelfile # 从Modelfile文件创建新的模型 ollama create qwen3 -f Modelfile # 删除原模型 ollama rm qwen3:32b...

Qt信号槽机制与UI设计完全指南:从基础原理到实战应用
目录 前言一、信号槽1.1 传参1.2 Qt信号与槽的对应关系1.2.1一对多关系1.2.2 多对一关系 二、Designer三、Layout 布局3.1 基础用法3.2 打破布局3.3 贴合窗口3.4 伸展器(Spacer)3.5 嵌套布局 四、ui指针五、QWidget六、QLabel 标签使用指南总结 前言 本…...
Anaconda环境中conda与pip命令的区别
文章目录 conda与pip的基本区别在Anaconda环境中的实际差异安装包环境管理依赖解决示例最佳实践建议 常见问题解答 conda与pip的基本区别 包来源与生态系统 conda:从Anaconda默认仓库或conda-forge等渠道获取包 不仅管理Python包,还能管理非Python依赖&…...

XBL6501/02/03在POE设备上的应用方案
前言: 在当今数字化时代,POE(Power over Ethernet)设备因其能够通过以太网线同时传输数据和电力而被广泛应用。为了满足这些设备日益增长的电源需求,芯伯乐推出了XBL6501/02/03系列DC-DC电源芯片,为POE设备…...

编程题 03-树2 List Leaves【PAT】
文章目录 题目输入格式输出格式输入样例输出样例 题解解题思路完整代码 编程练习题目集目录 题目 Given a tree, you are supposed to list all the leaves in the order of top down, and left to right. 输入格式 Each input file contains one test case. For each case, …...

生信小白学Rust-03
语句和表达式 举个栗子🌰 fn add_with_extra(x: i32, y: i32) -> i32 {let x x 1; // 语句let y y 5; // 语句x y // 表达式 } // 语句执行操作 // 表达式会返回一个值 怎么区分呢,目前我的理解是只要返回了值,那它就是表达式 fn…...

缺乏需求优先级划分时,如何合理分配资源?
当需求优先级不明确时,合理分配资源的关键在于建立统一评估标准、实施敏捷资源管理、提升团队协作效率、加强跨部门沟通机制。尤其是建立统一评估标准至关重要,它能帮助组织快速判断各项需求的重要性与紧迫性,从而实现资源的动态匹配与有效利…...

操作系统学习笔记第3章 内存管理(灰灰题库)
1. 单选题 某页式存储管理系统中,主存为 128KB,分成 32 块,块号为 0、1、2、3、…、31。某作业有 5 块,其页号为 0、1、2、3、4,被分别装入主存的 3、8、4、6、9 块中。有一逻辑地址为 [3, 70](其中方括号中…...

详细分析python 中的deque 以及和list 的用法区别
dqque :双端队列,可以快速的从另外一侧追加和推出对象,deque是一个双向链表,针对list连续的数据结构插入和删除进行优化。它提供了两端都可以操作的序列,这表示在序列的前后你都可以执行添加或删除操作。 通过上图可以看出,deque …...

Stack overflow
本文来源 :腾讯元宝 Stack Overflow - Where Developers Learn, Share, & Build Careers 开发者学习,分享 通过学习、工作和经验积累等方式,逐步建立和发展自己的职业生涯。 Find answers to your technical questions and help othe…...

和为target问题汇总
文章目录 习题377.组合总和 IV494.目标和 和为target的问题,可以有很多种问题的形式的考察,当然,及时的总结与回顾有利于我们熟练掌握这些知识! 习题 377.组合总和 IV 377.组合总和 IV 思路分析:通过观察࿰…...

STM32单片机内存分配详细讲解
单片机的内存无非就两种,内部FLASH和SRAM,最多再加上一个外部的FLASH拓展。在这里我以STM32F103C8T6为例子讲解FLASH和SRAM。 STM32F103C8T6具有64KB的闪存和20KB的SRAM。 一. Flash 1.1 定义 非易失性存储器,即使在断电后,其所…...
RedHat7 如何更换yum镜像源
RedHat7如何更换yum镜像源? # 删除系统自带 yum rpm -qa|grep -e yum -e python-urlgrabber |xargs rpm -e --nodeps# 下载yum与wget的rpm软件包 curl -O http://mirrors.aliyun.com/centos/7/os/x86_64/Packages/yum-3.4.3-168.el7.centos.noarch.rpm curl -O ht…...

Ubuntu 编译SRS和ZLMediaKit用于视频推拉流
SRS实现视频的rtmp webrtc推流 ZLMediaKit编译生成MediaServer实现rtsp推流 SRS指定某个固定网卡,修改程序后重新编译 打开SRS-4.0.0/trunk/src/app/srs_app_rtc_server.cpp,在 232 行后面添加: ZLMediaKit编译后文件存放在ZLMediakit/rele…...

Intellij报错:the file size(3.47M) exceeds configured limit (2.56MB)
今天在部署一个教学平台的时候,当执行数据库脚本出现了以上问题。 自己把解决的方案分享给大家: 于IntelliJ IDEA或PyCharm,可以通过编辑idea.properties文件来增加文件大小限制。 打开idea.properties文件,通常位于IDE的安装目录…...
大数据技术全景解析:Spark、Hadoop、Hive与SQL的协作与实战
引言:当数据成为新时代的“石油” 在数字经济时代,数据量以每年50%的速度爆发式增长。如何高效存储、处理和分析PB级数据,成为企业竞争力的核心命题。本文将通过通俗类比场景化拆解,带你深入理解四大关键技术:Hadoop、…...
软考软件评测师——软件工程之系统维护
一、系统质量属性 可维护性 衡量软件系统适应修改的难易程度,包括修复缺陷、扩展功能或调整规模的效率。计算公式为:系统可用时间占比 1/(1平均修复时间),其中平均修复时间(MTTR)指排除故障所需的平均耗时。 可靠性 vs 可用性 可靠性&…...

Unity动画与生命周期函数
一、Animator动画组件 Animator组件是Unity中用于管理和控制动画的主要工具,它可以处理复杂的动画状态机和动画片段之间的过 1.动画状态机 Animator组件的核心是动画状态机,它由多个动画状态和状态之间的过渡组成。可以通过Unity的动画窗口来创建和编辑…...