我正在将图像文件转换为hdf5文件,如下所示:
import h5py
import io
import os
import cv2
import numpy as np
from PIL import Image
def convertJpgtoH5(input_dir, filename, output_dir):
filepath = input_dir + '/' + filename
print('image size: %d bytes'%os.path.getsize(filepath))
img_f = open(filepath, 'rb')
binary_data = img_f.read()
binary_data_np = np.asarray(binary_data)
new_filepath = output_dir + '/' + filename[:-4] + '.hdf5'
f = h5py.File(new_filepath, 'w')
dset = f.create_dataset('image', data = binary_data_np)
f.close()
print('hdf5 file size: %d bytes'%os.path.getsize(new_filepath))
pathImg = '/path/to/images'
pathH5 = '/path/to/hdf5/files'
ext = [".jpg", ".jpeg", ".png", ".bmp", ".tiff", ".tif"]
for img in os.listdir(pathImg):
if img.endswith(tuple(ext)):
convertJpgtoH5(pathImg, img, pathH5)
我后来阅读了这些hdf5文件,如下所示:
for hf in os.listdir(pathH5):
if hf.endswith(".hdf5"):
hf = h5py.File(f"{pathH5}/{hf}", "r")
key = list(hf.keys())[0]
data = np.array(hf[key])
img = Image.open(io.BytesIO(data))
image = cv2.cvtColor(np.float32(img), cv2.COLOR_BGR2RGB)
hf.close()
有没有一种更有效的方法来读取hdf5文件,而不是转换成numpy阵列,在使用OpenCV之前用枕头打开
理想情况下,这应该作为一个副本关闭,因为我在上面的评论中引用的答案中解释了您想要做的大部分事情。我在这里包括这些链接:
有一个区别:我的示例将所有图像数据加载到一个HDF5文件中,然后为每个图像创建一个HDF5文件。坦率地说,我认为这样做没有多大价值。你最终得到的文件是原来的两倍,却一无所获。如果您仍然有兴趣这样做,这里还有两个答案可能会有所帮助(最后我更新了您的代码):
为了解决您的具体问题,我修改了您的代码,只使用cv2(不需要PIL)。我调整了图像的大小,并将其保存为1个文件中的1个数据集。如果您正在使用这些图像来训练和测试CNN模型,您无论如何都需要这样做(它需要大小/形状一致的数组)。另外,我认为您可以将数据保存为int8,而不需要浮动。见下文
如果您真的希望每个图像有一个HDF5,下面将更新您问题中的代码。同样,仅使用cv2,无需PIL。图像不会调整大小。这仅用于完整性(演示流程)。这不是管理图像数据的方式
相关问题 更多 >
编程相关推荐