grib文件

一、grib文件简介

WMO是世界气象组织,world meteorology organization。

GRIB是WMO开发的一种用于交换和存储规则分布数据的二进制文件格式。最初GRIB表示“二进制格点”(GRIdded Binary),后来扩展为“二进制的通用规则分布信息”(General Regularly-distributed Information in Binary form)。

GRIB 是与计算机无关的压缩的二进制编码,主要用来表示数值天气预报的产品资料。现行的GRIB 码版本有GRIB1 和GRIB2 两种格式。 GRIB2较之GRIB1具有更多优点而被广泛使用。如:表示多维数据、模块性结构、支持多种压缩方式、IEEE标准浮点表示法等。

二、grib相关的库

1、python

grib文件解析有三种方式,pygrib、wgrib、pupygrib。
pupygrib是纯python版的grib文件解析方式,但是它只解析了个大概,并没有解析section7中的数据。
wgrib本身是用C语言实现的库,python中的wgrib是在命令行的基础上做了一些封装。

pupygrib一个例子
···python
import pupygrib as g

filepath = r"C:UsersweidiaoDesktopNAFP_T639_1_FTM-38-NEHE-WIU-281X281-100-1000-999998-002-999998-2018111200-216.GRB"

def parse(filepath):
messages = list(g.read(open(filepath, mode='rb')))
if len(messages) > 1:
raise Exception("I didn't expect len(message)>1,but now len(messages)={}".format(len(messages)))
message = messages[0]
for section_id, section in enumerate(message):
print('=' * 10)
print('section', section_id)
for attr in dir(section):
if not attr.startswith('__'):
print(attr, getattr(section, attr))
if not message[5].dataRepresentationTemplateNumber == 40:
# 只能解压jpeg2000格式的文件
raise Exception("cannot parse dataRepresentationTemplateNumber {}".format(message[5].dataRepresentationTemplateNumber))
return message[7]._data[6:]

def get_data(filepath):
data = parse(filepath)
print(' ' * 3)
print(len(data))
print(dir(data))
print(data[:40].tolist())

parse(filepath)

···

2、java

jgrib已经不活跃了:http://jgrib.sourceforge.net/
jgribx是jrib的替代品 https://github.com/spidru/JGribX
github上有好多,但是质量良莠不齐https://github.com/search?q=grib

三、grib文件格式简介

grib文件包含从0到8共9个section,每个section用途不一样。

section0有16个字节,分别表示GRIB(4字节的字符串),接下来5-6字节保留备用,第7个字节表示discipline也就是所遵守的规范,第8字节表示版本号,一般为2。第9到第16字节共8个字节(一个long型数字)表示整个GRIB message所占字节数。
总之,section0描述的是整个message的信息,是统领全文的作用。

section1至少有21字节,表示一堆版本号和时间。
总之,section1描述的也是数据格式的元信息。

section2是给用户自己用的,用户可以在这里自由发挥。

section3是网格定义区域。

section5是数据格式描述区域,描述了section7中数据的压缩方式。

section7是最重要的部分,从第6个字节开始存储的是压缩的字节数据。

NCEP 官网文档
http://www.nco.ncep.noaa.gov/pmb/docs/grib2/grib2_doc/

四、jpeg2000

JPEG 全名为 Joint Photographic Experts Group,它是一个在国际标准组织(ISO)下从事静态图像压缩标准制定的委员会。它制定出了第一套国标静态图像压缩标准:ISO 10918-1 就是我们俗称的 JPEG 了。由于JPEG优良的品质,使得它在短短的几年内就获得极大的成功,目前网站上百分之八十的图像都是采用JPEG的压缩标准。然而,随著多媒体应用领域的激增,传统JPEG压缩技术已无法满足人们对多媒体图像资料的要求。因此,更高压缩率以及更多新功能的新一代静态图像压缩技术 JPEG 2000 就诞生了。JPEG 2000 正式名称为 “ISO 15444” ,同样是由JPEG 组织负责制定。自1997年三月开始筹划,但这几年间,在算法选取问题上耽误了不少时间,人们普遍预计要到2000年十二月JPEG2000才能制定完成! 但在2000年3 月的东京的一个会议上,可能是由于数字照相机厂商们施加压力,规定基本编码系统的最终协议草案提前出台,终于不用改名为 JPEG2001 了。

JPEG 2000是基于小波变换的图像压缩标准,由Joint Photographic Experts Group组织创建和维护。JPEG 2000通常被认为是未来取代JPEG(基于离散余弦变换)的下一代图像压缩标准。JPEG 2000文件的副档名通常为.jp2,MIME类型是image/jp2。
JPEG2000的压缩比更高,而且不会产生原先的基于离散余弦变换的JPEG标准产生的块状模糊瑕疵。JPEG2000同时支持有损压缩和无损压缩。另外,JPEG2000也支持更复杂的渐进式显示和下载。
JPEG2000是国际标准化组织(ISO)发布的标准,文档代码为ISO/IEC 15444-1:2000。虽然JPEG2000在技术上有一定的优势,但是到目前为止(2006年),网络上采用JPEG2000技术制作的图像文件数量仍然很少,并且大多数的浏览器仍然没有内置支持JPEG2000图像文件的显示。但是,由于JPEG2000在无损压缩下仍然能有比较好的压缩率,所以JPEG2000在图像品质要求比较高的医学图像的分析和处理中已经有了一定程度的广泛应用。

JPEG2000的优点
1、JPEG2000 作为JPEG升级版,高压缩(低码率)是其目标,其压缩率比 JPEG 高约 30% 左右。
2、JPEG2000 同时支持有损和无损压缩,而 JPEG 只能支持有损压缩。因此它适合保存重要图片。
3、JPEG2000 能实现渐进传输,这是JPEG2000的一个极其重要的特征。这也就是我们对 GIF 格式图像常说的“渐现”特性。它先传输图像的轮廓,然后逐步传输数据,不断提高图像质量,让图象由朦胧到清晰显示,而不必是像现在的 JPEG 一样,由上到下慢慢显示。
4、JPEG2000 支持所谓的“感兴趣区域”特性,你可以任意指定图像上你感兴趣区域的压缩质量,还可以选择指定的部份先解压缩。这样我们就可以很方便的突出重点了。

JPEG2000存在版权和专利的风险。这也许是目前JPEG2000技术没有得到广泛应用的原因之一。JPEG2000标准本身是没有授权费用,但是,因为编码的核心部分的各种演算法被大量注册专利,所以一般认为,不太可能避开这些专利费用开发出免授权费的商用编码器。

五、glymur并不好用

使用jpg压缩glymur自带j2k图片,结果压缩之后比j2k要小,这说明jpeg2000似乎不太好用,不知是glymur的问题还是jpeg2000的问题。

import glymur

jp2file = glymur.data.nemo()  # just a path to a JPEG2000 file
print(jp2file)
jp2 = glymur.Jp2k(jp2file)
fullres = jp2[:]
print(fullres.shape)
io.imsave('nemo.jpg', fullres)

做了其他实验也是这样。

import os

import pylab as plt
from skimage import io
import glymur

def transform(filepath):
    target = os.path.join(filepath, 'target')
    if not os.path.exists(target):
        os.mkdir(target)
    for i in filter(lambda file: os.path.isfile(os.path.join(filepath, file)), os.listdir(filepath)):
        img = io.imread(os.path.join(filepath, i))
        jp = glymur.Jp2k(os.path.join(target, i + '.j2k'), data=img)
        print(jp)


def show_difference(filepath):
    target = os.path.join(filepath, 'target')
    for i in filter(lambda file: os.path.isfile(os.path.join(filepath, file)), os.listdir(filepath)):
        original = io.imread(os.path.join(filepath, i))
        jp_path = os.path.join(target, i + '.j2k')
        jp = glymur.Jp2k(jp_path)
        fig, (one, two) = plt.subplots(1, 2)
        one.imshow(original)
        one.set_title('original {}'.format(os.path.getsize(os.path.join(filepath, i))))
        two.imshow(jp[:])
        two.set_title('compressed {}'.format(os.path.getsize(jp_path)))
        plt.show()


transform('imgs')
print('transform over')
show_difference('imgs')

参考资料

百度百科
https://baike.baidu.com/item/GRIB2/13466125?fr=aladdin

wmo grib2官网文档
http://www.wmo.int/pages/prog/www/WMOCodes/WMO306_vI2/LatestVERSION/LatestVERSION.html

pupygrib官网 https://notabug.org/mjakob/pupygrib
pupygrib pypi https://pypi.org/project/pupygrib/

wgrip官网
http://www.cpc.ncep.noaa.gov/products/wesley/wgrib.html

wgrip用法
https://blog.csdn.net/m0_37600626/article/details/79311129

python glymur解析jpeg2000
https://glymur.readthedocs.io/en/latest/
pyopenjpeg已经不维护了,作者推荐使用glymur
https://github.com/khughitt/pyopenjpeg

glymur和pyopenjpeg是在openjpeg上用python封装了一层,它需要依赖openjpeg动态链接库,所以我们需要把这个动态链接库放到全局路径下。

zygrib:http://www.zygrib.org/#section_windows
zygrib是一个可视化工具。

openjpeg是一个用C语言实现的jpeg2000压缩、解压缩算法,非常高端的算法,一般人实现不了,这整个库都是为了一个jpeg2000算法。
https://www.openjpeg.org/

jpeg2000算法-百度百科
https://baike.baidu.com/item/JPEG 2000/8097196?fr=aladdin

jpeg2000编解码原理
https://blog.csdn.net/ytang_/article/details/76571635

jpeg和jpeg2000
https://blog.csdn.net/lg1259156776/article/details/49010219

java解析grib
http://jgrib.sourceforge.net/
https://mvnrepository.com/search?q=grib

原文地址:https://www.cnblogs.com/weiyinfu/p/9975257.html