python将图片透明背景转为白色背景的两种方法

 更新时间:2025年05月14日 10:55:07   作者:去追风,去看海  
这篇文章主要为大家详细介绍了python如何使用opencv2和PIL实现将图片透明背景转换成白色背景功能,感兴趣的小伙伴可以跟随小编一起学习一下

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

安装库

pip install opencv-python

实现代码

import cv2
import numpy as np

def 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 Image

def 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方法函数封装

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

PIL方法函数封装

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

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

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

1, 使用OpenCV的函数封装

import cv2
import numpy as np

def 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 Image

def 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))

详细解释

1.OpenCV方法函数封装

  • 函数定义:定义一个函数convert_transparent_to_color_opencv,接受输入图片路径、输出图片路径和背景颜色作为参数。
  • 读取图片:在函数内部使用cv2.imread()读取带有透明背景的图片,并进行透明通道处理。
  • 检查是否读取成功:确保图片成功读取,否则抛出异常。
  • 分离RGBA通道:使用cv2.split()将图片分离为四个通道(RGBA)。
  • 创建背景:创建一个与Alpha通道大小相同的指定颜色背景,颜色转换为BGR顺序以符合OpenCV的颜色顺序。
  • 图像合成:将Alpha通道归一化到0-1范围,并按照Alpha通道的透明度混合原图和背景。
  • 合并通道并保存图片:合并BGR通道,并保存处理后的图片。

2.PIL方法函数封装

  • 函数定义:定义一个函数convert_transparent_to_color_pil,接受输入图片路径、输出图片路径和背景颜色作为参数。
  • 读取图片:在函数内部使用Image.open()读取带有透明背景的图片,并转换为RGBA模式。
  • 创建背景:创建一个与原图片大小相同的指定颜色背景图像。
  • 图像粘贴:使用paste()方法将原图粘贴到背景上,并使用透明度作为掩码。
  • 保存图片:保存处理后的图片。

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

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

import cv2
import numpy as np

def 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 * padding
    new_width = width + 2 * padding
    white_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)

详细解释

  • 函数定义:定义一个函数add_white_background_with_padding_opencv,接受输入图片路径、输出图片路径和背景扩展大小作为参数。
  • 读取图片:使用cv2.imread()读取带有透明背景的图片,并指定cv2.IMREAD_UNCHANGED以确保读取透明通道(Alpha通道)。
  • 检查是否读取成功:确保图片成功读取,否则抛出异常。
  • 分离RGBA通道:使用cv2.split()将图片分离为四个通道(RGBA)。
  • 获取原图片尺寸:获取原图片的高度和宽度。
  • 创建白色背景:创建一个稍微大一点的白色背景,背景大小为原图片大小加上两倍的扩展大小。
  • 将Alpha通道归一化:将Alpha通道的值归一化到0-1范围。
  • 图像合成:创建一个新的图像,并将原图像放到中央,同时根据Alpha通道的透明度混合原图和白色背景。

保存处理后的图片:将处理后的图片保存到指定路径。

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

以上就是python将图片透明背景转为白色背景的两种方法的详细内容,更多关于python图片背景转换的资料请关注脚本之家其它相关文章!

相关文章

  • Python中模块与包有相同名字的处理方法

    Python中模块与包有相同名字的处理方法

    这篇文章主要给大家介绍了在Python中模块与包有相同名字的处理方法,文中介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-05-05
  • Python3中编码与解码之Unicode与bytes的讲解

    Python3中编码与解码之Unicode与bytes的讲解

    今天小编就为大家分享一篇关于Python3中编码与解码之Unicode与bytes的讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • Python中LSTM回归神经网络时间序列预测详情

    Python中LSTM回归神经网络时间序列预测详情

    这篇文章主要介绍了Python中LSTM回归神经网络时间序列预测详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-07-07
  • Python基于Tensor FLow的图像处理操作详解

    Python基于Tensor FLow的图像处理操作详解

    这篇文章主要介绍了Python基于Tensor FLow的图像处理操作,结合实例形式分析了Python基于Tensor FLow操作图像解码、缩放、剪切、翻转、调整对比度、明度、饱和度等相关操作技巧,需要的朋友可以参考下
    2020-01-01
  • python实现字典合并的五种方法(附示例代码)

    python实现字典合并的五种方法(附示例代码)

    在Python中,有多种方法可以通过使用各种函数和构造函数来合并字典,在本文中,我们将讨论一些合并字典的方法,并通过代码示例讲解的非常详细,具有一定的参考价值,需要的朋友可以参考下
    2024-04-04
  • 详解Django配置优化方法

    详解Django配置优化方法

    这篇文章主要介绍了详解Django配置优化方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • Python中optionParser模块的使用方法实例教程

    Python中optionParser模块的使用方法实例教程

    这篇文章主要介绍了Python中optionParser模块的使用方法,功能非常强大,需要的朋友可以参考下
    2014-08-08
  • 一文带你了解Python与svg之间的操作

    一文带你了解Python与svg之间的操作

    svgwrite是一个 Python 库,用于生成简单的 SVG 图片。它提供了一组类似于绘图的 API,使用者可以在 SVG 画布上画线、矩形、圆等图形。本文主要介绍了如何利用svgwrite进行SVG图片的操作,需要的可以参考一下
    2023-01-01
  • 如何使用 Python 实现 DeepSeek R1 本地化部署

    如何使用 Python 实现 DeepSeek R1 本地化部署

    文章介绍了如何使用Python实现DeepSeekR1本地化部署,包括硬件环境、Python环境、安装依赖包、配置与运行代码等步骤,帮助读者轻松部署并运行本地AI助手,感兴趣的朋友一起看看吧
    2025-02-02
  • Python读取mp3中ID3信息的方法

    Python读取mp3中ID3信息的方法

    这篇文章主要介绍了Python读取mp3中ID3信息的方法,实例分析了Python中mutagen包的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03

最新评论