python-使用HDF5格式文件进行数据存储

Posted 胜天半月子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python-使用HDF5格式文件进行数据存储相关的知识,希望对你有一定的参考价值。

对于新手的你和我来说,不要害怕和畏惧接收新知识,尤其是对于学计算机的我们来说,我们对概念可能懵懵懂懂,但是你只要上手操作你就可以明白这其中的原理,学会使用,慢慢就会发现你所害怕接收的新知识和你已经学过的知识其实有异曲同工之处!

一、认识HDF5

可以存储不同类型的图像和数码数据的文件格式,并且可以在不同类型的机器上传输,同时还有统一处理这种文件格式的函数库。大多数普通计算机都支持这种文件格式。–【百度百科】

在这里插入图片描述
具体模样

想进一步加深了解相关概念----->百度百科:HDF

  • 参考资源
  1. 理解h5文件并使用python对h5格式文件进行读写操作
  2. HDF5 数据文件简介

二、可视化工具-HDFView

  • 软件

百度网盘:HDF5文件可视化工具 提取码:ktzu

HDFView是将*.hdf5文件进行数据可视化的软件工具,下面讲一讲具体使用流程:

  1. 下载安装

可以根据我给的链接进行下载,或者自己去官网下载。(我的就是官网下载的,因为慢所以放进了百度网盘,不放心的可以直接去官网下载的)

  • 安装完成图
    在这里插入图片描述

到此为止,你可能会双击打开软件,若是直接可以使用,请看第三步,若是不能看第二布

  1. 设置环境变量

【1.此电脑】–》【2.右击,属性】–》【3.高级系统设置】–》【4.系统变量】–》【5.Path】–》【6.编辑】–》【7.确定】
我的路径:E:\\python3.7\\HDFView\\runtime\\bin

在这里插入图片描述

  1. 工具测试
  • 测试文件
    具体模样
  • 窗口界面

类似于juoyter notebook有一个启动器

在这里插入图片描述
在这里插入图片描述

  • 打开文件
    在这里插入图片描述
    在这里插入图片描述

三、案例测试

import cv2
import numpy as np
import os
import h5py

# 查找指定目录下的所有图片文件
image_types = (".jpg", ".jpeg",  ".bmp", ".tif", ".tiff")
def geturlPath(dirpath):
    path_list = []
    # 返回指定路径的文件夹名称  该文件不包含子文件
    dirs = os.listdir(dirpath)  # 使用os.listdir(dirpath)返回的文件名不一定是顺序的
    # 循环遍历该目录下的照片
    for picname in dirs:
        pa = dirpath + '\\\\'+ picname    # 文件路径
        print('image path:',pa)
        # 判断是否为照片
        if picname.endswith(image_types):
            path_list.append(pa)
    # path_list.sort(key=lambda x: int(x[:-4]))
    path_list.sort(key=lambda x: int(x.split('.')[1].split('/')[2])) # 将图片文件有序排序
    return path_list,True

# 提取图片特征
def sift_kp(sift,image):
    # gray_image = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
    kp,des = sift.detectAndCompute(image, None)
    # kp_image = cv2.drawKeypoints(image, kp, None)
    return kp,des

# 判断特征存储文件是否存在  不存在则创建
def create_featurefile(name):
    txt_name = name
    current_path = os.getcwd()  # 获取当前路径
    # print('当前路径:',current_path)
    path = current_path + '\\\\' + txt_name  # 在当前路径创建名为test的文本文件
    # print('txt path:',path)
    if os.path.exists(path):
        pass
    else:
        os.system(r"touch {}".format(path)) # 创建文件
    return path,True

# 存储图形的特征值
def save_keypoint(keypoint,path):
    # print('path:',path)
    np.set_printoptions(threshold=np.inf)
    with open(path, 'a') as fp:
        fp.write(str(keypoint.shape))
        fp.write('\\n')
        fp.write(str(keypoint))

# 存储特征值到HDF5文件
def save_HDF5(hdf5fp,imagepath,des):

    '''
    :param hdf5fp: HDF5文件操作符
    :param imagepath: 传入的文件名路径
    :param des: 特征值矩阵
    :return:
    '''
    charnum = imagepath.split('/')[-1].split('.')[0] # 获取照片中的数字

    groupname = 'image' + charnum   # 组名
    datasetname = 'feature_data_' + charnum  # 数据集名

    group = hdf5fp.create_group(groupname) # 创建组
    dataset = group.create_dataset(datasetname, data=des)

# 为每张图片单独创建一个文件用来保存特征值
if __name__ == '__main__':

    dirpath = r'F:\\graduate_stu\\task1\\wood'
    image_list,flag = geturlPath(dirpath)  # 获取文件夹下的所有图片
    print(image_list)

    if flag:
        sift = cv2.xfeatures2d_SIFT.create()
        file = h5py.File("./imagefeature.hdf5", "w")
        for imagepath in image_list:
            # print('当前图片文件:',imagepath)
            
            #  方案一: 将数据存储在txt文件中
            # name = 'features_'+ imagepath.split('/')[2].split('.')[0] + '.txt'
            # filepath,file_isexist = create_featurefile(name)
            
            # 方案二:将数据存储在HDF文件中
            try :
                image = cv2.imread(imagepath)
                # print('image:',image.shape)
                _, des = sift_kp(sift, image)  # des是图片的特征向量
                print('des:', des.shape)
                # save_keypoint(des,filepath) # 保存特征值到txt文本
                save_HDF5(file,imagepath,des)
            except AttributeError:
                pass
            print(imagepath.split('/')[2] + '的特征值数据写入完毕!')
            print('-----------------------------')
        file.close()
        print('所有图片特征数据写入完成!')
    else:
        print('txt_file is not exist!')
  • 代码解读
  1. geturlPath():获取指定路径下的所有图片,并进行排序,因为获取的所有文件是无序的,然而我有强迫症!
  2. sift_kp():提取图像特征
  3. save_keypoint():一开始采取的策略将每一张图片的特征存在txt格式文件中,后来发现特别慢,所以才使用的HDF5格式文件进行存储,存储非常快
  4. save_HDF5():写入HDF5格式文件
  5. try-except的使用:在程序运行的过程中发现有些图片没有特征(可能是我技术没到家),所以进行Error忽略。
geturlPath()方法获取的有序列表:
['./query/1.jpg', './query/2.jpg', './query/3.jpg', './query/4.jpg', './query/5.jpg',
'./query/6.jpg', './query/7.jpg', './query/8.jpg', './query/9.jpg', './query/10.jpg', './query/11.jpg', './query/12.jpg', './query/13.jpg','./query/14.jpg',
'./query/15.jpg','./query/16.jpg', './query/17.jpg', './query/18.jpg', './query/19.jpg', './query/20.jpg','./query/21.jpg', './query/22.jpg', './query/23.jpg', './query/24.jpg', './query/25.jpg']

以上是关于python-使用HDF5格式文件进行数据存储的主要内容,如果未能解决你的问题,请参考以下文章

HDF5 用于使用 fortran 编写的数据文件

HDF5 文件格式简介

将大量数据集从 SQL 服务器导入 HDF5

使用 Python 将 Blob 下载到本地存储

h5py矩阵存储精度

Bunch 转换为 HDF5 文件:高效存储 Cifar 等数据集