地震数据压缩与解压缩

seismic-zfp的Python项目详细描述


地震zfp

LGPLv3 LicenseTravisAppveyorPyPi Version

Python库将SEG-Y文件转换为压缩的立方体,并从中检索任意子卷,速度快。在

动机

例如,读取整个SEG-Y卷以检索单个时间片是浪费。在

通过网络复制未压缩的整个SEG-Y文件也是浪费。在

这个库通过实现seismic-zfp (.SGZ) format来解决这两个问题。 此格式基于ZFP compressionPeter 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

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java JDBC(MS SQL)禁用所有传输以执行sp_replicationdboption语句   java运行时外部数据加载   运行gradlew build时出现java ListenerNotificationException   java如何使用按钮列表进行onClick(GWT)   java对滚动视图上具有特定资源ID的所有元素进行计数   要在数据库中插入的spring Java注释   Gradle Kotlin应用程序的java初学者脚本找不到主类   java在ms access中保存jpeg格式,并在swing的面板上显示   java存储字符串:最终类与外部存储中的文件   Java注释ElementType常量是什么意思?   java是ByteArrayInputStream真的是流吗?   java Eclipse项目和Maven pom文件不在同一目录中