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