热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:python使用HDF5格式文件进行数据存储

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

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







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




文章目录


  • 一、认识HDF5
  • 二、可视化工具-HDFView
  • 三、案例测试



一、认识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?s=#34;, ".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']





推荐阅读
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 本文讨论了编写可保护的代码的重要性,包括提高代码的可读性、可调试性和直观性。同时介绍了优化代码的方法,如代码格式化、解释函数和提炼函数等。还提到了一些常见的坏代码味道,如不规范的命名、重复代码、过长的函数和参数列表等。最后,介绍了如何处理数据泥团和进行函数重构,以提高代码质量和可维护性。 ... [详细]
  • 本文介绍了基于c语言的mcs51单片机定时器计数器的应用教程,包括定时器的设置和计数方法,以及中断函数的使用。同时介绍了定时器应用的举例,包括定时器中断函数的编写和频率值的计算方法。主函数中设置了T0模式和T1计数的初值,并开启了T0和T1的中断,最后启动了CPU中断。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 这篇文章主要介绍了Python拼接字符串的七种方式,包括使用%、format()、join()、f-string等方法。每种方法都有其特点和限制,通过本文的介绍可以帮助读者更好地理解和运用字符串拼接的技巧。 ... [详细]
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
author-avatar
手机用户2502854361
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有