将不同形状的多个数据集从不同的hdf5文件组合到一个单独的hdf5文件中

时间:2018-04-11 07:54:20

标签: python image hdf5

我正在处理存储在具有不同形状的多个hdf5文件中的python中的2D医学图像(例如[30,99,761,761], [20,30,99,761,761]和..)并且我想将它们全部组合成一个三维数组到单个hdf5文件(形状为[n,761,761])。目前,我通过从每个hdf5文件的每个数据集中读取每个图像[761,761],然后将图像写入一个文件来完成此操作。此过程需要超过24小时,因为有大约40000个图像,我认为这是最不优化的解决方案。是否有更快的方法可以选择性地将数据从hdf5文件切片并复制到另一个文件中?

这是代码。 首先创建我想要将其他文件中的图像合并到的文件:

ip_augmented_shape = (((num_rotations)*(1+3+num_translations)*len(addrs)),img.shape[0],img.shape[1])
ip_augmented = h5py.File(ip_augmented_path, mode='w')
ip_augmented.create_dataset("data1", ip_augmented_shape,np.int32)
ip_augmented.create_dataset("Index1",(ip_augmented_shape[0],num_classes), np.float32)
ip["Index1"][...] = labels 

print("Creating the data set \n")
counter = 0
pbar = tqdm(total=ip_augmented_shape[0])

现在逐个从每个文件中读取图像并将其写入目标文件。每个图像都有一个索引也会被复制。

for i in range(ip_rotated_flipped_h_shape[0]):
    for j in range(ip_rotated_flipped_h_shape[1]):
        ip_augmented['data1'][counter] = ip_rotated_flipped_h['images'][i][j]
        ip_augmented['Index1'][counter]= ip_rotated_flipped_h['Index1'][i][j]
        counter = counter+1
        pbar.update(1)

for i in range(ip_rotated_flipped_h_shape[0]):
    for j in range(ip_rotated_flipped_h_shape[1]):
        ip_augmented['data1'][counter] = ip_rotated_flipped_h['images'][i][j]
        ip_augmented['Index1'][counter]= ip_rotated_flipped_h['Index1'][i][j]
        counter = counter+1
        pbar.update(1)

for i in range(ip_rotated_flipped_v1_shape[0]):
    for j in range(ip_rotated_flipped_v1_shape[1]):
        ip_augmented['data1'][counter] = ip_rotated_flipped_v1['images'][i][j]
        ip_augmented['Index1'][counter]= ip_rotated_flipped_v1['Index1'][i][j]
        counter = counter+1
        pbar.update(1)

for i in range(ip_rotated_flipped_v2_shape[0]):
    for j in range(ip_rotated_flipped_v2_shape[1]):
        ip_augmented['data1'][counter] = ip_rotated_flipped_v2['images'][i][j]
        ip_augmented['Index1'][counter]= ip_rotated_flipped_v2['Index1'][i][j]     
        counter = counter+1
        pbar.update(1)

for i in range(ip_rotated_translated_shape[0]):
    for j in range(ip_rotated_translated_shape[1]):
        for k in range(ip_rotated_translated_shape[2]):
            ip_augmented['data1'][counter] = ip_rotated_translated['images'][i][j][k]
            ip_augmented['Index1'][counter]= ip_rotated_translated['Index1'][i][j][k]
            counter = counter+1
            pbar.update(1)

0 个答案:

没有答案