Python 批量处理PNG、JPG图片 去白边

2023-10-31

每次写论文用seaborn画出来的图白边都很大并且没法调,每次都用PS软件去白边很麻烦。索性写了个脚本,在不改变图片像素密度(尺寸变了,相当于切割)的情况下,批量去掉图片白边,参考了部分网上的程序,自己写了个简单的脚本,放到一个Python文件里直接执行就行:

import numpy as np
import matplotlib.image as mpimg
import os
import time

# 去除图片白边
def resize_figure(img_path):
    img = mpimg.imread(img_path)
    ini_size = img.shape
    x = 0
    xx = img.shape[0]
    y = 0
    yy = img.shape[1]
    for channel in range(img.shape[2]):
        for i in np.arange(0, img.shape[0], 1):
            if img[i, :, channel].sum() != img.shape[1]:
                x = max(x, i)
                break
        for i in np.arange(img.shape[0] - 1, -1, -1):
            if img[i, :, channel].sum() != img.shape[1]:
                xx = min(xx, i)
                break
        for j in np.arange(0, img.shape[1], 1):
            if img[:, j, channel].sum() != img.shape[0]:
                y = max(y, j)
                break
        for j in np.arange(img.shape[1] - 1, -1, -1):
            if img[:, j, channel].sum() != img.shape[0]:
                yy = min(yy, j)
                break
    cutted_res = img[x - 5:xx + 5, y - 5:yy + 5, :]
    return cutted_res, ini_size, cutted_res.shape


# 获得某个文件夹下的所有的文件路径
def DFS_file_search(dict_name=None, out=None):
    # list.pop() list.append()这两个方法就可以实现栈维护功能
    if dict_name is None:  # 代表该根目录
        dict_name = './'
    stack = []
    result_txt = []
    stack.append(dict_name)
    while len(stack) != 0:  # 栈空代表所有目录均已完成访问
        temp_name = stack.pop()
        try:
            temp_name2 = os.listdir(temp_name) # list ["","",...]
            for eve in temp_name2:
                stack.append(temp_name + "\\" + eve)  # 维持绝对路径的表达
        except NotADirectoryError:
            result_txt.append(temp_name)

    # 检查是不是图片格式
    if out is None:
        out = 'cutted'  # 默认的名字
    res = []
    for eve_path in result_txt:
        if eve_path.find('.') != -1 and eve_path.find(out) == -1:
            if eve_path.split('.')[-1] in ['png', 'PNG', 'jpg', 'JPG', 'eps', 'EPS']:
                res.append(eve_path)
    return res


if __name__ == '__main__':

    read_root_path = None  # 要读取的文件夹,None默认为当前根目录,也可以自己指定文件夹
    save_root_path = 'cutted'  # 输出的文件夹

    if not os.path.exists(save_root_path):
        os.mkdir(save_root_path)
    paths = DFS_file_search(read_root_path, save_root_path)
    print('要处理的图片的路径为:', paths)
    for path in paths:
        print('开始处理 ' + path)
        t1 = time.time()
        cutted_figure, ini_size, final_size = resize_figure(path)
        temp_name = path.split('.')[-2].split('/')[-1]
        mpimg.imsave('./' + save_root_path + "/" + temp_name + '.png', cutted_figure)
        print('处理完毕 ' + path, '  耗时:', time.time()-t1, " 秒", ' 处理前shape:', ini_size, ' 处理前shape:',final_size)


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 批量处理PNG、JPG图片 去白边 的相关文章

随机推荐

  • BTY Ecosystem DNS‘s Ideas of DeSoc

    In May 2022 Ethereum founder Vitalik Buterin economist Glen Weyl and Flashbots researcher Puja Ohlhaver jointly released
  • vue前端上传文件到COS

    1 main js中 COS相关的 Vue prototype loadi https images 1254950508 cos ap guangzhou myqcloud com a 1588390454918 loading gif
  • 计算机网络重点知识解析(1)

    总结一下计算机网络知识 文章目录 OSI七层网络协议 TCP IP协议模型 TCP协议 UDP协议 TCP和UDP协议的区别 RTT和RTO TCP的滑动窗口 TCP 拥塞控制 OSI七层网络协议 先来一张网络协议图 简单解释一下各个协议
  • 64位和32位相比优势是什么(一)

    前置知识 程序是如何执行的 一道常规的面试题 相比 32 位 64 位的优势是什么 面试官考察这种类型的问题 主要是想看求职者是否有扎实的计算机基础 同时想知道求职者在工作中是否充满好奇 会主动学习 寻根问底 毕竟 32 64 位是经常出现
  • [MATLAB]学习笔记

    目录 第一章 Matlab基础 1 1 Matlab介绍 1 2 界面使用 1 3 运算基础 1 4 数据基础 1 5 矩阵基础 第一章 Matlab基础 1 1 Matlab介绍 一 最新版本 MathWorks MATLAB R2021
  • Python和Java二选一该学啥?

    Java这种跨平台 可面向对象的编程语言完美解释了它不仅仅只是一种语言 而且自身很强大是一种开发平台 第一 学习过的大家可能都知道它的优势和特性有哪些 比如说它简单性 面向对象 分布式 解释型 可靠 安全 平台无关 可移植 高性能 多线程
  • 分享Visual Studio 2019专业版、企业版密匙

    官网下载地址 https visualstudio microsoft com zh hans downloads 点击进入 Professional产品密钥 NYWVH HT4XC R2WYW 9Y3CM X4V3Y Enterprise
  • 零基础初学前端—新建项目

    对于一个没有基础的新手来说 如何使用 vscode 新建一个前端项目 写一些html页面 并能进行运行 需要吐下几个步骤 新建一个文件夹 在文件夹里新建一个文件 命名为 xxx html 例如 index html 打开 vscode Fi
  • 【Windows】Windows下载使用wget命令

    文章目录 一 前言 介绍 二 安装步骤 2 1 下载 wget 压缩包 2 2 解压到指定的位置 2 3 检查是否安装成功 2 4 是否可以正常下载 一 前言 介绍 wget 是 linux 一个下载文件的工具 可以下载一些软件或从远程服务
  • centos7常用工具包安装

    1 nano yum install y nano 2 wget yum install y wget
  • MySQL的“插入”/“删除+插入”操作——REPLACE

    问题及背景 有一个数据表Table 主键为YYYY MM DD 年 月 日 形式的字符串 存储着本日某事件的信息 该信息每隔若干小时 会根据最新数据重新计算该信息 如果Table中已存在本日记录 需要对其进行 UPDATE 或 DELATE
  • 模型化公务员能力

    1 搜集信息 现象 在较大的行政管理对象中 信息失真是普遍现象 误区 地方统计上报的数据 只要各级管理人员认真负责 严格核实 怎么会有错误 对策 建立及时 真实 全面 立体的信息搜集和分析机制 2 办理公文 现象 领导的批示和交办的事项 往
  • Java System.arraycopy()方法示例

    Java System arraycopy is a native static method to copy elements from the source array to the destination array Java Sys
  • SQLserver 2008数据库迁移 - 导出 方法二 备份法

    前言 由于更换服务器 所以需要对数据库进行备份 到新服务器还原 收到数据库迁移的命令 登上服务器一看 一脸懵B SQLServer 2008完全没用过 于是开始查资料 各种百度 CSDN一顿查 方法一 保存脚本法 点此链接了解详情 方法二
  • keil报错:Symbol set_value multiply define和 incomplete type is not allowed和error:  #65: expected a “;“

    一个是重复定义 一个是不完整类型 一个是缺一个 第一个 重复定义 一般最多的就是两个文件中的变量定义重复而报错 一般这种改一下名就差不多了 而另一种就比较难看出来了 比如 定义一个结构体在sys h的文件中 并在文件中进行了定义和初始化 然
  • Formality流程

    Formality流程 前言 一 formality是什么 二 使用步骤 0 打开formality的gui界面 1 导入svf文件 2 读入verilog文件 3 读入网表文件 4 setup 5 match and verify 6 注
  • 安装 Media Player 11验证最简单的解决方案

    MS说打补丁 我就让它打 结果给我升到了11 还要验证 不爽 搞了半天 最后找到解决方案 好简单将C Program Files Windows Media Player LegitLibM dll改名为legitlib dll 打开Med
  • python网络爬虫模块

    re模块 想在python中使用正则表达式 可以使用re模块来辅助筛选 1 findall 查找数据中所有符合条件的数值 最后的结果以列表形式输出 贪婪匹配 import re res re findall l hello l l 2 fi
  • JavaEE学习 day09

    今天 继续学习了JavaEE 继续做SSM图书管理系统项目 SSM图书管理系统 修改用户 显示修改数据 SSM图书管理系统 修改用户 userid隐藏域 SSM图书管理系统 修改用户 与新增共用一个方法 SSM图书管理系统 删除用户 总结一
  • Python 批量处理PNG、JPG图片 去白边

    每次写论文用seaborn画出来的图白边都很大并且没法调 每次都用PS软件去白边很麻烦 索性写了个脚本 在不改变图片像素密度 尺寸变了 相当于切割 的情况下 批量去掉图片白边 参考了部分网上的程序 自己写了个简单的脚本 放到一个Python