前面介绍了一些使用商业软件识别断层的方法,很多动手能力比较强的同学希望开展自主的研发。下面介绍两个用软件实现的自动追踪断层的优秀的算法。
01 相似性识别断层算法
断层相似性算法(fault likelihood),也称为断层似然属性,是一种基于相似性算法, 从地震数据体计算得到反映断层发育位置的一种方法。断层通常由地震同相轴不连续表征, 即地震道间的不相似性, 相似值越低, 断层响应特征越明显。
这个算法的主要步骤是这样的:
首先,扫描多个断层走向和凹陷,以最大限度地利用这种基于外观的属性。但是,用于执行此扫描的算法的计算成本与每个断层方向执行平均时使用的样本数无关。换句话说,通过消除窗口中的样本数相等的大因子来提高计算效率。
然后,使用产生的断层可能性、倾角和走向的3D图像,使用算法提取断层表面。下图所示的断层面是断层可能性3D图像中的脊线,由四边形网格表示。
最后,从断层表面旁边的三维地震图像中提取的样本值的差异计算断层抛出面。用来计算断层抛出面的算法是从语音识别问题的经典动态规划解决方案中推导出来的。现在,该解决方案通常被称为动态时间扭曲。通过扩展找到一种空间扭曲,将三维地震图像样本与断层最佳位置对齐,如图所示。
02 最优曲面投票识别断层
在断层属性图像中,断层通常通过相对较低的值或较高的值,并连称线来识别。因此,我们可以考虑从属性图像中挑拣断层作为搜索具有全局最小值或最大值的最优路径(二维)或表面(三维)的问题。使用动态规划算法可以有效地选择此类最佳路径或曲面,这就是最优曲面投票(optimal surface voting)算法的主要思想。
下面介绍一下最优曲面投票算法的主要步骤:
首先,扫描断层倾角和走向。从输入断层属性图像中自动拾取稀疏种子点,该图像可以是突出显示具有相对高值断层的任何地震属性图像。对于每个种子点,有效地选择一个最佳曲面片,该曲面片通过种子点并遵循全局最大断层属性值。
其次,最优路径选择。将所有这些拾取的最优曲面定义为候选,并使用沿曲面后面平滑的断层属性值定义每个曲面候选的投票分数。
最后,收集所有表面投票者的投票分数,得到一个投票分数图,一个新的断层属性图像,其中与断层无关的噪声特征被抑制,而断层特征(具有高投票分数)比输入属性图像中的特征更干净、更连续。
对于曲面候选,还可以通过平均(通过投票分数加权)重叠曲面候选的方向来准确估计断层走向和倾角。从具有清晰连续断层特征的投票评分图中,可以沿着估计的断层走向和倾角跟踪断层特征来提取断层面。最优曲面投票方法的计算量取决于种子点的数量,考虑并行计算来实现是高效的。
现在展示一下相似性算法和最优曲面投票的对比效果。可以看到后者的效果更好。
03 实战操作案例
接下来,我们使用三维地震数据来演示相似性和最优曲面投票的程序运行方法。
前面教程用的是1996年新西兰塔拉纳基盆地叠前数据,这个数据存在很多缺失值,不利于程序处理。本次我们使用的是仿真数据seimic.sgy,数据的尺寸是:141*311*251,概貌是这样的:
我们的代码是在Jython环境编写的,主要考虑到调用IPF工具库,并使用AWT良好的图形化效果。建议运行平台使用Spyder+Eclipse+Jython+PyDev。
整个处理流程包括了两个部分:一是数据预处理,将SEGY格式地震数据转换为DAT格式数据。二是断层识别,通过程序自动化识别断层并显示三维效果。
1.数据预处理
这部分代码在spyder平台运行,主要代码是这样的:
程序的要点包括:
一是读取三维地震数据的代码。在以前的《怎样轻松读取二维和三维地震数据?(含程序)》课程中讲解过类似方法,大家可以挪步过去学习。
二是处理数据过程中,可以先截取一个小块的工区(最好是400*400*200以内的尺寸),这样处理压力小一些。
三是数据格式要转换为float32,保证后续正常处理。
2.断层识别
这部分代码在Eclipse平台运行。Jython部分的配置大家可以自行到百度查看。
为了保证软件项目正常运行,需要外部链接几个关键的java库,包括:jogl-all.jar,jythonlib.jar,libtensorflow-1.2.1.jar,netlib-java.jar,gluegen.jar,ipf.jar等。接下来就是建立一个java project加载工程文件夹和外部的库文件。
地震数据文件拷贝到data\3d\f3d文件夹中。主要程序都在src\osv文件夹中。
在utils.py中修改加载的地震数据三维尺寸。
n1,n2,n3 = 251,311,141 #source
因为java默认是大端读取,所示一维和三维的数值要颠倒。
最后在demo.py中运行断层识别程序。运行时要选择Jython Run。
最优曲面投票识别的断层的函数是:goSurfaceVoting(),不过前面要运行相关程序来计算需要的参数。识别的效果是这样的:
最优曲面投票识别的断层面的函数是:goFaultSurfaces(),识别的效果是这样的:
相似性识别的断层的函数是:goFaultLikelihood(),识别的效果是这样的:
相似性识别的断层面的函数是:goFaultSkins(),识别的效果是这样的:
以上就是今天的课程。这节课讲解了在传统断层识别方法中,使用程序实现比较好的两个算法。我们讲解了算法的原理和实战案例操作。如果大家对软件比较感兴趣或遇到什么问题都可以联系我交流。再见。
扩展阅读:
网友评论