首页 > 编程语言 >Python图像处理自动化:批量去除图片背景

Python图像处理自动化:批量去除图片背景

时间:2023-12-19 19:07:32浏览次数:37  
标签:target Python 路径 filename 图像处理 file 去除 path os

一、前言

现在有较多的图片需要处理,需要将每张图片都去除背景。通常,我们使用像Photoshop这样的专业抠图软件或者在线抠图网页来处理,但这些方法通常只能一张一张地手动操作,效率低下。

接下来将介绍使用Python批量处理,一键去除文件夹中所有图片的背景,从而大大提高工作效率。

二、Python环境准备

使用cv2读取图片,rembg去除图片背景

pip install opencv-python
pip install rembg

三、代码分步详解

遍历读取图片

示例文件夹如下图:

Python图像处理自动化:批量去除图片背景_去除背景

import os
import cv2


def bg_remove(source_path):
    for filename in os.listdir(source_path):  # 遍历文件
        file_path = source_path + os.sep + filename  # 文件路径
        img_obj = cv2.imread(file_path)  # 读取图片
        print(f"{img_obj}")


if __name__ == "__main__":
    source_dir = r'C:\Users\Administrator\Desktop\新建文件夹'
    bg_remove(source_dir)

运行结果:

Python图像处理自动化:批量去除图片背景_图像处理_02

问题1--中文路径读取失败

文件路径包含中文时图片读取失败,那么在读取之前需要先判断文件路径是否包中文

import os
import cv2


def bg_remove(source_path):
    for filename in os.listdir(source_path):  # 遍历文件
        file_path = source_path + os.sep + filename  # 文件路径
        if not is_include_chinese(file_path):  # 文件路径不包含中文则读取
            img_obj = cv2.imread(file_path)  # 读取图片
            print(f"{filename}  读取成功")
        else:  # 文件路径包含中文
            print(f"{filename}  路径包含中文")


def is_include_chinese(path):
    """判断文件路径是否包含中文"""
    for i in path:
        if '\u4e00' <= i <= '\u9fa5':
            return True
    return False


if __name__ == "__main__":
    source_dir_chinese = r'C:\Users\Administrator\Desktop\新建文件夹'
    source_dir = r'C:\Users\Administrator\Desktop\img_dir'
    bg_remove(source_dir_chinese)
    print("=" * 100)
    bg_remove(source_dir)

运行结果:

Python图像处理自动化:批量去除图片背景_图像处理_03

问题2--不读取非图片文件

源文件夹中除了图片文件,还有其他文件类型,读取时需要排除掉

import imghdr
import os
import cv2


def bg_remove(source_path):
    for filename in os.listdir(source_path):  # 遍历文件
        file_path = source_path + os.sep + filename  # 文件路径
        if not is_include_chinese(file_path):  # 文件路径不包含中文则读取
            if is_img(file_path):  # 是图片文件则读取
                img_obj = cv2.imread(file_path)  # 读取图片
                print(f"{filename}  读取成功")
            else:  # 不是图片文件
                print(f"{filename}  不是图片")
        else:  # 文件路径包含中文
            print(f"{filename}  路径包含中文")


def is_include_chinese(path):
    """判断文件路径是否包含中文"""
    for i in path:
        if '\u4e00' <= i <= '\u9fa5':
            return True
    return False


def is_img(path):
    """判断文件是否为图片"""
    img_type = imghdr.what(path)
    if img_type:
        return img_type
    else:
        return False


if __name__ == "__main__":
    source_dir = r'C:\Users\Administrator\Desktop\img_dir'
    bg_remove(source_dir)

运行结果:

Python图像处理自动化:批量去除图片背景_Python_04

去除图片背景并保存

import imghdr
import os
import cv2
import rembg


def bg_remove(source_path, target_path):
    for filename in os.listdir(source_path):  # 遍历文件
        file_path = source_path + os.sep + filename  # 文件路径
        if not is_include_chinese(file_path):  # 文件路径不包含中文则读取
            if is_img(file_path):  # 是图片文件则读取
                img_obj = cv2.imread(file_path)  # 读取图片
                target = rembg.remove(img_obj)  # 去除背景
                target_file_path = target_path + os.sep + os.path.splitext(filename)[0] + ".png"  # 定义目标文件路径和名称
                cv2.imwrite(target_file_path, target)  # 保存去除背景后的图片到目标文件夹
            else:  # 不是图片文件
                print(f"{filename}  不是图片")
        else:  # 文件路径包含中文
            print(f"{filename}  路径包含中文")


def is_include_chinese(path):
    """判断文件路径是否包含中文"""
    for i in path:
        if '\u4e00' <= i <= '\u9fa5':
            return True
    return False


def is_img(path):
    """判断文件是否为图片"""
    img_type = imghdr.what(path)
    if img_type:
        return img_type
    else:
        return False


if __name__ == "__main__":
    source_dir = r'C:\Users\Administrator\Desktop\img_dir'
    target_dir = r'C:\Users\Administrator\Desktop\result_dir'
    bg_remove(source_dir, target_dir)

运行结果:

Python图像处理自动化:批量去除图片背景_图像处理_05

问题3--目标文件夹不存在

从代码运行结果来看,图片背景已经去除了,但并未在桌面上找到目标文件夹(C:\Users\Administrator\Desktop\result_dir)和去除背景后的图片,因为代码中并未创建目标文件夹

import imghdr
import os
import cv2
import rembg


def bg_remove(source_path, target_path):
    if not os.path.exists(target_path):  # 若目标文件夹不存在则创建
        os.makedirs(target_path)
    for filename in os.listdir(source_path):  # 遍历文件
        file_path = source_path + os.sep + filename  # 文件路径
        if not is_include_chinese(file_path):  # 文件路径不包含中文则读取
            if is_img(file_path):  # 是图片文件则读取
                img_obj = cv2.imread(file_path)  # 读取图片
                target = rembg.remove(img_obj)  # 去除背景
                target_file_path = target_path + os.sep + os.path.splitext(filename)[0] + ".png"  # 定义目标文件路径和名称
                cv2.imwrite(target_file_path, target)  # 保存去除背景后的图片到目标文件夹
            else:  # 不是图片文件
                print(f"{filename}  不是图片")
        else:  # 文件路径包含中文
            print(f"{filename}  路径包含中文")


def is_include_chinese(path):
    """判断文件路径是否包含中文"""
    for i in path:
        if '\u4e00' <= i <= '\u9fa5':
            return True
    return False


def is_img(path):
    """判断文件是否为图片"""
    img_type = imghdr.what(path)
    if img_type:
        return img_type
    else:
        return False


if __name__ == "__main__":
    source_dir = r'C:\Users\Administrator\Desktop\img_dir'
    target_dir = r'C:\Users\Administrator\Desktop\result_dir'
    bg_remove(source_dir, target_dir)

运行结果:

Python图像处理自动化:批量去除图片背景_去除背景_06

问题4--打印程序运行时间

为方便后期优化调试,将去除图片背景的时间打印出来

import imghdr
import os
import time
import cv2
import rembg


def bg_remove(source_path, target_path):
    if not os.path.exists(target_path):  # 若目标文件夹不存在则创建
        os.makedirs(target_path)
    for filename in os.listdir(source_path):  # 遍历文件
        file_path = source_path + os.sep + filename  # 文件路径
        if not is_include_chinese(file_path):  # 文件路径不包含中文则读取
            if is_img(file_path):  # 是图片文件则读取
                start_time = time.time()  # 开始计时
                img_obj = cv2.imread(file_path)  # 读取图片
                target = rembg.remove(img_obj)  # 去除背景
                target_file_path = target_path + os.sep + os.path.splitext(filename)[0] + ".png"  # 定义目标文件路径和名称
                cv2.imwrite(target_file_path, target)  # 保存去除背景后的图片到目标文件夹
                end_time = time.time()  # 再次计时
                execution_time = round(end_time - start_time, 3)  # 计算耗时
                print(f"{filename}去除背景完成,耗时:{execution_time}秒")
            else:  # 不是图片文件
                print(f"{filename}  不是图片")
        else:  # 文件路径包含中文
            print(f"{filename}  路径包含中文")


def is_include_chinese(path):
    """判断文件路径是否包含中文"""
    for i in path:
        if '\u4e00' <= i <= '\u9fa5':
            return True
    return False


def is_img(path):
    """判断文件是否为图片"""
    img_type = imghdr.what(path)
    if img_type:
        return img_type
    else:
        return False


if __name__ == "__main__":
    source_dir = r'C:\Users\Administrator\Desktop\img_dir'
    target_dir = r'C:\Users\Administrator\Desktop\result_dir'
    bg_remove(source_dir, target_dir)

运行结果:

Python图像处理自动化:批量去除图片背景_去除背景_07

四、结语

1.编写了三个方法,每个方法的功能明确,代码更易于理解和维护

2.对中文路径、非图片路径、目标文件夹不存在等异常情况做了简单处理

3.使用OpenCV(cv2)和rembg库来进行图片处理,简化了背景去除操作


标签:target,Python,路径,filename,图像处理,file,去除,path,os
From: https://blog.51cto.com/u_16379005/8891791

相关文章

  • python代码自动打开浏览器并输入相应的内容后搜索
    需求描述:使用python代码实现自动打开浏览器,之后进入百度,输入‘小姐姐’,查看结果1.安装selenium,直接安装4.0版本。pipinstallselenium==4.0看到successful字样就安装成功了2.代码实现#@File:自动化测试.py#author:蜜蜂#Time:2023/12/1917:06importtimefromseleniumimpo......
  • opencv图像处理机器学习真实项目教程(python实现)1计算机视觉简介
    1计算机视觉简介欢迎来到计算机视觉的世界。本书将带您踏上令人兴奋且快速发展的计算机视觉和图像处理世界的旅程。本书首先介绍计算机视觉和OpenCV库。然后,我们将继续介绍本课程的基本库和所需的环境设置。主要内容:计算机视觉简介计算机视觉的应用PythonOpenCVOpenCV......
  • Python计算两图相似性-直方图
    1、简介利用直方图计算图片的相似度时,是按照颜色的全局分布情况来看待的,无法对局部的色彩进行分析,同一张图片如果转化成为灰度图时,在计算其直方图时差距就更大了。对于灰度图可以将图片进行等分,然后在计算图片的相似度。 2、代码fromPILimportImage#将图片转化为RG......
  • ELK + Python 实现警报
    关于ELK索引特定字段报警的特殊方式:ELK+python脚本。FILEBEAT(日志采集)-->logstash(日志过滤)-->es(日志分类索引)-->kibana(展示)邮件系统的日志比较复杂,包含众多的日志,比如用户登录日志、用户下载附件日志、垃圾邮件垃圾日志等采集大量的数据如何区分那些是有用的信息,比......
  • 深入解析 Python 中的对象创建与初始化:__new__ 与 __init__ 方法
    Python中的面向对象编程涉及许多特殊方法,其中__new__和__init__是两个关键的方法。它们分别负责对象的创建和对象的初始化,在对象的生命周期中扮演着不同而又互补的角色。让我们深入探讨这两个方法,了解它们的作用、区别以及如何在实际开发中应用。1. __new__方法当谈到Pyth......
  • 使用XPath进行网页爬取的Python实现
    XPath是一种用于在XML和HTML文档中进行导航和查询的语言。在网页爬取中,XPath可以帮助我们定位和提取特定的网页元素,从而实现数据的抓取和提取。本文将介绍如何使用Python中的XPath库来进行网页爬取。1.安装依赖库:在使用XPath进行网页爬取之前,我们需要安装相关的依赖库。Python中常......
  • Python中使用del删除列表元素的原理解析
    Python是一种功能强大的编程语言,提供了许多方便的操作列表的方法。其中,使用del关键字可以删除列表中的某个元素。本文将解析Python中使用del删除列表元素的原理,帮助您理解其工作原理和使用方法。1.列表是可变对象:在Python中,列表是一种可变对象,即可以在原地修改的对象。与不可变对象......
  • python-bytes型和string型的转换
    https://blog.csdn.net/weixin_43936250/article/details/124410127数据加解密时通常是以bytes形式存储,加解密算法运行前需要先对数据进行处理。以SM4算法示例数据为例,待加密数据为:0123456789abcdeffedcba9876543210,bytes类型则有两种表示方式message1=b'0123456789abcdeffed......
  • skywalking对接python
    1.官网:https://skywalking.apache.org/docs/skywalking-python/next/readme/2.安装pipinstall"apache-skywalking"3.集成到flask,启动服务fromflaskimportFlask,request,render_templatefromupload_file_to_s3importuploads3,get_md5fromskywalkingimp......
  • 腾讯云api-python调用
    https://cloud.tencent.com/document/product/1278/46716#-*-coding:utf-8-*-importhashlib,hmac,json,os,sys,timefromdatetimeimportdatetime#密钥参数#需要设置环境变量TENCENTCLOUD_SECRET_ID,值为示例的AKIDz8krbsJ5yK**********mLPx3EXAMPLEsecret_......