目录
- 1、数据集介绍
- 2、保存为HDF5文件
- 3、从h5py中读取图像
- 4、查看图像
- 5、拓展——将压缩包内图像保存为HDF5文件
1、数据集介绍
本文选用的数据集是CelebA数据集)数据集,该数据集由202599幅图像组成,本文选取了前20000张数据,图像保存在名为img_align_celeba的文件夹中,有需要的可以自行下载:。
h5py是python中一种数据压缩格式,它的优势:速度快、压缩效率高。尤其是在处理深度学习的大量图像时,常常用到。
h5py库的安装十分简单,直接在cmd命令行窗口输入:
pip install h5py
h5py库的相关函数和方法可以去官网查找:h5py官网。
2、保存为HDF5文件
由于这20000张图像没有标签,因此直接读取图像存入h5py文件中即可,代码如下:
import os
import numpy as np
import cv2
import h5py
def save_image_to_h5py(path):
img_list=[] #初始化
for dir_image in os.listdir(path):
#读取文件
img=cv2.imread(os.path.join(path,dir_image))
img_list.append(img) #追加到img_list列表中
img_np = np.array(img_list) #转为numpy的ndarray类型
f = h5py.File('hdf5_file.h5', 'w') #写入文件
f['image'] = img_np #名称为image
f.close() #关闭文件
save_image_to_h5py('img_align_celeba')
3、从h5py中读取图像
读取图像代码如下:
import h5py
file=h5py.File('hdf5_file.h5','r')
image = file['image'][0, :, :, :]
可以检查一下image的形状:
image.shape
运行结果:
(218, 178, 3)
【注意】:这里可以查看一下x[‘image’]的形状:
image = x['image']
image.shape
运行结果:
(20000, 218, 178, 3)
这20000张图像的全部数据都存在这里了,想调用哪个图像第一个参数就选几即可。
4、查看图像
读取图像完成后,可以查看图像,查看图像有两种方法:
方法一:利用matplotlib工具包
代码示例:
import matplotlib.pyplot as plt
plt.imshow(image)
显示图像:
可以发现显示的图像偏蓝,这是因为matplotlib 的颜色通道是BGR,不是一般的RGB,因此需要加入如下代码:
res = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
显示图像:
方法二:直接利用cv2
代码如下:
import cv2
cv2.imshow('image',image)
cv2.waitKey(0) #等待键盘输入,单位为毫秒,即等待指定的毫秒数看是否有键盘输入,若在等待时间内按下任意键则返回按键的ASCII码,程序继续运行。
#若没有按下任何键,超时后返回-1。参数为0表示无限等待。不调用waitKey的话,窗口会一闪而逝,看不到显示的图片。
cv2.destroyAllWindows() #销毁所有窗口
运行结果:(独立窗口直接运行)
5、拓展——将压缩包内图像保存为HDF5文件
将压缩包内图像保存为HDF5文件利用的是python的zipfile包,完整代码如下:
import h5py
import zipfile
import imageio
import os
hdf5_file = 'celeba.h5'
total_images = 20000 #总共20000张图像
with h5py.File(hdf5_file,'w') as hf:
count=0
with zipfile.ZipFile('img_align_celeba.zip', 'r') as zf:
for i in zf.namelist():
ofile = zf.extract(i)
img = imageio.imread(ofile)
os.remove(ofile)
#将图像添加到HDF5文件中并重新命名
hf.create_dataset('img_align_celeba/'+str(count)+'.jpg', data=img, compression="gzip", compression_opts=9)
count = count + 1
if(count%1000 == 0):
print("images done .. ", count)
if(count==total_images):
break
ok,以上便是本文的全部内容了,如果对你有所帮助,记得点个赞哟~