地震数据压缩与解压缩
seismic-zfp的Python项目详细描述
地震zfp
Python库将SEG-Y文件转换为压缩的立方体,并从中检索任意子卷,速度快。在
动机
例如,读取整个SEG-Y卷以检索单个时间片是浪费。在
通过网络复制未压缩的整个SEG-Y文件也是浪费。在
这个库通过实现seismic-zfp (.SGZ) format来解决这两个问题。 此格式基于ZFP compression 从Peter Lindstrom's paper 使用官方的Python绑定,作为zfpy分发。在
ZFP压缩可以在4个d子卷中实现平滑变化的d维数据 以固定的比特率压缩。以4x4x4为单位的32位浮点值 三维叠后SEG-Y文件非常适合于这种方案。在
将适当填充的三维地震体分解为这些单元组 完全填满一个4KB的磁盘块,压缩这些组,然后按顺序写入它们 “到磁盘”生成具有以下属性的文件:
- 2n的压缩比:1压缩, 通常比特率为4时效果良好,意味着比率为8:1
- 任何地震样本的位置都是已知的
- 可以使用minimal冗余I/O读取任意子卷,例如:
- 用4填充IL/XL维度,z维度取决于比特率
- 用64填充IL/XL尺寸,用4填充z尺寸(16:1压缩比)
使用IL/XL优化布局
- 可以使用no冗余I/O读取由4个内联或交叉线组成的组
- 与SEG-Y相比,no可以读取单个内联 最佳方案(提供至少4:1的压缩比)
- 可以通过访问n_traces/16个磁盘块来读取z-slice, 与SEG-Y的n_跟踪磁盘块相比
使用z-slice优化布局
- z切片可以通过访问justn_traces/4096磁盘块来读取, 与SEG-Y的n_跟踪磁盘块相比
seismic-zfp (.SGZ) format还允许在 SEG-Y文件和记录道头,压缩代码标识常量 以及改变跟踪头值并适当地存储这些值。在
注意:以前扩展名.sz用于地震zfp,但已被替换为.sgz,以避免混淆所使用的压缩算法。
获取地震zfp
- 来自PyPI的带zgy支撑的车轮:
pip install seismic-zfp[zgy]
- 来自PyPI的车轮,无zgy支持:
pip install seismic-zfp
- 来源于Github:
git clone https://github.com/equinor/seismic-zfp.git
注意,seismic zfp依赖于Python包ZFPY和{a13},它们是为Linux和Windows构建的PyPI上的二进制发行版。
示例
提供了完整的示例代码here,但以下参考很有用:
从SEG-Y或ZGY创建SGZ文件
fromseismic_zfp.conversionimportSegyConverter,ZgyConverter,SgzConverterwithSegyConverter("in.sgy")asconverter:# Create a "standard" SGZ file with 8:1 compression, using in-memory methodconverter.run("out_standard.sgz",bits_per_voxel=4)# Create a "z-slice optimized" SGZ fileconverter.run("out_adv.sgz",bits_per_voxel=2,blockshape=(64,64,4))withZgyConverter("in_8-int.zgy")asconverter:# 8-bit integer ZGY and 1-bit SGZ have similar qualityconverter.run("out_8bit.sgz",bits_per_voxel=1)
将SGZ文件转换为SEG-Y
^{pr2}$读取SGZ文件
fromseismic_zfp.readimportSgzReaderwithSgzReader("in.sgz")asreader:inline_slice=reader.read_inline(LINE_IDX)crossline_slice=reader.read_crossline(LINE_IDX)z_slice=reader.read_zslice(LINE_IDX)sub_vol=reader.read_subvolume(min_il=min_il,max_il=max_il,min_xl=min_xl,max_xl=max_xl,min_z=min_z,max_z=max_z)
使用类似segyio的接口读取SGZ文件
importseismic_zfpwithseismic_zfp.open("in.sgz"))assgzfile:il_slice=sgzfile.iline[sgzfile.ilines[LINE_NUMBER]]xl_slices=[xlforxlinsgzfile.xline]zslices=sgzfile.depth_slice[:5317]trace=sgzfile.trace[TRACE_IDX]trace_header=sgzfile.header[TRACE_IDX]binary_file_header=sgzfile.bintext_file_header=sgzfile.text[0]
命令行界面
seismic zfp还附带了一个用于从SEGY或ZGY转换到SGZ的简单命令行界面。这可以使用命令seismic-zfp
。在
从SEGY转换到SGZ
seismic-zfp sgy2sgz <INPUT FILE PATH> <OUTPUT FILE PATH> --bits-per-voxel 4
要查看所有选项,请运行命令seismic-zfp sgy2sgz --help
从ZGY转换为SGZ
seismic-zfp zgy2sgz <INPUT FILE PATH> <OUTPUT FILE PATH> --bits-per-voxel 4
要查看所有选项,请运行命令seismic-zfp zgy2sgz --help
贡献
无论您是在报告或修复错误,实现或请求功能,都欢迎您的贡献。要么发出github问题,要么派生项目并发出请求。请用相关的通过/失败测试扩展单元测试,运行方式如下:python -m pytest
- 项目
标签: