⚡插播一条老家自产的糖心苹果,多个品种,欢迎选购!有问题随时私信我⚡:🍎🍎来自雪域高原的馈赠——海拔2000米的大凉山高原生态糖心苹果,欢迎选购!!🍎🍎
大凉山高原生态糖心苹果
Windows10
教育版64位
Python
3.6.3
Pillow
8.4.0
图片的分辨率
(即尺寸
,宽度
和高度
)是一个很重要的属性:
特别是使用爬虫爬取图片的时候,有些图片太小了,比如只有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)
上述方法有2个严重的缺点:
- 图片加载进内存,每次都会产生读写,速度受到限制;
- 虽然使用
close
关闭了Image
对象,但是如果这个时候程序其他地方出现异常,没有顺利关闭Image
对象,这个时候使用os.remove
删除图片,因为图片依然被程序占用,无法删除,导致程序报错;
有没有方法不加载图片而快速读取尺寸呢?
因为图片头文件中就已经包含了图片的分辨率!因此,我们可以通过只读取头文件而不读取整个图片,即可获得图片的分辨率:
图片的文件头部存储有该图片相关信息,可以从中读取相应字段,得到
尺寸
、格式
等信息。由于无需载入整张图片,故而速度较快。当图片较大时,优势更加明显。
那么如何读取头文件中的信息呢?答案就是今天的主角:imagesize
github
项目地址:imagesize
imagesize
通过只解析头文件,并忽略像素数据,所以它比 Pillow
快得多,2者之间有将近10倍的速度差:
module | result |
---|---|
imagesize | 1.077 seconds per 100 000 times |
Pillow | 10.569 seconds per 100 000 times |
注
:在MacBookPro
(2014/Core i7
)使用125kB
的PNG
图像测试
首先我们使用pip命令安装imagesize
到自己的电脑:
pip install imagesize
然后使用就更简单了:
import imagesize
width, height = imagesize.get(image_path)
直接使用imagesize
提供的get
函数,就可以拿到图片的分辨率,然后你就根据分辨率,自己设定图片清洗阈值对图片进行清洗了!
渣男!都看到这里了,还不赶紧点赞
,评论
,收藏
走一波?