HDF5数据介绍和Matlab读取

HDF是由美国国家超级计算应用中心(NCSA)创建的,以满足不同群体的科学家在不同工程项目领域之需要,用于存储和分发科学数据的一种自我描述、多对象文件格式。HDF最初产生于20世纪80年代,从HDF1到HDF4的各个版本在本质上是一致的。HDF4具有向后兼容的特性。             
HDF5 推出1998年,相较于以前的HDF文件,可以说是一种全新的文件格式, 它与HDF4 只在概念上一脉相承,而在数据结构的组织上却截然迥异。许多遥感影像采取HDF格式存取, 一些大的图像处理软件也开始提供接口读取 HDF 文件。
        HDF的数据格式是一种 分层式数据管理结构,一个HDF文件中可以 包含多种类型的数据,如栅格图像数据,科学数据集,信息说明数据等,这种数据结构,方便了我们对于信息的提取。例如,当我们打开一个HDF图像文件时,除了可以读取图像信息以外,还可以很容易的查取其地理定位,轨道参数,图像噪声等各种信息参数。        
一个HDF文件应包括一个 文件头(File Header),一个或多个 描述块(Data Descriptor Block),若干个 数据对象(Data Object)
文件头:        
位于HDF文件的头四个字节,其内容为四个控制字符的ASCII码值,四个控制字符为^N,^C,^S,^A,可用于判断一个文件是否为HDF文件格式。
数据对象:        
数据对象是HDF文件最基本的存储元素。包括一个描述符和一个对应的数据元素。
描述符:
        其长度为12个字节,主要用来描述这个数据元素的某些信息。
数据元素:
        它是数据对象中的裸数据部分,也就是数据本身。可以是字符、整数、浮点数、数组等。   在实际的HDF文件中,描述符并不是和它对应的数据元素连在一起,而是把相关的许多描述符放在一起,构成一个数据描述符的块(Data Descriptor Block),在这个块的后面顺序存储了各个描述符所对应的数据元素。打个比方,这里的描述符相当于一本书的目录,而数据元素相当于目录中各个章节所对应的实际内容

总的说来,HDF文件中的物理分布格式如下:
  • 文件头(File Header)
  • 第一个描述符块(First Descriptor Block)
  • 数据元素(Data Element)
  • 更多的描述符块以及更多的数据元素等等
HDF数据类型       
 在这里首先明确两个概念, 数据集(Data Sets)和组(Groups)。HDF文件通常包含几个密切相关的数据对象,把这些数据对象放在一起形成一个数据集,以满足特殊用户的要求。HDF主要有6种主要数据集:栅格图像(RasterImages Sets)、调色板(Palette Sets)、科学数据库(Scientific Data Sets)、注释(Annotation)、Vsets和Vgroup,例如,五个或者六个数据对象可以用来描述一个栅格图像;八个或者更多的数据对象可以用来描述一次科学实验的结果,由于要把不同的数据对象结合起来构成集,就需要一种方法将数据对象有机的结合起来,这样就产生了组的概念,HDF的组用来明确和控制数据集。一个组也是一个数据对象,但是它的数据元素是由一系列的标识符(Tags)和参照数(Reference number)组成,这些标识符和参照数所对应的数据对象就可以构成实际的数据集。例如,构成一个栅格图像的五个或者六个数据对象,它们构成一个集,而它们的标识符和参照数应该放在一个组所对应的数据元素区中,以将它们联系起来。
以下是几种常用的数据集格式:
栅格图像:
        数据模式提供一种灵活方法存储。描述栅格图像数据,包括8bit栅格图像和24bit栅格图像。栅格图像集(Raster Image Sets)提供用来存储图像和任意数量的可供选择的图像描述符的框架,通常包含图像数据布局的描述和图像数据,它还可能包含调色板和颜色校正信息和任何其他相关的用来显示图像的数据。将所有这些信息联系起来的就是栅格图像组(Raster Image Groups),它包含了所有这些数据对象的标识符和参照数。这些数据对象的数量不是固定的,可以通过选择来确定需要的信息。
调色板:
提供图像的色谱。调色板是给一幅图像加入颜色的方法,它相当于一个表格,这个表格可能由不同的大小,但HDF文件只支持256色的显示。对于栅格图像中的每一个数据,在表格中都有其对应的RGB数值,用来显示颜色。
科学数据集:
        用来存储和描述多维科学数据陈列。科学数据集提供了一个用来存储多维数组数据以及其相关信息的框架。数组的数据类型可以是整数或者是浮点数。它的组织方式与栅格图像相同。科学数据集必须包含的组件有数组、名称、数据类型和数组的维数。数组是一种多维的数据结构,它是科学数据集的主要组成部分,存储着所需要的核心数据,比如某一次科学实验结果的数据。科学数据集的名称在其刚产生的时候就赋予了它,在以后的应用中不能再被改变,它的名称在HDF文件中可以不是唯一的,但是唯一的名字将使得在同一文件中区别不同的科学数据集更加容易。
        数据类型指的是存储在数组中数据的类型。数据维数确定了数组的形式和大小。数组维数的数目被称为数组的阶数,每一维都有一个指针和一个标识符,还包含大小和名称。指针是用来描述某一维在数组中的位置。而标识符将它与其他维区别开来。每一维的大小是一个正整数,但是如果其值为零,表示这一维是无限维。另外,科学数据集还提供了三种类型的可供选择的组件:预定义的属性,用户定义的属性和维数规模。预定义的属性有保留的名称,在某些情况下还有预定义的数据类型和数据项目的个数,应用程序可以用预定义的属性来对数据进行操作。用户自定义属性包含了关于文件、数组或者维数的辅助信息。
Vdata:
        是一个类似于框架,用于存储和描述数据的表格。Vdata 是verdex data的缩写,这种数据格式起初是用来存储多边形顶点和边的信息,但现在它的应用范围已经被**扩展了。Vdata相当于一个表格,是很多记录(Records)的集合,每个记录的值存储在固定长度的域(Fields)中,所有的记录的数据结构都是相同的,每个域中的值都有相同的数据类型。一个Vdata都由一个名称,一个类和一系列单独的域的名称所唯一确定。
        Vdata的名称主要是用来描述Vdata的内容,它通常被用来在文件中搜寻Vdata的位置,一个Vdata的类更进一步的确定了它的数据的用途和目的。最后,Vdata的域的名称是用来分配给Vdata域的标签。每一个记录是由一个或更多的固定长度的域所组成。Vdata的记录和域由指针来标识。这个指针是从零开始依次递增的。每一个域中的数据都有唯一的类型。同时在一个域总可以有几个组件,组件的个数称为域的序(Order)。
        注释(Annotation):文本格式,用来描述HDF文件自身的属性或者HDF数据目标。我们通常需要把一个关于HDF文件信息的文本文件的注释联系起来,或者直接存储在HDF文件中。HDF提供了两种实现这一目的方法:注释数据对象和属性的分配。需要注意的是注释本身也是一种数据对象,因此它也有自己的描述符,并指向了包含有注释信息的数据元素。这个数据元素有以下的信息:被注释对象的标识符和参照数以及注释本身。 Vgroup:
        用来将数据对象联系起来。一个Vgroup中可以包含其他的Vgroup或者HDF数据对象,因此这种结构类似于Unix文件结构。属于同一个Vgroup的数据对象通常被称为Vgroup的成员,Vgroup必须有一个名称以及一个可供选择的与其相联系的Vgroup类,此二者被用来描述属于同一个Vgroup的数据对象并将其分类。Vgroup的名称是字符串,在HDF文件中不同的Vgroup可以有相同的名字,但是不同的名字可以使得区分Vgroup更加容易,Vgroup类也是一个数据字符串,能够用来根据数据对象的使用目的来分类。同时需要注意的是,Vgroup可以包含任意数目的Vgroups和数据对象,包括其他Vgroup的成员。
1、HDF4
1)低级函数
首先,matlab为hdf函数的读取提供了接口。一种应用程序接口只能够操作一种类型的数据对象。当每调用一种数据类型的专用接口时,其他的数据类型对用户来说都是不可见的,相当于在HDF文件中只有这一种数据类型的数据结构存在。
i.程序包(使用fortran的数据结构)
matlab.io.hdf4.sd 用于HDF数据集
matlab.io.hdfeos.gd HDF-EOS 格点数据
matlab.io.hdfeos.sw HDF-EOS测绘带文件
ii.函数
hdfan,hdfhx ,hdfh,hdfhd,hdfhe,hdfml,hdfpt,hdfv,hdfvf,hdfvh,hdfvs ,hdfdf24,hdfdfr8
分别用于不同类型数据的接口。具体使用方法请自行help,因为二爷实在是没用过这些东东…不好意思了…如果有使用过这些东东的童鞋(估计八成是搞遥感的)愿意分享你们的使用心得,二爷在这里感激不尽!
2)高级函数
hdfinfo 读取hdf文件基本信息
hdfread 读取hdf文件相应内容
hdftool 可视化界面读取hdf文件信息
3)读取方法
使用高级函数去读hdf文件就简单多了
info = hdfinfo('example.hdf')%读取hdf文件信息
dsets = info.SDS%读取SDS信息
dset = hdfread('example.hdf', 'Example SDS')%愉快的读取文件啦~
貌似本文最重要的就是这三行了……
2.HDF5
1)低级函数
Library (H5)
Attribute (H5A)
Dataset (H5D)
Dimension Scale (H5DS)
Error (H5E)
File (H5F)
Group (H5G)
Identifier (H5I)
Link (H5L)
MATLAB (H5ML)
Object (H5O)
Property (H5P)
Reference (H5R)
Dataspace (H5S)
Datatype (H5T)
Filters and Compression (H5Z)
至于这些接口函数库是干什么的,大家自行研究好了…大部分都是打开、读取文件信息、创建新文件和关闭的四个主要功能。
2)高级函数 (我参考的是2015b,我记得之前的版本好像有点不一样。大家注意一下。)
h5create 创建hdf5文件
h5disp 显示hdf5文件属性
h5info 将文件结构读到结构体内
h5read 读取数据
h5readatt 读取属性信息
h5write 写hdf5文件
h5writeatt 写文件属性
3)读取方法
用接口读取hdf的方法我就不说了,因为我不会……(─.─|||
使用高级函数去读hdf文件就简单多了
info = h5info('example.h5')%读取hdf文件信息
level2 = info.Groups(2)
dataset1 = level2.Datasets(1)
data = h5read('example.h5','/g2/dset2.1');%愉快的读取文件啦~
至于批量读取神马的,之前在nc文件部分已经介绍了其精髓,大家模仿一下就好咯~说多了都是废话了~
  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值