当前位置: 首页 > article >正文

Python去除图像白色背景

使用Pillow去除图像背景

安装依赖:

pip install pillow

实现步骤: 

  • 使用Pillow库加载图像,并将其转换为RGBA模式,以支持透明度。
  • 遍历图像的每个像素,检查其红色、绿色和蓝色值是否都高于预设的阈值。
  • 对于被视为白色的像素(即RGB值均高于阈值的像素),将其透明度设置为0(完全透明)。
  • 对于非白色像素,保留其原始透明度值(或不改变其透明度,因为它们在原始图像中可能已经是部分透明或有其他透明度值)。
  • 将修改后的图像保存为PNG格式,以保留透明度信息。

示例代码:

from PIL import Image

def remove_image_bg_pil(input_path, output_path):
    img = Image.open(input_path)
    img = img.convert("RGBA")
    data = img.getdata()

    threshold = 240
    # 创建一个新的图片数据列表
    new_data = []
    for item in data:
        # 将背景颜色设置为透明,这里假设背景颜色为白色,RGB值为(255, 255, 255)
        if item[0] >= threshold and item[1] >= threshold and item[2] >= threshold:
            new_data.append((255, 255, 255, 0))
        else:
            new_data.append(item)

    # 更新图片数据
    img.putdata(new_data)
    img.save(output_path, 'PNG')

使用OpenCV去除图像背景

安装依赖:

pip install opencv-python
pip install numpy

实现步骤:

  • 创建RGBA图像:将BGR图像转换为RGBA图像,初始时Alpha通道设置为全不透明(255)。
  • 定义白色阈值:设置一个阈值,用于判断哪些像素是“白色”。
  • 创建掩码:使用cv2.inRange函数创建一个掩码,将白色像素标记为0(透明),其他像素标记为255(不透明)。
  • 反转掩码:使用cv2.bitwise_not函数反转掩码,只对白色像素进行透明处理。
  • 应用掩码到Alpha通道:使用cv2.bitwise_and函数将掩码应用到Alpha通道,使白色像素的Alpha通道变为0(透明)。

示例代码:

import cv2
import numpy as np

def remove_image_bg_cv(input_path, output_path):
    # 读取图像
    img = cv2.imread(input_path)
    b, g, r = cv2.split(img)
    rgba = cv2.merge((b, g, r, 255 * np.ones(b.shape, dtype=b.dtype)))
    # 定义白色阈值
    white_threshold = 240
    # 创建一个掩码,将白色像素标记为0(透明),其他像素标记为255(不透明)
    mask = cv2.inRange(img, (white_threshold, white_threshold, white_threshold), (255, 255, 255))
    mask_inv = cv2.bitwise_not(mask)
    cv2.imwrite("output2/mask.png", mask_inv)
    # 将掩码应用到Alpha通道
    rgba[:, :, 3] = cv2.bitwise_and(rgba[:, :, 3], mask_inv)
    # 保存结果图像
    cv2.imwrite(output_path, rgba)


http://www.kler.cn/a/402023.html

相关文章:

  • 手摸手5-springboot开启打印sql完整语句
  • C#获取视频第一帧_腾讯云媒体处理获取视频第一帧
  • 大连理工大学概率上机作业免费下载
  • Django数据库迁移与反向迁移处理方案分析
  • docker minio修改时区问题记录
  • 《探索 C++:一门强大且多功能的编程语言》
  • 大数据新视界 -- Impala 性能突破:复杂数据类型处理的优化路径(上)(25 / 30)
  • 详细描述一下Elasticsearch索引文档的过程?
  • 基于Java Springboot出租车管理网站
  • 【时间之外】IT人求职和创业应知【35】-RTE三进宫
  • 后端web开发:处理前端操作
  • 微分方程(Blanchard Differential Equations 4th)中文版Exercise 5.3
  • 深入理解Rust的所有权和借用
  • 机器学习中的概率超能力:如何用朴素贝叶斯算法结合标注数据做出精准预测
  • 【Unity基础】认识Unity中的包
  • 自动化测试工具Ranorex Studio(三十七)-创建RANOREX快照文件
  • D2076——一款双通道音频功率放大器【青牛科技】
  • 基于51单片机的电子钟+秒表LCD1602仿真设计
  • 个人理财系统(源码+数据库+报告)
  • Linux常用命令学习
  • DataOps for LLM 的数据工程技术架构实践
  • <Sqlite><websocket>使用Sqlite与websocket,实现网页端对数据库的【读写增删】操作
  • mysql8.4+mysql router读写分离
  • 矩阵论在图像算法中的应用
  • 理论力学基础:讲义与笔记(2)
  • UniApp在Vue3的setup语法糖下自定义组件插槽详解