hdf5文件转换为jpg/png图片


前言

完成图像分割任务时,数据集是两个hdf5文件,网上找了很久,都没能改好别人的代码把自己hdf5文件分成1张1张的图片。


提示:以下是本篇文章正文内容,下面案例可供参考

一、关于hdf5文件的读取以及难点

在将hdf5文件里的数据拆出来之前,先要知道hdf5文件的读取,至于hdf5文件是什么,在我看来就是一个字典,存储了关于这个数据集的各个信息,字典中的1个key就是对这个数据集的某种信息描述,value值就是具体的数据表示。详细介绍参考网上资料。可看看另一位博主的文章,关于hdf5文件的说明

我使用别人的代码划分我的数据时,不能跑通的原因就是每个人hdf5文件维度、还有key键的可能不同。(这里不理解看下面代码结果)

二、在拿到hdf5文件时应当先查看这个文件里包含了哪些信息

import h5py
import os
from PIL import Image
 # 我的hdf5文件,mask标签集 test1_gt.hdf5
hd5_path = r'E:\Code\PycharmProject\DATA_PROJECT\test1_gt.hdf5'
hr_dataset = h5py.File(hd5_path)  # 读取hdf5文件
for key in hr_dataset:
    print(key)
# 结果只输出了 image,说明这个hdf5文件只存储了图片数据,没有其他的信息描述了。

三、知道具体信息后,再查看目标信息的维度

大多数情况下,我们需要的就是具体的图片数据,即上面 image的情况。
现在,我们需要查看image的值,因为这里面就是我们的图片。
介绍一下我的数据集,有两个hdf5文件,包含30个4帧的冠脉造影图像,一开始我以为这两个文件没啥差别,后面发现,连续4帧的原始图像只有1个相同的mask分割图(这里没看懂没关系)

hd5_path1 = r'E:\Code\PycharmProject\DATA_PROJECT\test1_ori.hdf5'  # 原始图像
hd5_path2 = r'E:\Code\PycharmProject\DATA_PROJECT\test1_gt.hdf5'  # mask数据集
hr_dataset1 = h5py.File(hd5_path1)
hr_dataset2 = h5py.File(hd5_path2)

print(hr_dataset['image'].shape)  # (30, 1, 4, 512, 512)  像字典一样查看key的value  30*4=120张512*512的图片
print(len(hr_dataset['image']))  # 30

print(hr_dataset2['image'].shape)  # (30, 1, 512, 512) 30张512*512的图片
print(len(hr_dataset2['image']))  # 30

四、读取 hr_dataset['image'] 每张图片信息转换为图片保存

因初学,没法对所有hdf5文件通用,因此我这两个hdf5文件的转换略有一点区别。

1、先实现 维度(30, 1, 512, 512) 的hdf5文件(标签mask)转换

for i in range(len(hr_dataset2['image']))  # rang(30)
	y = hr_dataset2['image'][i]  # y维度(1,512,512)
	img = Image.fromarray(y[0])  # y[0]维度 (512,512) 即目标图片
	name = './'+str(i)+'.png'  #'store_path'
 	img.convert('RGB').save(name)

2、再实现 维度 (30, 1, 4, 512, 512) 的hdf5文件(原始图片)转换

for i in range(len(hr_dataset2['image']))  # rang(30)
	y = hr_dataset2['image'][i]  # y维度(1,4,512,512)
	for j in range(len(y[0])):  # range(4)
		x = y[0][j,:,:]  # 取 1张 图片的数据 x维度(1,512,512)
		x = np.reshape(x, (512, 512))
		name = './'+ str(i)+str(j)+'.png'
		img1 = Image.fromarray(x)
		img1.convert('RGB').save(name)

五、完整代码实现

数据是论文中的公开数据集,下载好数据后,修改代码中的文件读取和存储路径,即可跑通示例。
代码中的两个hdf5文件github下载地址

test1_ori.hdf5 原始图片的转换

import h5py
import os
from PIL import Image
import numpy as np
hd5_path = r'E:\Code\PycharmProject\DATA_PROJECT\test1_ori.hdf5'  # 读取路径
sotre_path = r'E:\Code\PycharmProject\DATA_PROJECT\hdf5'  # 存储路径
hr_dataset = h5py.File(hd5_path) 

for i in range(len(hr_dataset['image'])):
    y = hr_dataset['image'][i]
    if not os.path.exists(sotre_path):
        os.mkdir(sotre_path)
    j = 0
    for j in range(len(y[0])):
        x = y[0][j,:,:]
        x = np.reshape(x, (512, 512))
        # name = os.path.join(sotre_path, str(k) + '_' + str(j) + '.png')
        for j in range(len(y[0])):  # range(4)
            name = os.path.join(sotre_path, str(i) + '_' + str(j) + '.png')
        	img1 = Image.fromarray(x)
        	img1.convert('RGB').save(name)

test1_gt.hdf5 mask分割图的转换

import h5py
import os
from PIL import Image
import numpy as np
hd5_path = r'E:\Code\PycharmProject\DATA_PROJECT\test1_gt.hdf5'  # 读取路径
sotre_path = r'E:\Code\PycharmProject\DATA_PROJECT\hdf5'  # 存储路径
hr_dataset = h5py.File(hd5_path) 
k = 0
for i in range(len(hr_dataset['image'])):  # rang(30)
	y = hr_dataset['image'][i]  # y维度(1,512,512)
	if not os.path.exists(sotre_path):
    	os.mkdir(sotre_path)
	for j in range(4):	# 因为每4张对应同1个mask标签,所以要生成重复的4张标签图
		img = Image.fromarray(y[0])  
		name = os.path.join(sotre_path, str(i) + '_' + str(j) +'a'+ '.png')  # 但名字不能一样
 		img.convert('RGB').save(name)

总结

关于hdf5文件转换为图片,因为不是很熟悉,网上查了半天,想改别人的代码又不弄不对(还是太菜了),后面利用断点慢慢调出来的。所以如果有朋友遇到和我一样的情况,希望这篇文章能对你有点帮助。

图片转换为HDF5文件需要使用Python中的h5py库和Pillow库,步骤如下: 1. 导入必要的库: ```python import h5py from PIL import Image import numpy as np ``` 2. 定义变量,包括图片路径、HDF5文件名、数据集名等: ```python img_path = '/path/to/image.jpg' h5_file = 'images.h5' dataset_name = 'images' ``` 3. 读取图像数据,并将其转换为numpy数组: ```python img = Image.open(img_path) img_array = np.array(img) ``` 4. 创建HDF5文件并将图像数组写入其中: ```python with h5py.File(h5_file, 'w') as f: f.create_dataset(dataset_name, data=img_array) ``` 在这个示例中,我们使用`with`语句创建HDF5文件并将其分配给变量"f",文件以写入模式("w")打开。然后,我们使用`f.create_dataset`函数创建一个名为"images"的数据集,并将图像数组写入其中。最后,文件会在`with`代码块结束时自动关闭。 如果你需要将多张图像写入同一个数据集中,请参考以下示例代码: ```python img_folder = '/path/to/images' h5_file = 'images.h5' dataset_name = 'images' image_list = [] for filename in os.listdir(img_folder): if filename.endswith('.jpg') or filename.endswith('.png'): img_path = os.path.join(img_folder, filename) img = Image.open(img_path) img_array = np.array(img) image_list.append(img_array) with h5py.File(h5_file, 'w') as f: f.create_dataset(dataset_name, data=image_list) ``` 在这个示例中,我们使用一个循环读取文件夹中的所有图像,并将它们转换为numpy数组。然后,我们将所有图像数组存储在一个列表中,并使用`f.create_dataset`函数将列表写入名为"images"的数据集中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值