• Python如何不加载图片获取图片的尺寸(宽和高)?


    Python如何不加载图片获取图片的分辨率(即尺寸,宽和高)?

    ⚡插播一条老家自产的糖心苹果,多个品种,欢迎选购!有问题随时私信我⚡:🍎🍎来自雪域高原的馈赠——海拔2000米的大凉山高原生态糖心苹果,欢迎选购!!🍎🍎
    在这里插入图片描述

    大凉山高原生态糖心苹果

    1.软件环境⚙️

    Windows10 教育版64位
    Python 3.6.3
    Pillow 8.4.0

    2.问题描述🔍

    图片的分辨率(即尺寸宽度高度)是一个很重要的属性:
    在这里插入图片描述

    特别是使用爬虫爬取图片的时候,有些图片太小了,比如只有60*60,只有这么大:

    在这里插入图片描述
    这种尺寸的图片往往都是纯色的色块,根本没有包含明显的主体,属于脏数据,会影响模型的训练,因此需要把这种类型的数据从样本中剔除。这个时候就需要根据图片的分辨率,将低于某个分辨率的图片全部勾选出来
    目前网上大多数的获取图片分辨的方法是使用Pillow打开图片,这会把整张图片加载到内存中,非常耗时:

    from PIL import Image
    import os
    
    image = Image.open(image_path)
    height, width = image.size
    if height * width < threshold:
    	image.close()
    	os.remove(image_path)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    上述方法有2个严重的缺点:

    1. 图片加载进内存,每次都会产生读写,速度受到限制;
    2. 虽然使用close关闭了Image对象,但是如果这个时候程序其他地方出现异常,没有顺利关闭Image对象,这个时候使用os.remove删除图片,因为图片依然被程序占用,无法删除,导致程序报错;

    有没有方法不加载图片而快速读取尺寸呢?
    在这里插入图片描述

    3.解决方法🐡

    因为图片头文件中就已经包含了图片的分辨率!因此,我们可以通过只读取头文件而不读取整个图片,即可获得图片的分辨率:

    图片的文件头部存储有该图片相关信息,可以从中读取相应字段,得到尺寸格式等信息。由于无需载入整张图片,故而速度较快。当图片较大时,优势更加明显。

    那么如何读取头文件中的信息呢?答案就是今天的主角:imagesize
    github项目地址:imagesize
    imagesize通过只解析头文件,并忽略像素数据,所以它比 Pillow 快得多,2者之间有将近10倍的速度差:

    moduleresult
    imagesize1.077 seconds per 100 000 times
    Pillow10.569 seconds per 100 000 times

    :在MacBookPro (2014/Core i7)使用125kBPNG图像测试

    首先我们使用pip命令安装imagesize到自己的电脑:

    pip install imagesize
    
    • 1

    然后使用就更简单了:

    import imagesize
    
    width, height = imagesize.get(image_path)
    
    • 1
    • 2
    • 3

    直接使用imagesize提供的get函数,就可以拿到图片的分辨率,然后你就根据分辨率,自己设定图片清洗阈值对图片进行清洗了!


    渣男!都看到这里了,还不赶紧点赞评论收藏走一波?

  • 相关阅读:
    进程地址空间
    自动化邮件通知:批处理脚本的通讯增强
    const和readonly的区别
    建木v2.5.7发布
    「Gitee篇」如何用Git平台账号登录建木CI
    箭头函数写法
    XML语言的学习记录2-XMLHttpRequest
    Python气象绘图笔记——常用气象绘图函数脚本封装与使用记录
    [回归指标]R2、PCC(Pearson’s r )
    HBase面试题
  • 原文地址:https://blog.csdn.net/qq_15969343/article/details/126512406