python(opencv2、PIL)将图片透明背景转换成白色背景的两种方法

方法一:使用OpenCV的函数封装

pip install opencv-python
import cv2
import numpy as npdef convert_transparent_to_white_opencv(input_image_path, output_image_path):"""将透明背景的图片转换为白色背景,使用OpenCV实现。参数:input_image_path: str,输入图片的路径output_image_path: str,输出图片的路径返回:无"""# 读取带透明背景的图片(假设图片是PNG格式)img = cv2.imread(input_image_path, cv2.IMREAD_UNCHANGED)# 检查是否读取成功if img is None:raise ValueError(f"Image at path {input_image_path} could not be read.")# 分离RGBA通道b, g, r, a = cv2.split(img)# 创建一个与Alpha通道大小相同的全白背景white_background = np.ones_like(a) * 255# 将Alpha通道归一化到0-1范围a = a / 255.0# 按照Alpha通道的透明度混合原图和白色背景r = r * a + white_background * (1 - a)g = g * a + white_background * (1 - a)b = b * a + white_background * (1 - a)# 合并BGR通道result = cv2.merge((b, g, r))# 保存处理后的图片cv2.imwrite(output_image_path, result)# 示例调用
convert_transparent_to_white_opencv('input_image.png', 'output_image_opencv.png')

方法二:使用PIL的函数封装

pip install pillow
from PIL import Imagedef convert_transparent_to_white_pil(input_image_path, output_image_path):"""将透明背景的图片转换为白色背景,使用PIL实现。参数:input_image_path: str,输入图片的路径output_image_path: str,输出图片的路径返回:无"""# 读取带透明背景的图片(假设图片是PNG格式)img = Image.open(input_image_path).convert("RGBA")# 创建一个与原图片大小相同的白色背景white_background = Image.new("RGB", img.size, (255, 255, 255))# 将原图片粘贴到白色背景上,并使用Alpha通道作为掩码white_background.paste(img, (0, 0), img)# 保存处理后的图片white_background.save(output_image_path)# 示例调用
convert_transparent_to_white_pil('input_image.png', 'output_image_pil.png')

详细解释

OpenCV方法函数封装

  1. 函数定义:定义一个函数convert_transparent_to_white_opencv,接受输入图片路径和输出图片路径作为参数。
  2. 读取图片:在函数内部使用cv2.imread()读取图片,并进行透明通道处理。
  3. 图像处理:按之前的步骤进行通道分离、创建白色背景、图像合成。
  4. 保存图片:将处理后的图片保存到指定路径。

PIL方法函数封装

  1. 函数定义:定义一个函数convert_transparent_to_white_pil,接受输入图片路径和输出图片路径作为参数。
  2. 读取图片:在函数内部使用Image.open()读取图片,并进行透明通道处理。
  3. 图像粘贴:按之前的步骤创建白色背景,将原图粘贴到白色背景上。
  4. 保存图片:将处理后的图片保存到指定路径。

通过上述封装函数,可以更方便地将带透明背景的图片转换为白色背景的图片。


可以将带透明背景的图片转换为任意颜色背景的图片,并在任意颜色背景之间进行转换。以下是使用OpenCV和PIL的方法,并进行了函数封装,允许用户指定任意背景颜色。

1, 使用OpenCV的函数封装

import cv2
import numpy as npdef convert_transparent_to_color_opencv(input_image_path, output_image_path, bg_color=(255, 255, 255)):"""将透明背景的图片转换为任意颜色背景,使用OpenCV实现。参数:input_image_path: str,输入图片的路径output_image_path: str,输出图片的路径bg_color: tuple,背景颜色(默认为白色 (255, 255, 255))返回:无"""# 读取带透明背景的图片(假设图片是PNG格式)img = cv2.imread(input_image_path, cv2.IMREAD_UNCHANGED)# 检查是否读取成功if img is None:raise ValueError(f"Image at path {input_image_path} could not be read.")# 分离RGBA通道b, g, r, a = cv2.split(img)# 创建一个与Alpha通道大小相同的指定颜色背景background = np.ones_like(a) * np.array(bg_color[::-1], dtype=np.uint8)[:, None, None]# 将Alpha通道归一化到0-1范围a = a / 255.0# 按照Alpha通道的透明度混合原图和背景r = r * a + background[0] * (1 - a)g = g * a + background[1] * (1 - a)b = b * a + background[2] * (1 - a)# 合并BGR通道result = cv2.merge((b, g, r))# 保存处理后的图片cv2.imwrite(output_image_path, result)# 示例调用
convert_transparent_to_color_opencv('input_image.png', 'output_image_opencv.png', bg_color=(0, 128, 255))

2, 使用PIL的函数封装

from PIL import Imagedef convert_transparent_to_color_pil(input_image_path, output_image_path, bg_color=(255, 255, 255)):"""将透明背景的图片转换为任意颜色背景,使用PIL实现。参数:input_image_path: str,输入图片的路径output_image_path: str,输出图片的路径bg_color: tuple,背景颜色(默认为白色 (255, 255, 255))返回:无"""# 读取带透明背景的图片(假设图片是PNG格式)img = Image.open(input_image_path).convert("RGBA")# 创建一个与原图片大小相同的指定颜色背景图像background = Image.new("RGB", img.size, bg_color)# 将原图片粘贴到指定颜色背景上,并使用透明度作为掩码background.paste(img, (0, 0), img)# 保存处理后的图片background.save(output_image_path)# 示例调用
convert_transparent_to_color_pil('input_image.png', 'output_image_pil.png', bg_color=(0, 128, 255))
详细解释
OpenCV方法函数封装
  1. 函数定义:定义一个函数convert_transparent_to_color_opencv,接受输入图片路径、输出图片路径和背景颜色作为参数。
  2. 读取图片:在函数内部使用cv2.imread()读取带有透明背景的图片,并进行透明通道处理。
  3. 检查是否读取成功:确保图片成功读取,否则抛出异常。
  4. 分离RGBA通道:使用cv2.split()将图片分离为四个通道(RGBA)。
  5. 创建背景:创建一个与Alpha通道大小相同的指定颜色背景,颜色转换为BGR顺序以符合OpenCV的颜色顺序。
  6. 图像合成:将Alpha通道归一化到0-1范围,并按照Alpha通道的透明度混合原图和背景。
  7. 合并通道并保存图片:合并BGR通道,并保存处理后的图片。
PIL方法函数封装
  1. 函数定义:定义一个函数convert_transparent_to_color_pil,接受输入图片路径、输出图片路径和背景颜色作为参数。
  2. 读取图片:在函数内部使用Image.open()读取带有透明背景的图片,并转换为RGBA模式。
  3. 创建背景:创建一个与原图片大小相同的指定颜色背景图像。
  4. 图像粘贴:使用paste()方法将原图粘贴到背景上,并使用透明度作为掩码。
  5. 保存图片:保存处理后的图片。

这两种方法都可以将透明背景转换为任意颜色背景,并支持在任意颜色背景之间进行转换。可以根据具体需求选择合适的工具和方法。


使用OpenCV将图片透明背景添加稍微大一点的白色背景

import cv2
import numpy as npdef add_white_background_with_padding_opencv(input_image_path, output_image_path, padding=10):"""将透明背景的图片转换为带有稍微大一点的白色背景的图片,使用OpenCV实现。参数:input_image_path: str,输入图片的路径output_image_path: str,输出图片的路径padding: int,背景的扩展大小(默认为10像素)返回:无"""# 读取带透明背景的图片(假设图片是PNG格式)img = cv2.imread(input_image_path, cv2.IMREAD_UNCHANGED)# 检查是否读取成功if img is None:raise ValueError(f"Image at path {input_image_path} could not be read.")# 分离RGBA通道b, g, r, a = cv2.split(img)# 获取原图片的尺寸height, width = a.shape# 创建一个稍微大一点的白色背景new_height = height + 2 * paddingnew_width = width + 2 * paddingwhite_background = np.ones((new_height, new_width, 3), dtype=np.uint8) * 255# 将Alpha通道归一化到0-1范围a = a / 255.0# 创建一个新的RGBA图像并将原图像放到中央result = np.zeros((new_height, new_width, 3), dtype=np.uint8)for c in range(3):result[padding:padding + height, padding:padding + width, c] = img[:, :, c] * a + white_background[padding:padding + height, padding:padding + width, c] * (1 - a)# 保存处理后的图片cv2.imwrite(output_image_path, result)# 示例调用
add_white_background_with_padding_opencv('input_image.png', 'output_image_with_padding.png', padding=20)
详细解释
  1. 函数定义:定义一个函数add_white_background_with_padding_opencv,接受输入图片路径、输出图片路径和背景扩展大小作为参数。
  2. 读取图片:使用cv2.imread()读取带有透明背景的图片,并指定cv2.IMREAD_UNCHANGED以确保读取透明通道(Alpha通道)。
  3. 检查是否读取成功:确保图片成功读取,否则抛出异常。
  4. 分离RGBA通道:使用cv2.split()将图片分离为四个通道(RGBA)。
  5. 获取原图片尺寸:获取原图片的高度和宽度。
  6. 创建白色背景:创建一个稍微大一点的白色背景,背景大小为原图片大小加上两倍的扩展大小。
  7. 将Alpha通道归一化:将Alpha通道的值归一化到0-1范围。
  8. 图像合成:创建一个新的图像,并将原图像放到中央,同时根据Alpha通道的透明度混合原图和白色背景。
  9. 保存处理后的图片:将处理后的图片保存到指定路径。

通过这种方法,可以将带透明背景的图片转换为带有稍微大一点白色背景的图片。

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

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

相关文章

服务器的分类有哪些

1、根据体系结构不同,服务器可以分成两大重要的类别:IA架构服务器和RISC架构服务器。   这种分类标准得主要依据是两种服务器采用得处理器体系结构不同。RISC架构服务器采用得CPU是所谓的精简指令集的处理器,精简指令集CPU的主要特点是采用…

Windows7彻底卸载mysql

1.控制面板卸载mysql 2.删除C:\Program Files\MySQL 3.删除C:\用户\Administrator\App Data\Roaming\MySQL”(App Data默认隐藏,需要在文件夹和搜索选项中勾选显示文件夹),为了删除的更彻底,可以直接在计算机全盘搜索MySQL关键字,将所有找到…

华为机试HJ53杨辉三角的变形

华为机试HJ53杨辉三角的变形 题目: 求杨辉三角中第n行第一个偶数出现的位置。 想法: 杨辉三角中存在规律,除了第一行与第二行没有偶数外,从第三行开始第一个偶数出现的位置以(2,3,2&#xf…

mamba如何解决version `GLIBCXX_3.4.29‘ not found的问题

参考 如何解决version GLIBCXX_3.4.29‘ not found的问题_glibcxx not found-CSDN博客 用mamba时,出现报错 ImportError: /lib/x86_64-linux-gnu/libstdc.so.6: version GLIBCXX_3.4.29 not found 解决 #查找系统中的许多libstdc.so.6 sudo find / -name libstd…

软件测试下的AI之路(5)

😏作者简介:博主是一位测试管理者,同时也是一名对外企业兼职讲师。 📡主页地址:【Austin_zhai】 🙆目的与景愿:旨在于能帮助更多的测试行业人员提升软硬技能,分享行业相关最新信息。 💎声明:博主日常工作较为繁忙,文章会不定期更新,各类行业或职场问题欢迎大家…

实现不同的数据库之间的同步方式

第一种 实时同步 针对实时性要求比较高的场景可以使用canal中间件实现,我们内部的大数据项目中也有用dataX的。 canal 的主要用途是基于mysql数据库增量日志解析,并能提供新增量数据订阅和消费,从而实现数据同步。其主要是基于mysql 的binlo…

多数据库支持在PHP框架中的实现策略与实践

在现代Web开发中,随着应用规模的扩大和业务需求的多样化,单一数据库往往难以满足所有需求。多数据库支持,即在一个应用程序中使用多个数据库系统,已经成为许多项目的标准配置。本文将详细介绍如何在PHP框架中实现多数据库支持&…

QT中常用英语单词

Qt (.n): 一个跨平台的C应用程序开发框架,广泛用于开发GUI应用程序。Widget (.n): 在Qt中,一个widget指的是一个可视化的用户界面元素,如按钮、文本框等。Signal and Slot (.n): Qt特有的通信机制。Signal是某个特定事件发生时发出的信号&…

Unity之Text组件换行\n没有实现+动态中英互换

前因:文本中的换行 \n没有换行而是打印出来了,解决方式 因为unity会默认把\n替换成\\n 面板中使用富文本这个选项啊 没有用 m_text.text = m_text.text.Replace("\\n", "\n"); ###动态中英文互译 using System.Collections; using System.Collections…

20240708 多模态大模型

参考网站: 微软Florence-2官宣开源,一统视觉基础模型!华人团队联手打造 自监督学习修炼之MoCov1与MoCov2 - 知乎 CLIP图像编码resnet50和transformer区别 CLIP (Contrastive Language-Image Pre-training) 是一个结合了图像和文本的跨模态…

顺序表与链表

前言: 顺序表和链表是属于数据结构中比较基础的知识,我们需要对其进行掌握。在JAVA原生标准库中分别为ArrayList和LinkedList。下图是整个数据结构之间的结构框图 1.ArrayList 背后用来存储数据的是一个数组,所以用ArrayList来进行相关操作…

【ai】决策树

决策树 决策树是一种监督学习算法,主要用于分类和回归任务。它通过对数据进行树状结构的分割来进行预测。决策树的主要优点包括易于理解和解释、处理数值型和分类型数据的能力以及对特征缩放不敏感。以下是决策树的基本概念和主要应用。决策树的基本概念 节点(Node): 根节…

前端面试题23(css3)

关于CSS3的面试题,我们可以从多个维度来探讨,包括但不限于选择器、盒模型、布局技术、动画与过渡、响应式设计等。下面我会列举一些典型的CSS3面试问题,并尽可能提供详细的解答或示例代码。 1. CSS3中新增了哪些选择器? 答案: C…

面试知识点【java基础篇】

1、一个程序有且仅有一个main方法启动,main方法是作为java程序启动的唯一入口。 public static void main(String[] args) {Student student new Student(11,"111");System.out.println(student);} 权限修饰符:public:修饰一个类是公开的 pub…

JAVA之(static关键字、final关键字)

JAVA之(static关键字、final关键字) 一、 static关键字1、静态变量2、静态方法3、 静态代码块4、例子 二、final关键字1、final修饰类2、 final修饰方法3、修饰变量 一、 static关键字 1、静态变量 private static String str1“staticProperty”2、静…

SAP 无权限的解决

在进行SAP操作过程中,经常会出现无权限的情况,如客户说没有“ABAAL计划外折旧”权限 但是在查看SU01的时候,已经有角色分配了 解决:1、ABAA之后,SU53查看2、 2、PFCG查找到角色手动添加权限对象S_TCODDE,之后更新&…

JavaScript let 和 const

JavaScript let 和 const 在JavaScript中,let和const是用于声明变量的关键字,它们是在ES6(ECMAScript 2015)引入的,旨在提供更灵活和安全的变量声明方式。在这篇文章中,我们将深入探讨let和const的关键特性…

YOLOv9报错:AttributeError: ‘list‘ object has no attribute ‘view‘

报错信息如下: red_distri, pred_scores torch.cat([xi.view(feats[0].shape[0], self.no, -1) for xi in feats], 2).split( AttributeError: ‘list’ object has no attribute ‘view’ 解决方法: 去yolov9/utils/loss_tal.py把167行代码更改&#…

Trinity:转录组从头组装

安装 #下载安装包 wget -c https://github.com/trinityrnaseq/trinityrnaseq/releases/download/Trinity-v2.15.1/trinityrnaseq-v2.15.1.FULL.tar.gztar -xzvf trinityrnaseq-v2.15.1.FULL.tar.gz cd trinityrnaseq-v2.15.1 make make plugins #安装依赖 mamba install -c bio…

C语言相关内容模块

C语言相关内容模块 1、函数指针定义方式 1、函数指针定义方式 函数指针的具体用法