hdf5文件转换为jpg/png图片

本文介绍如何将HDF5文件中的图像数据转换为图片格式并保存,包括处理不同维度的图像数据集。


前言

完成图像分割任务时,数据集是两个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文件转换为图片,因为不是很熟悉,网上查了半天,想改别人的代码又不弄不对(还是太菜了),后面利用断点慢慢调出来的。所以如果有朋友遇到和我一样的情况,希望这篇文章能对你有点帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值