plane-wave sobel attribute for discontinuity enhancement...

14
Plane-wave Sobel attribute for discontinuity enhancement in seismic images a a Published in Geophysics, 82, WB63-WB69, (2017) Mason Phillips and Sergey Fomel ABSTRACT Discontinuity enhancement attributes are commonly used to facilitate the interpre- tation process by enhancing edges in seismic images and providing a quantitative measure of the significance of discontinuous features. These attributes require careful pre-processing to maintain geologic features and suppress acquisition and processing artifacts which may be artificially detected as a geologic edge. We propose the plane-wave Sobel attribute, a modification of the classic Sobel filter, by orienting the filter along seismic structures using plane-wave destruction and plane- wave shaping. The plane-wave Sobel attribute can be applied directly to a seismic image to efficiently and effectively enhance discontinuous features, or to a coherence image to create a sharper and more detailed image. Two field benchmark data examples with many faults and channel features from offshore New Zealand and offshore Nova Scotia demonstrate the effectiveness of this method compared to conventional coherence attributes. The results are reproducible using the Madagascar software package. INTRODUCTION One of the major challenges of interpreting seismic images is the delineation of reflection discontinuities that are related to distinct geologic features, such as faults, channels, salt boundaries, and unconformities. Visually prominent reflection features often overshadow these subtle discontinuous features which are critical to understanding the structural and depositional environment of the subsurface. For this reason, precise manual interpretation of these reflection discontinuities in seismic images can be tedious and time-consuming, es- pecially when data quality is poor. Discontinuity enhancement attributes are among the most widely used seismic attributes today. These attributes are generally post-stack image domain calculations of the similarity or dissimilarity along a horizon or time-slice between a neighborhood of adjacent seismic traces (Barnes, 2016). Discontinuous features, such as faults, channels, salt boundaries, unconformities, mass-transport complexes, and subtle stratigraphic features can be identified as areas of low similarity. Such attributes are power- ful image processing tools that enable detailed interpretation of previously indistinguishable features. Bahorich and Farmer (1995) proposed the first celebrated discontinuity enhancement attribute and coined the term “coherence”. The attribute produces images of the normalized local cross-correlations between adjacent seismic traces and combines them to estimate coherence. This algorithm provided the framework for semblance, the generalization to an arbitrary number of traces, proposed by Marfurt et al. (1998). Using multidimensional

Upload: others

Post on 20-Jul-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

  • Plane-wave Sobel attribute for discontinuity enhancement inseismic imagesa

    aPublished in Geophysics, 82, WB63-WB69, (2017)

    Mason Phillips and Sergey Fomel

    ABSTRACT

    Discontinuity enhancement attributes are commonly used to facilitate the interpre-tation process by enhancing edges in seismic images and providing a quantitativemeasure of the significance of discontinuous features. These attributes require carefulpre-processing to maintain geologic features and suppress acquisition and processingartifacts which may be artificially detected as a geologic edge.We propose the plane-wave Sobel attribute, a modification of the classic Sobel filter,by orienting the filter along seismic structures using plane-wave destruction and plane-wave shaping. The plane-wave Sobel attribute can be applied directly to a seismicimage to efficiently and effectively enhance discontinuous features, or to a coherenceimage to create a sharper and more detailed image. Two field benchmark data exampleswith many faults and channel features from offshore New Zealand and offshore NovaScotia demonstrate the effectiveness of this method compared to conventional coherenceattributes. The results are reproducible using the Madagascar software package.

    INTRODUCTION

    One of the major challenges of interpreting seismic images is the delineation of reflectiondiscontinuities that are related to distinct geologic features, such as faults, channels, saltboundaries, and unconformities. Visually prominent reflection features often overshadowthese subtle discontinuous features which are critical to understanding the structural anddepositional environment of the subsurface. For this reason, precise manual interpretationof these reflection discontinuities in seismic images can be tedious and time-consuming, es-pecially when data quality is poor. Discontinuity enhancement attributes are among themost widely used seismic attributes today. These attributes are generally post-stack imagedomain calculations of the similarity or dissimilarity along a horizon or time-slice betweena neighborhood of adjacent seismic traces (Barnes, 2016). Discontinuous features, suchas faults, channels, salt boundaries, unconformities, mass-transport complexes, and subtlestratigraphic features can be identified as areas of low similarity. Such attributes are power-ful image processing tools that enable detailed interpretation of previously indistinguishablefeatures.

    Bahorich and Farmer (1995) proposed the first celebrated discontinuity enhancementattribute and coined the term “coherence”. The attribute produces images of the normalizedlocal cross-correlations between adjacent seismic traces and combines them to estimatecoherence. This algorithm provided the framework for semblance, the generalization toan arbitrary number of traces, proposed by Marfurt et al. (1998). Using multidimensional

  • Phillips & Fomel 2 Plane-wave Sobel attribute

    correlations, this approach improves vertical resolution. Both of these correlation-basedmethods can be sensitive to lateral amplitude variations, which may obscure features suchas faults and channels.

    The local covariance matrix measures the uniformity of a seismic image in each dimen-sion. Decomposing this matrix into its eigenvectors and eigenvalues provides a quantitativemeasure of local variations of seismic structures. Gersztenkorn and Marfurt (1999) pro-pose to compute the ratio of the largest eigenvalue and the sum of all eigenvalues of thecovariance matrix at each sample, highlighting areas where there is no dominant texturein the seismic image. This attribute is commonly called “eigenstructure coherence” andis only sensitive to lateral changes in phase. A similar decomposition can be applied tothe structure-tensor which measures the local covariance of the image in each dimension(Randen et al., 2000, 2001; Bakker, 2002). Local linearity and planarity can be computedfrom the eigenvalues of the structure-tensor. Wu (2017) proposes to modify the traditionalstructure-tensor decomposition by orienting the image gradient along seismic structures.Discontinuous features are highlighted further by smoothing along discontinuities.

    Information about reflection dip in seismic images allow filters to be oriented alongseismic reflections. Variance is a simple, but effective attribute which highlights unpre-dictable signal associated with discontinuous features. The local variance calculation is ori-ented along structure using the eigenvectors of the structure-tensor (Randen et al., 2001).Hale (2009) also orients semblance along seismic reflections using the eigenvectors of thestructure-tensor, and additionally applies smoothing along directions perpendicular to thereflections to provide an enhanced image. Karimi et al. (2015) uses predictive painting(Fomel, 2010) to generate multiple predictions of local structures in seismic images. Thedifference between the predicted and real data provides an image with isolated discontinu-ities.

    To compute a discontinuity enhancement image for detection and extraction of faultsurfaces, semblance can be computed along fault strike and dip orientations. Cohen et al.(2006) use the normalized differential entropy attribute to enhance faults. Local fault planesare separated and extracted using an adaptive image-binarization-and-skeletonization algo-rithm. This method effectively extracts fault surfaces by segmenting the coherence image.Hale (2013) and Wu and Hale (2016) propose to scan through fault strikes and dips to max-imize the semblance attribute. Fault surfaces are constructed by picking along the ridges ofthe likelihood attribute. Additionally, images can be unfaulted by estimating fault throwsusing correlations of seismic reflections across fault surfaces (Wu et al., 2016).

    In image analysis, the traditional Sobel filter can be used to efficiently compute animage with enhanced discontinuities (Sobel and Feldman, 1968). The Sobel filter is an edgedetector which computes an approximation of the gradient of the image intensity functionat each point by convolving the data with a zero-phase discrete differential operator anda perpendicular triangular smoothing filter. This 2D filter is small and integer-valuedin each direction, making it computationally inexpensive to apply to images (O’Gormanet al., 2008). Luo et al. (1996) first proposed the applications of Sobel filters to seismicimages. Since, modifications of the Sobel filter have been proposed for edge detection inseismic images by orienting the filter along local slopes estimated by maximizing local cross-correlation and dynamically adapting the size of the filter based on local frequency content(Aqrawi et al., 2011; Aqrawi and Boe, 2011; Aqrawi, 2014). Dip-oriented Sobel filters canbe applied directly to a seismic image to compute an image with enhanced edges, or to

  • Phillips & Fomel 3 Plane-wave Sobel attribute

    coherence images to further sharpen previously enhanced edges (Chopra et al., 2014).

    We propose to modify the definition of the Sobel filter to follow seismic structures. Wemodify the Sobel filter by replacing the discrete differential operator with linear plane-wavedestruction (Fomel, 2002) and triangular smoothing with plane-wave shaping (Fomel, 2007;Swindeman, 2015; Phillips et al., 2016). This method is particularly efficient because itdoes not require computation of the eigenvectors of the covariance matrix or structure-tensor. Local slopes are instead estimated using accelerated plane-wave destruction (Chenet al., 2013). We further modify the Sobel filter by orienting the filter along the azimuthperpendicular to discontinuities by implementing an azimuth scanning workflow (Merzlikinet al., 2017b). Merzlikin et al. (2017a) demonstrate the successful application of plane-wave Sobel filtering in the data domain to highlight seismic diffractions before imagingdiscontinuous features. We test our modification on benchmark 3D seismic images fromoffshore New Zealand and Nova Scotia, Canada and compare the results with those fromalternative coherence attributes.

    THEORY

    The traditional Sobel operator approximates a smoothed gradient of the image intensityfunction. It is defined as the convolution of an image with two 3×3 filters. The first of thesefilters (Si) differentiates in the inline direction and averages in the crossline direction. Thesecond filter (Sx) differentiates in the crossline direction and averages in the inline direction.

    Si =

    −1 0 1−2 0 2−1 0 1

    = 12

    1

    [ −1 0 1 ] (1)

    Sx = STi =

    −1 −2 −10 0 01 2 1

    (2)In the Z-transform notation, filters (1) and (2) can be expressed as

    Si(Zi, Zx) = (Zx + 2 + Z−1x )(Zi − Z−1i )Sx(Zi, Zx) = (Zx − Z−1x )(Zi + 2 + Z−1i )

    (3)

    where Zj is a phase shift in the j direction.

    The inline and crossline images are combined to approximate the magnitude of the imagegradient (Chopra and Marfurt, 2007) where d is the data and Si and Sx are convolutionoperators with the filters Si and Sx, respectively.

    ‖∇d‖ ≈√

    (Sid)2 + (Sxd)2 (4)

    We propose to modify the filter for application to 3D seismic images by orienting the filteralong the structure of seismic reflectors. Local slopes of seismic reflections are estimatedin the inline and crossline directions using accelerated plane-wave destruction filters (Chen

  • Phillips & Fomel 4 Plane-wave Sobel attribute

    et al., 2013). The local-plane wave model assumes seismic traces can be effectively predictedby dynamically shifting adjacent seismic traces. This dynamic shift corresponds to the dipof seismic reflections. This model is useful for seismic data characterization and is the basisfor plane-wave destruction filters. The local plane-wave differential equation is defined byClaerbout (1992) as

    ∂u

    ∂x+ p

    ∂u

    ∂t= 0 , (5)

    where u is the seismic wavefield and p is the temporally and spatially variable localslope. The optimal local slopes in the inline and crossline directions can be determined byminimizing the regularized plane-wave residual (Fomel, 2002; Chen et al., 2013).

    We further modify the Sobel filter by replacing the derivative operation with plane-wavedestruction (Fomel, 2002) and the smoothing operation with plane-wave shaping (Fomel,2007; Swindeman, 2015). High order plane-wave destruction filters are described in theZ-transform notation as

    Ci(pi) = B(pi, Z−1t )− ZiB(pi, Zt)Cx(px) = B(px, Z−1t )− ZxB(px, Zt)

    (6)

    where C is the plane-wave destruction filter, B is an all-pass filter, and pi and px arethe local slopes in the inline and crossline directions, respectively.

    Inline and crossline shaping filters are applied to the crossline and inline plane-wavedestruction images, respectively. Thus, the plane-wave Sobel filter modifies equation (3) byeffectively replacing Zi with

    ZiB(pi, Zt)B(pi, Z−1t )

    (7)

    and Zx with

    ZxB(px, Zt)B(px, Z−1t )

    . (8)

    This modification effectively orients the plane-wave Sobel filter along seismic reflectionstructures.

    In the conventional implementation, the inline and crossline images are combined toproduce the final image (equation 4). We propose an alternative approach based on theefficient azimuth scanning workflow (Merzlikin et al., 2017b). We scan through a windowof azimuths and compute the Lq norm of linear combinations of the inline and crosslineimages weighted by the sine and cosine of the azimuth α

    Ŝ(α, pi, px) = ‖Si(pi, px)d cosα+ Sx(pi, px)d sinα‖q (9)

    where Si(pi, px) and Sx(pi, px) correspond to convolution operators with the filtersSi(pi, px) and Sx(pi, px), respectively. The azimuth which corresponds with the discon-tinuous features produces the best image at each point is picked on a semblance-like panelusing a regularized automatic picking algorithm (Fomel, 2009). In images with cross-cuttingrelationships between discontinuous geologic features, the azimuth which corresponds to the

  • Phillips & Fomel 5 Plane-wave Sobel attribute

    more prominent discontinuity will be preferentially selected. The ensemble of images is thensliced using the pick to generate the optimal image. This improves the resolution of discon-tinuous features by effectively orienting the plane-wave Sobel filter perpendicular to edgesin the seismic image.

    As suggested by equation (9), this workflow can be applied the seismic image d; however,we find that the azimuth of the seismic expression of discontinuous geologic features canbe estimated more accurately by applying the workflow outlined above to a coherence,semblance, or Sobel filtered image. In other words, we suggest to replace d in equation(9) with the plane-wave Sobel filter image ((Si(pi, px)d)2 + (Sx(pi, px)d)2). By cascadingmultiple iterations of the plane-wave Sobel filter, we generate a more segmented image withless noise and improved estimates of the azimuth of the discontinuous features as expressedin the seismic image. Instead of replacing d with the plane-wave Sobel filter image, weinvite users to cascade their favorite coherence or semblance attributes with the plane-waveSobel filter to further enhance discontinuous features in seismic images.

    EXAMPLE I

    Our first example is a subset of the Parihaka seismic data (full-stack, anisotropic, Kirchhoffprestack time migrated). This marine 3D seismic volume was acquired offshore New Zealandand is available in the SEG open data repository (New Zealand Petroleum & Minerals, 2014).

    This image contains complex geologic structures, including multiple generations of fault-ing, meandering channel systems, and prominent unconformities (Figure 1).

    We first apply the traditional Sobel filter. This attribute enhances discontinuous geologicfeatures, but also enhances dipping reflectors (Figure 3a).

    In order to optimally enhance discontinuous features, it is important to orient the filteralong local slopes. We compute the structural dip in the inline (Figure 2a) and crossline(Figure 2b) directions using accelerated plane-wave destruction (Chen et al., 2013). Usingthe local slopes, we apply structure-oriented smoothing to enhance seismic structures andattenuate noise without blurring geologic edges (Liu et al., 2010). We subsequently applythe proposed plane-wave Sobel filter and compute the magnitude of the inline and crosslineplane-wave Sobel images. Discontinuous geologic features, most prominently faults, chan-nels, and unconformities, are enhanced, revealing subtle details which would be difficult tointerpret from the original seismic image (Figure 3b).

    We compute a more segmented image by cascading another iteration of filtering tothe Sobel image (Figure 3c). Alternatively the second iteration of Sobel filtering may beoriented not only along the dip of seismic reflections, but also the azimuth, using structuralinformation derived from the original image (Figure 3d). We compute linear combinationsof these inline and crossline images weighted by the cosine and sine of the azimuth. The localazimuth of the faults and channels corresponds to the orientation which creates the optimalimage at each point. We find that the azimuth of the seismic expression of discontinuousgeological features can be estimated more accurately by applying the azimuth scanningworkflow to the Sobel filter image rather than the original seismic image. Faults andchannels are further segmented in the cascaded image by automatically orienting the Sobelfilter along geologic structures (Figure 3d).

  • Phillips & Fomel 6 Plane-wave Sobel attribute

    Figure 1: The Parihaka seismic data

    (a) (b)

    Figure 2: (a) Inline and (b) crossline reflection slopes computed using accelerated plane-wave destruction

    from rsf.proj import *from math import piimport os.path

    env = Environment()

    gray = 'window f1=104 n1=1 | grey label1=IL label2=XL unit1= unit2= title=%s'white = 'window f1=104 n1=1 | grey allpos=y polarity=y label1=IL label2=XL unit1= unit2= title=%s'color = 'window f1=104 n1=1 | grey color=j scalebar=y label1=IL label2=XL unit1= unit2= title=%s barlabel=%s'gray3 = 'byte gainpanel=all | grey3 frame1=104 frame2=200 frame3=100 flat=y point1=.3 label1=Time label2=IL label3=XL unit1=s unit2= unit3= title=%s'white3 = 'byte gainpanel=all allpos=y polarity=y | grey3 frame1=104 frame2=200 frame3=100 flat=y point1=.3 label1=Time label2=IL label3=XL unit1=s unit2= unit3= title=%s'color3 = 'byte bar=bar.rsf gainpanel=all | grey3 color=j scalebar=y frame1=104 frame2=200 frame3=100 flat=y point1=.3 label1=Time label2=IL label3=XL unit1=s unit2= unit3= title=%s barlabel=%s'segy = 'Parihaka_PSTM_full_angle.sgy'

    Fetch(segy,dir='PARIHAKA-3D', server='https://s3.amazonaws.com', top='open.source.geoscience/open_data/newzealand/Taranaiki_Basin')

    Flow('seis head',segy,'segyread tfile=${TARGETS[1]}')Flow('parihaka','seis head','intbin head=${SOURCES[1]} xk=iline yk=xline | put label2=IL label3=XL')Flow('sub','parihaka','window min1=1 max1=1.62 min2=2200 max2=2600 min3=4820 max3=5200')#Result('sub',gray % '"Seismic data"')Result('sub',gray3 % '"Seismic data"' )

    Flow('iflat','sub','grad3 dim=2 | smooth rect3=3')Flow('flat','sub iflat','grad3 dim=3 | smooth rect2=3 | math x=${SOURCES[1]} output="sqrt(input*input+x*x)"')Result('flat',white3 % '"Flat Sobel"')

    ############################ DIP ESTIMATION ############################# rect1, rect2, and rect3 control the smoothness of the local dip model# In images with structural complexity, less smoothing will yield a beter # result.# However, poor quality images may require more smoothing.# For this subset of the Parihaka seismic data, I find results are best for# with a relatively small smoothing window (rect? = 10)Flow('dip','sub','fdip n4=2 rect1=10 rect2=10 rect3=10')Flow('idip','dip','window n4=1')Flow('xdip','dip','window f4=1')Flow('xdip23','xdip','transp plane=23')Result('idip',color3 % ('"IL Dip"','"Slope"') )Result('xdip',color3 % ('"XL Dip"','"Slope"') )

    ######################################## STRUCTURE-ENHANCING FILTER ######################################### I use a larger smoothing window in the inline direction (ns2) to supress# acquisition footprintFlow('pari','sub dip','pwspray2 dip=${SOURCES[1]} ns2=3 ns3=1 | transp | median')Result('pari',gray3 % "Seismic Data" )

    ################Flow('ipwd','pari idip','pwd n4=0 dip=${SOURCES[1]}')Flow('xpwd','pari xdip','pwd n4=1 dip=${SOURCES[1]}')Flow('isobel','ipwd xdip23','transp plane=23 | pwsmooth dip=${SOURCES[1]} ns=3 | transp plane=23')Flow('xsobel','xpwd idip','pwsmooth dip=${SOURCES[1]} ns=3')Result('isobel',white3 % '"IL Sobel"')Result('xsobel',white3 % '"XL Sobel"')

    Flow('sobel','isobel xsobel','math x=${SOURCES[1]} output="(input*input+x*x)" | smooth rect1=3')Result('sobel',white3 % '"Plane-wave Sobel"')

    Flow('ipwd2','sobel idip','pwd n4=0 dip=${SOURCES[1]}')Flow('xpwd2','sobel xdip','pwd n4=1 dip=${SOURCES[1]}')Flow('isobel2','ipwd2 xdip23','transp plane=23 | pwsmooth dip=${SOURCES[1]} ns=3 | transp plane=23')Flow('xsobel2','xpwd2 idip','pwsmooth dip=${SOURCES[1]} ns=3')

    Flow('sobel2','isobel2 xsobel2','math x=${SOURCES[1]} output="sqrt(input*input+x*x)" | smooth rect1=3')Result('sobel2',white3 % '"Cascaded Sobel"' )

    ############################## AZIMUTH SCANNING ############################### Proper parameter selection is critical in this section.# If discontinuous features follow many different azimuths, use small # smoothing parameters and large anisotropy parameter.# If discontinuous features follow consistent azimuth, set vel0 to that# azimuth and use large smoothing parameters.n1 = 208na = 45picks = []slices = []for i in range(n1): isobelt = 'isobelt-%d' % i xsobelt = 'xsobelt-%d' % i Flow(isobelt,'isobel2','window f1=%d n1=1' % i ) Flow(xsobelt,'xsobel2','window f1=%d n1=1' % i ) asobels = [] for j in range(0,360,8): a = j*pi/180 asobel = 'asobel-%d-%d' % (i,j) Flow(asobel,[isobelt,xsobelt],'math x=${SOURCES[1]} output="abs(input*cos(%f)+x*sin(%f))"' % (a,a) ) asobels.append(asobel)

    asobelt = 'asobel-%d' % i Flow(asobelt,asobels,'cat ${SOURCES[1:%d]} axis=3 | put d3=8 o3=0 | scale axis=3 | transp plane=23' % na )# env.AddPostAction(asobelt+'.rsf','/bin/bash ./ignore.sh %s' % (asobelt) )

    ################ pick = 'pick-%d' % i Flow(pick,asobelt,'pick vel0=180 rect1=20 rect2=20 an=1') picks.append(pick)

    slice = 'slice-%d' % i Flow(slice,[asobelt,pick],'slice pick=${SOURCES[1]}') slices.append(slice)

    Flow('picks',picks,'cat ${SOURCES[1:%d]} axis=3 | transp plane=23 | transp' % n1 )Result('picks','byte bar=bar.rsf gainpanel=all bias=180 | grey3 color=j scalebar=y frame1=104 frame2=200 frame3=100 flat=y point1=.3 label1=Time label2=IL label3=XL unit1=s unit2= unit3= title=Azimuth barlabel=Azimuth')

    Flow('slices',slices,'cat ${SOURCES[1:%d]} axis=3 | transp plane=23 | transp' % n1 )#Result('slices','clip clip=.02 value=1 | '+white3)Result('slices',white3 % '"Azimuthal Sobel"')

    Flow('az','slices picks','mul ${SOURCES[1]}')Result('az','byte bar=bar.rsf gainpanel=all bias=180 minval=90 maxval=270 | grey3 color=j scalebar=y frame1=104 frame2=200 frame3=100 flat=y point1=.3 label1=Time label2=IL label3=XL unit1=s unit2= unit3= title=Azimuth barlabel=Azimuth')

    End()

    from rsf.proj import *from math import piimport os.path

    env = Environment()

    gray = 'window f1=104 n1=1 | grey label1=IL label2=XL unit1= unit2= title=%s'white = 'window f1=104 n1=1 | grey allpos=y polarity=y label1=IL label2=XL unit1= unit2= title=%s'color = 'window f1=104 n1=1 | grey color=j scalebar=y label1=IL label2=XL unit1= unit2= title=%s barlabel=%s'gray3 = 'byte gainpanel=all | grey3 frame1=104 frame2=200 frame3=100 flat=y point1=.3 label1=Time label2=IL label3=XL unit1=s unit2= unit3= title=%s'white3 = 'byte gainpanel=all allpos=y polarity=y | grey3 frame1=104 frame2=200 frame3=100 flat=y point1=.3 label1=Time label2=IL label3=XL unit1=s unit2= unit3= title=%s'color3 = 'byte bar=bar.rsf gainpanel=all | grey3 color=j scalebar=y frame1=104 frame2=200 frame3=100 flat=y point1=.3 label1=Time label2=IL label3=XL unit1=s unit2= unit3= title=%s barlabel=%s'segy = 'Parihaka_PSTM_full_angle.sgy'

    Fetch(segy,dir='PARIHAKA-3D', server='https://s3.amazonaws.com', top='open.source.geoscience/open_data/newzealand/Taranaiki_Basin')

    Flow('seis head',segy,'segyread tfile=${TARGETS[1]}')Flow('parihaka','seis head','intbin head=${SOURCES[1]} xk=iline yk=xline | put label2=IL label3=XL')Flow('sub','parihaka','window min1=1 max1=1.62 min2=2200 max2=2600 min3=4820 max3=5200')#Result('sub',gray % '"Seismic data"')Result('sub',gray3 % '"Seismic data"' )

    Flow('iflat','sub','grad3 dim=2 | smooth rect3=3')Flow('flat','sub iflat','grad3 dim=3 | smooth rect2=3 | math x=${SOURCES[1]} output="sqrt(input*input+x*x)"')Result('flat',white3 % '"Flat Sobel"')

    ############################ DIP ESTIMATION ############################# rect1, rect2, and rect3 control the smoothness of the local dip model# In images with structural complexity, less smoothing will yield a beter # result.# However, poor quality images may require more smoothing.# For this subset of the Parihaka seismic data, I find results are best for# with a relatively small smoothing window (rect? = 10)Flow('dip','sub','fdip n4=2 rect1=10 rect2=10 rect3=10')Flow('idip','dip','window n4=1')Flow('xdip','dip','window f4=1')Flow('xdip23','xdip','transp plane=23')Result('idip',color3 % ('"IL Dip"','"Slope"') )Result('xdip',color3 % ('"XL Dip"','"Slope"') )

    ######################################## STRUCTURE-ENHANCING FILTER ######################################### I use a larger smoothing window in the inline direction (ns2) to supress# acquisition footprintFlow('pari','sub dip','pwspray2 dip=${SOURCES[1]} ns2=3 ns3=1 | transp | median')Result('pari',gray3 % "Seismic Data" )

    ################Flow('ipwd','pari idip','pwd n4=0 dip=${SOURCES[1]}')Flow('xpwd','pari xdip','pwd n4=1 dip=${SOURCES[1]}')Flow('isobel','ipwd xdip23','transp plane=23 | pwsmooth dip=${SOURCES[1]} ns=3 | transp plane=23')Flow('xsobel','xpwd idip','pwsmooth dip=${SOURCES[1]} ns=3')Result('isobel',white3 % '"IL Sobel"')Result('xsobel',white3 % '"XL Sobel"')

    Flow('sobel','isobel xsobel','math x=${SOURCES[1]} output="(input*input+x*x)" | smooth rect1=3')Result('sobel',white3 % '"Plane-wave Sobel"')

    Flow('ipwd2','sobel idip','pwd n4=0 dip=${SOURCES[1]}')Flow('xpwd2','sobel xdip','pwd n4=1 dip=${SOURCES[1]}')Flow('isobel2','ipwd2 xdip23','transp plane=23 | pwsmooth dip=${SOURCES[1]} ns=3 | transp plane=23')Flow('xsobel2','xpwd2 idip','pwsmooth dip=${SOURCES[1]} ns=3')

    Flow('sobel2','isobel2 xsobel2','math x=${SOURCES[1]} output="sqrt(input*input+x*x)" | smooth rect1=3')Result('sobel2',white3 % '"Cascaded Sobel"' )

    ############################## AZIMUTH SCANNING ############################### Proper parameter selection is critical in this section.# If discontinuous features follow many different azimuths, use small # smoothing parameters and large anisotropy parameter.# If discontinuous features follow consistent azimuth, set vel0 to that# azimuth and use large smoothing parameters.n1 = 208na = 45picks = []slices = []for i in range(n1): isobelt = 'isobelt-%d' % i xsobelt = 'xsobelt-%d' % i Flow(isobelt,'isobel2','window f1=%d n1=1' % i ) Flow(xsobelt,'xsobel2','window f1=%d n1=1' % i ) asobels = [] for j in range(0,360,8): a = j*pi/180 asobel = 'asobel-%d-%d' % (i,j) Flow(asobel,[isobelt,xsobelt],'math x=${SOURCES[1]} output="abs(input*cos(%f)+x*sin(%f))"' % (a,a) ) asobels.append(asobel)

    asobelt = 'asobel-%d' % i Flow(asobelt,asobels,'cat ${SOURCES[1:%d]} axis=3 | put d3=8 o3=0 | scale axis=3 | transp plane=23' % na )# env.AddPostAction(asobelt+'.rsf','/bin/bash ./ignore.sh %s' % (asobelt) )

    ################ pick = 'pick-%d' % i Flow(pick,asobelt,'pick vel0=180 rect1=20 rect2=20 an=1') picks.append(pick)

    slice = 'slice-%d' % i Flow(slice,[asobelt,pick],'slice pick=${SOURCES[1]}') slices.append(slice)

    Flow('picks',picks,'cat ${SOURCES[1:%d]} axis=3 | transp plane=23 | transp' % n1 )Result('picks','byte bar=bar.rsf gainpanel=all bias=180 | grey3 color=j scalebar=y frame1=104 frame2=200 frame3=100 flat=y point1=.3 label1=Time label2=IL label3=XL unit1=s unit2= unit3= title=Azimuth barlabel=Azimuth')

    Flow('slices',slices,'cat ${SOURCES[1:%d]} axis=3 | transp plane=23 | transp' % n1 )#Result('slices','clip clip=.02 value=1 | '+white3)Result('slices',white3 % '"Azimuthal Sobel"')

    Flow('az','slices picks','mul ${SOURCES[1]}')Result('az','byte bar=bar.rsf gainpanel=all bias=180 minval=90 maxval=270 | grey3 color=j scalebar=y frame1=104 frame2=200 frame3=100 flat=y point1=.3 label1=Time label2=IL label3=XL unit1=s unit2= unit3= title=Azimuth barlabel=Azimuth')

    End()

  • Phillips & Fomel 7 Plane-wave Sobel attribute

    (a) (b)

    (c) (d)

    Figure 3: (a) The traditional Sobel filter, (b) proposed plane-wave Sobel filter, (c) cascadedplane-wave Sobel filter, and (d) azimuthal plane-wave Sobel filter applied to the Parihakaseismic data

    from rsf.proj import *from math import piimport os.path

    env = Environment()

    gray = 'window f1=104 n1=1 | grey label1=IL label2=XL unit1= unit2= title=%s'white = 'window f1=104 n1=1 | grey allpos=y polarity=y label1=IL label2=XL unit1= unit2= title=%s'color = 'window f1=104 n1=1 | grey color=j scalebar=y label1=IL label2=XL unit1= unit2= title=%s barlabel=%s'gray3 = 'byte gainpanel=all | grey3 frame1=104 frame2=200 frame3=100 flat=y point1=.3 label1=Time label2=IL label3=XL unit1=s unit2= unit3= title=%s'white3 = 'byte gainpanel=all allpos=y polarity=y | grey3 frame1=104 frame2=200 frame3=100 flat=y point1=.3 label1=Time label2=IL label3=XL unit1=s unit2= unit3= title=%s'color3 = 'byte bar=bar.rsf gainpanel=all | grey3 color=j scalebar=y frame1=104 frame2=200 frame3=100 flat=y point1=.3 label1=Time label2=IL label3=XL unit1=s unit2= unit3= title=%s barlabel=%s'segy = 'Parihaka_PSTM_full_angle.sgy'

    Fetch(segy,dir='PARIHAKA-3D', server='https://s3.amazonaws.com', top='open.source.geoscience/open_data/newzealand/Taranaiki_Basin')

    Flow('seis head',segy,'segyread tfile=${TARGETS[1]}')Flow('parihaka','seis head','intbin head=${SOURCES[1]} xk=iline yk=xline | put label2=IL label3=XL')Flow('sub','parihaka','window min1=1 max1=1.62 min2=2200 max2=2600 min3=4820 max3=5200')#Result('sub',gray % '"Seismic data"')Result('sub',gray3 % '"Seismic data"' )

    Flow('iflat','sub','grad3 dim=2 | smooth rect3=3')Flow('flat','sub iflat','grad3 dim=3 | smooth rect2=3 | math x=${SOURCES[1]} output="sqrt(input*input+x*x)"')Result('flat',white3 % '"Flat Sobel"')

    ############################ DIP ESTIMATION ############################# rect1, rect2, and rect3 control the smoothness of the local dip model# In images with structural complexity, less smoothing will yield a beter # result.# However, poor quality images may require more smoothing.# For this subset of the Parihaka seismic data, I find results are best for# with a relatively small smoothing window (rect? = 10)Flow('dip','sub','fdip n4=2 rect1=10 rect2=10 rect3=10')Flow('idip','dip','window n4=1')Flow('xdip','dip','window f4=1')Flow('xdip23','xdip','transp plane=23')Result('idip',color3 % ('"IL Dip"','"Slope"') )Result('xdip',color3 % ('"XL Dip"','"Slope"') )

    ######################################## STRUCTURE-ENHANCING FILTER ######################################### I use a larger smoothing window in the inline direction (ns2) to supress# acquisition footprintFlow('pari','sub dip','pwspray2 dip=${SOURCES[1]} ns2=3 ns3=1 | transp | median')Result('pari',gray3 % "Seismic Data" )

    ################Flow('ipwd','pari idip','pwd n4=0 dip=${SOURCES[1]}')Flow('xpwd','pari xdip','pwd n4=1 dip=${SOURCES[1]}')Flow('isobel','ipwd xdip23','transp plane=23 | pwsmooth dip=${SOURCES[1]} ns=3 | transp plane=23')Flow('xsobel','xpwd idip','pwsmooth dip=${SOURCES[1]} ns=3')Result('isobel',white3 % '"IL Sobel"')Result('xsobel',white3 % '"XL Sobel"')

    Flow('sobel','isobel xsobel','math x=${SOURCES[1]} output="(input*input+x*x)" | smooth rect1=3')Result('sobel',white3 % '"Plane-wave Sobel"')

    Flow('ipwd2','sobel idip','pwd n4=0 dip=${SOURCES[1]}')Flow('xpwd2','sobel xdip','pwd n4=1 dip=${SOURCES[1]}')Flow('isobel2','ipwd2 xdip23','transp plane=23 | pwsmooth dip=${SOURCES[1]} ns=3 | transp plane=23')Flow('xsobel2','xpwd2 idip','pwsmooth dip=${SOURCES[1]} ns=3')

    Flow('sobel2','isobel2 xsobel2','math x=${SOURCES[1]} output="sqrt(input*input+x*x)" | smooth rect1=3')Result('sobel2',white3 % '"Cascaded Sobel"' )

    ############################## AZIMUTH SCANNING ############################### Proper parameter selection is critical in this section.# If discontinuous features follow many different azimuths, use small # smoothing parameters and large anisotropy parameter.# If discontinuous features follow consistent azimuth, set vel0 to that# azimuth and use large smoothing parameters.n1 = 208na = 45picks = []slices = []for i in range(n1): isobelt = 'isobelt-%d' % i xsobelt = 'xsobelt-%d' % i Flow(isobelt,'isobel2','window f1=%d n1=1' % i ) Flow(xsobelt,'xsobel2','window f1=%d n1=1' % i ) asobels = [] for j in range(0,360,8): a = j*pi/180 asobel = 'asobel-%d-%d' % (i,j) Flow(asobel,[isobelt,xsobelt],'math x=${SOURCES[1]} output="abs(input*cos(%f)+x*sin(%f))"' % (a,a) ) asobels.append(asobel)

    asobelt = 'asobel-%d' % i Flow(asobelt,asobels,'cat ${SOURCES[1:%d]} axis=3 | put d3=8 o3=0 | scale axis=3 | transp plane=23' % na )# env.AddPostAction(asobelt+'.rsf','/bin/bash ./ignore.sh %s' % (asobelt) )

    ################ pick = 'pick-%d' % i Flow(pick,asobelt,'pick vel0=180 rect1=20 rect2=20 an=1') picks.append(pick)

    slice = 'slice-%d' % i Flow(slice,[asobelt,pick],'slice pick=${SOURCES[1]}') slices.append(slice)

    Flow('picks',picks,'cat ${SOURCES[1:%d]} axis=3 | transp plane=23 | transp' % n1 )Result('picks','byte bar=bar.rsf gainpanel=all bias=180 | grey3 color=j scalebar=y frame1=104 frame2=200 frame3=100 flat=y point1=.3 label1=Time label2=IL label3=XL unit1=s unit2= unit3= title=Azimuth barlabel=Azimuth')

    Flow('slices',slices,'cat ${SOURCES[1:%d]} axis=3 | transp plane=23 | transp' % n1 )#Result('slices','clip clip=.02 value=1 | '+white3)Result('slices',white3 % '"Azimuthal Sobel"')

    Flow('az','slices picks','mul ${SOURCES[1]}')Result('az','byte bar=bar.rsf gainpanel=all bias=180 minval=90 maxval=270 | grey3 color=j scalebar=y frame1=104 frame2=200 frame3=100 flat=y point1=.3 label1=Time label2=IL label3=XL unit1=s unit2= unit3= title=Azimuth barlabel=Azimuth')

    End()

  • Phillips & Fomel 8 Plane-wave Sobel attribute

    EXAMPLE II

    The next example is a subset of the Penobscot data used previously by Kington (2015)(Figure 4). This small marine 3D seismic volume was acquired offshore Nova Scotia, Canadaand is available in the SEG open data repository (Nova Scotia Department of Energy, 1992).

    Figure 4: The Penobscot seismic data

    We apply cross-correlation coherence, semblance, eigenstructure coherence, and gradient-structure-tensor (GST) coherence attributes to the data and compare the results to theproposed plane-wave Sobel attributes. Correlation-based coherence attributes (Bahorichand Farmer, 1995) produce an image of normalized local cross-correlation between adjacentseismic traces and combines them to estimate coherence. This attribute is more efficientthan most of the alternative coherence attributes, but lacks robustness and has poor verticalresolution (Figure 6a). Semblance (Marfurt et al., 1998) provides better vertical resolutionby incorporating a local window of traces (Figure 6b). Eigendecomposition of the localcovariance matrix (Gersztenkorn and Marfurt, 1999) or gradient-structure-tensor (Randenet al., 2000) allows information about local structures to be incorporated into the coherencecalculation. These attributes provide significantly better vertical and lateral resolution (Fig-ures 6c and 6d) compared to correlation-based coherence; however, calculation and decom-

    from rsf.proj import *

    from math import piimport os.path

    env = Environment()

    gray3 = 'byte gainpanel=all | grey3 flat=y frame1=27 frame2=125 frame3=100 point1=.2 label1=Time label2=IL label3=XL unit1=s unit2= unit3= title=%s'color3 = 'byte bar=bar.rsf gainpanel=all | grey3 color=j flat=y scalebar=y frame1=27 frame2=125 frame3=100 point1=.2 label1=Time label2=IL label3=XL unit1=s unit2= unit3= title=%s barlabel=%s'white3 = 'byte gainpanel=all allpos=y polarity=y | grey3 flat=y frame1=27 frame2=125 frame3=100 point1=.2 label1=Time label2=IL label3=XL unit1=s unit2= unit3= title=%s'black3 = 'byte gainpanel=all allpos=y | grey3 flat=y frame1=27 frame2=125 frame3=100 point1=.2 label1=Time label2=IL label3=XL unit1=s unit2= unit3= title=%s'#gray = 'window f1=27 n1=1 | grey label1=IL label2=XL unit1= unit2= title=%s'#white = 'window f1=27 n1=1 | grey allpos=y polarity=y label1=IL label2=XL unit1= unit2= title=%s'#black = 'window f1=27 n1=1 | grey allpos=y label1=IL label2=XL unit1= unit2= title=%s'#color = 'window f1=27 n1=1 | grey color=j scalebar=y label1=IL label2=XL unit1= unit2= barunit= title=%s barlabel=%s'

    Fetch('penobscot_subset.bin','data', server='https://github.com', top='seg/tutorials-2015/raw/master/1512_Semblance_coherence_and_discontinuity/')

    Flow('penobs','penobscot_subset.bin', ''' echo in=$SOURCE n1=55 n2=200 n3=250 o1=0.116 d1=0.004 unit1=s label1=Time o2=1253 d2=1 label2=Crossline o3=1207 d3=1 label3=Inline data_format=native_short | dd type=float | transp plane=23 ''',stdin=0)Result('penobs',gray3 % '"Seismic data"')

    Flow('dip','penobs','fdip n4=2 rect1=3 rect2=20 rect3=10')Flow('idip','dip','window n4=1')Flow('xdip','dip','window f4=1')Flow('xdip23','xdip','transp plane=23')Result('idip',color3 % ('"IL Dip"','"Slope"') )Result('xdip',color3 % ('"XL Dip"','"Slope"') )

    Flow('pen','penobs dip','pwspray2 dip=${SOURCES[1]} ns2=1 ns3=4 | transp | median')Result('pen',gray3 % '"Seismic data"')

    ################ SOBEL ################Flow('is','pen','grad3 dim=2 | smooth rect3=3')Flow('s','pen is','grad3 dim=3 | smooth rect2=3 | math x=${SOURCES[1]} output="input*input+x*x"')Result('s',white3 % '"Flat Sobel"')

    ################## PWSOBEL ##################Flow('ipwd','pen idip','pwd dip=${SOURCES[1]} n4=0')Flow('xpwd','pen xdip','pwd dip=${SOURCES[1]} n4=1')Result('ipwd',gray3 % '"IL PWD"' )Result('xpwd',gray3 % '"XL PWD"' )

    Flow('isobel','ipwd xdip23','transp plane=23 | pwsmooth dip=${SOURCES[1]} ns=3 | transp plane=23')Flow('xsobel','xpwd idip','pwsmooth dip=${SOURCES[1]} ns=3')Result('isobel',white3 % '"IL Sobel"' )Result('xsobel',white3 % '"XL Sobel"' )

    Flow('sobel','isobel xsobel','math x=${SOURCES[1]} output="input*input+x*x" | smooth rect1=3')Result('sobel',white3 % '"Plane-wave Sobel"' )

    Flow('ipwd2','sobel idip','pwd dip=${SOURCES[1]} n4=0')Flow('xpwd2','sobel xdip','pwd dip=${SOURCES[1]} n4=1')Flow('isobel2','ipwd2 xdip23','transp plane=23 | pwsmooth dip=${SOURCES[1]} ns=3 | transp plane=23 | clip2 lower=0')Flow('xsobel2','xpwd2 idip','pwsmooth dip=${SOURCES[1]} ns=3 | clip2 lower=0')Flow('sobel2','isobel2 xsobel2','math x=${SOURCES[1]} output="input*input+x*x" | smooth rect1=3')Result('sobel2',white3 % '"Cascaded Sobel"' )

    n1 = 55na = 45picks = []slices = []

    for i in range(n1): isobelt = 'isobelt-%d' % i xsobelt = 'xsobelt-%d' % i Flow(isobelt,'isobel2','window f1=%d n1=1' % i ) Flow(xsobelt,'xsobel2','window f1=%d n1=1' % i ) asobels = [] for j in range(0,360,8): a = j*pi/180 asobel = 'asobel-%d-%d' % (i,j) Flow(asobel,[isobelt,xsobelt],'math x=${SOURCES[1]} output="abs(input*cos(%f)+x*sin(%f))"' % (a,a) ) asobels.append(asobel)

    asobelt = 'asobel-%d' % i Flow(asobelt,asobels,'cat ${SOURCES[1:%d]} axis=3 | put d3=8 o3=0 | scale axis=3 | transp plane=23' % na )# env.AddPostAction(asobelt+'.rsf','/bin/bash ./ignore.sh %s' % asobelt )

    ################ pick = 'pick-%d' % i Flow(pick,asobelt,'pick vel0=180 rect1=3 rect2=10 an=1') picks.append(pick)

    slice = 'slice-%d' % i Flow(slice,[asobelt,pick],'slice pick=${SOURCES[1]}') slices.append(slice)

    Flow('picks',picks,'cat ${SOURCES[1:%d]} axis=3 | transp plane=23 | transp' % n1 )Result('picks','byte bar=bar.rsf gainpanel=all bias=180 | grey3 color=j scalebar=y frame1=104 frame2=200 frame3=100 flat=y point1=.3 label1=Time label2=IL label3=XL unit1=s unit2= unit3= title=Azimuth barlabel=Azimuth')#env.AddPostAction('picks.rsf','/bin/bash ./ignore.sh isobelt')#env.AddPostAction('picks.rsf','/bin/bash ./ignore.sh xsobelt')#env.AddPostAction('picks.rsf','/bin/bash ./ignore.sh asobel')#env.AddPostAction('picks.rsf','/bin/bash ./ignore.sh pick')

    Flow('slices',slices,'cat ${SOURCES[1:%d]} axis=3 | transp plane=23 | transp | smooth rect1=3' % n1 )Result('slices',white3 % '"Azimuthal Sobel"')#env.AddPostAction('slices.rsf','/bin/bash ./ignore.sh slice')

    ########################## COHERENCE ##########################for case in range(3): coh = 'coh%d' % case Flow(coh,'pen','coherence mode=c%d twod=n' % (case+1)) Result(coh,black3 % ('"Cross-correlation"','Semblance','Eigenstructure')[case])

    # Gradient structure tensorFlow('dz','pen','deriv order=1')Flow('dx','pen','transp | deriv order=1 | transp')Flow('dy','pen','transp plane=23 | deriv order=1 | transp plane=23')Flow('grad','dz dx dy', ''' cat axis=4 ${SOURCES[1:3]} | transp plane=34 | transp plane=23 | transp plane=12 | spray axis=2 n=1 ''')Flow('gradt','grad','transp')Flow('gst','grad gradt','matrix B=${SOURCES[1]} | smooth rect3=3 rect4=3 rect5=3')

    # Singular valuesFlow('eig','gst','svd')Flow('eig1','eig','window n1=1')Flow('eig2','eig','window n1=1 f1=1')Flow('coh','eig1 eig2','math l1=${SOURCES[0]} l2=${SOURCES[1]} output="(l1-l2)/(l1+l2)" ')Result('coh',black3 % '"Gradient structure tensor"')

    # Predictive coherenceFlow('dip2','pen','dip rect1=5 rect2=20 rect3=20')Flow('pwspray','pen dip2','pwspray2 ns2=2 ns3=2 dip=${SOURCES[1]}')

    box=3

    Flow('pwdiff','pen pwspray', 'spray axis=2 n=25 | math s=${SOURCES[1]} output="(s-input)^2" ')

    Flow('pcoh','pwdiff', ''' transp plane=12 | spray axis=2 n=1 | put n1=5 n2=5 | boxsmooth rect1=%d | boxsmooth rect2=%d | window f1=%d f2=%d | stack axis=2 min=y | stack axis=1 min=y ''' % (box,box,box-1,box-1))

    Result('pcoh',white3 % 'Predictive' )

    End()

  • Phillips & Fomel 9 Plane-wave Sobel attribute

    position of the local covariance matrix or gradient-structure-tensor introduces significantcomputational cost. Furthermore, all of these attributes contain some noise contaminationin coherent sections of the image.

    We compare these results to the proposed plane-wave Sobel attributes. As expected,the filter enhances the faults and channels in the seismic image without significant noisecontamination or highlighting continuous dipping reflectors (Figure 5f).

    As previously stated, computational efficiency is one of the key advantages of the plane-wave Sobel attribute. Though all of the discussed algorithms are straightforward to par-allelize, we compare the attributes on a single core computer for simplicity (Table 1). Wefind that the plane-wave Sobel attributes significantly outperform many popular coher-ence attributes. Admittedly, commercial implementations may be more efficient than ourimplementation.

    The plane-wave Sobel attribute (Figure 5b) is capable of providing interpreters witha detailed image of seismic discontinuities in a fraction of the time of conventional coher-ence attributes, expediting the interpretation process. Computation of the cascaded Sobelattribute (Figure 5c) and azimuthal Sobel attribute (Figure 5d) may not provide signifi-cantly more value to the interpreter, as many of the same features can be interpreted fromthe less expensive plane-wave Sobel image; however, these attributes are significantly moresegmented and may be good inputs to automatic fault plane interpretation algorithms.

    Attribute Compute timeFlat Sobel 0.3 seconds

    Gradient structure tensor 4 secondsPlane-wave Sobel 17 secondsCascaded Sobel 21 seconds

    Predictive 40 secondsAzimuthal Sobel 3 minutesCross-correlation 5 minutes

    Semblance 1 hourEigenstructure 3 hours

    Table 1: Comparison of the computational efficiency of the proposed plane-wave Sobelattributes and common coherence attributes.

    CONCLUSIONS

    We have modified the Sobel filter by orienting it along the dip of seismic reflections and theazimuth of discontinuous features. We find that the proposed plane-wave Sobel filter is astraightforward and inexpensive means for enhancing discontinuous features in 3D seismicimages. Many popular coherence attributes come with considerable computational costbecause they require calculation and eigendecomposition of the local covariance matrix orstructure tensor at each point in the 3D image. The significant cost of eigendecompositioncan be partially alleviated in practice by parallelization. One of the key benefits of thismethod is its superior efficiency in comparison with other similar attributes. The main

  • Phillips & Fomel 10 Plane-wave Sobel attribute

    (a) (b)

    (c) (d)

    Figure 5: Comparison of (a) the traditional Sobel filter, (b) proposed plane-wave So-bel filter, (c) cascaded plane-wave Sobel filter, and (d) azimuthal plane-wave Sobel filter

    from rsf.proj import *

    from math import piimport os.path

    env = Environment()

    gray3 = 'byte gainpanel=all | grey3 flat=y frame1=27 frame2=125 frame3=100 point1=.2 label1=Time label2=IL label3=XL unit1=s unit2= unit3= title=%s'color3 = 'byte bar=bar.rsf gainpanel=all | grey3 color=j flat=y scalebar=y frame1=27 frame2=125 frame3=100 point1=.2 label1=Time label2=IL label3=XL unit1=s unit2= unit3= title=%s barlabel=%s'white3 = 'byte gainpanel=all allpos=y polarity=y | grey3 flat=y frame1=27 frame2=125 frame3=100 point1=.2 label1=Time label2=IL label3=XL unit1=s unit2= unit3= title=%s'black3 = 'byte gainpanel=all allpos=y | grey3 flat=y frame1=27 frame2=125 frame3=100 point1=.2 label1=Time label2=IL label3=XL unit1=s unit2= unit3= title=%s'#gray = 'window f1=27 n1=1 | grey label1=IL label2=XL unit1= unit2= title=%s'#white = 'window f1=27 n1=1 | grey allpos=y polarity=y label1=IL label2=XL unit1= unit2= title=%s'#black = 'window f1=27 n1=1 | grey allpos=y label1=IL label2=XL unit1= unit2= title=%s'#color = 'window f1=27 n1=1 | grey color=j scalebar=y label1=IL label2=XL unit1= unit2= barunit= title=%s barlabel=%s'

    Fetch('penobscot_subset.bin','data', server='https://github.com', top='seg/tutorials-2015/raw/master/1512_Semblance_coherence_and_discontinuity/')

    Flow('penobs','penobscot_subset.bin', ''' echo in=$SOURCE n1=55 n2=200 n3=250 o1=0.116 d1=0.004 unit1=s label1=Time o2=1253 d2=1 label2=Crossline o3=1207 d3=1 label3=Inline data_format=native_short | dd type=float | transp plane=23 ''',stdin=0)Result('penobs',gray3 % '"Seismic data"')

    Flow('dip','penobs','fdip n4=2 rect1=3 rect2=20 rect3=10')Flow('idip','dip','window n4=1')Flow('xdip','dip','window f4=1')Flow('xdip23','xdip','transp plane=23')Result('idip',color3 % ('"IL Dip"','"Slope"') )Result('xdip',color3 % ('"XL Dip"','"Slope"') )

    Flow('pen','penobs dip','pwspray2 dip=${SOURCES[1]} ns2=1 ns3=4 | transp | median')Result('pen',gray3 % '"Seismic data"')

    ################ SOBEL ################Flow('is','pen','grad3 dim=2 | smooth rect3=3')Flow('s','pen is','grad3 dim=3 | smooth rect2=3 | math x=${SOURCES[1]} output="input*input+x*x"')Result('s',white3 % '"Flat Sobel"')

    ################## PWSOBEL ##################Flow('ipwd','pen idip','pwd dip=${SOURCES[1]} n4=0')Flow('xpwd','pen xdip','pwd dip=${SOURCES[1]} n4=1')Result('ipwd',gray3 % '"IL PWD"' )Result('xpwd',gray3 % '"XL PWD"' )

    Flow('isobel','ipwd xdip23','transp plane=23 | pwsmooth dip=${SOURCES[1]} ns=3 | transp plane=23')Flow('xsobel','xpwd idip','pwsmooth dip=${SOURCES[1]} ns=3')Result('isobel',white3 % '"IL Sobel"' )Result('xsobel',white3 % '"XL Sobel"' )

    Flow('sobel','isobel xsobel','math x=${SOURCES[1]} output="input*input+x*x" | smooth rect1=3')Result('sobel',white3 % '"Plane-wave Sobel"' )

    Flow('ipwd2','sobel idip','pwd dip=${SOURCES[1]} n4=0')Flow('xpwd2','sobel xdip','pwd dip=${SOURCES[1]} n4=1')Flow('isobel2','ipwd2 xdip23','transp plane=23 | pwsmooth dip=${SOURCES[1]} ns=3 | transp plane=23 | clip2 lower=0')Flow('xsobel2','xpwd2 idip','pwsmooth dip=${SOURCES[1]} ns=3 | clip2 lower=0')Flow('sobel2','isobel2 xsobel2','math x=${SOURCES[1]} output="input*input+x*x" | smooth rect1=3')Result('sobel2',white3 % '"Cascaded Sobel"' )

    n1 = 55na = 45picks = []slices = []

    for i in range(n1): isobelt = 'isobelt-%d' % i xsobelt = 'xsobelt-%d' % i Flow(isobelt,'isobel2','window f1=%d n1=1' % i ) Flow(xsobelt,'xsobel2','window f1=%d n1=1' % i ) asobels = [] for j in range(0,360,8): a = j*pi/180 asobel = 'asobel-%d-%d' % (i,j) Flow(asobel,[isobelt,xsobelt],'math x=${SOURCES[1]} output="abs(input*cos(%f)+x*sin(%f))"' % (a,a) ) asobels.append(asobel)

    asobelt = 'asobel-%d' % i Flow(asobelt,asobels,'cat ${SOURCES[1:%d]} axis=3 | put d3=8 o3=0 | scale axis=3 | transp plane=23' % na )# env.AddPostAction(asobelt+'.rsf','/bin/bash ./ignore.sh %s' % asobelt )

    ################ pick = 'pick-%d' % i Flow(pick,asobelt,'pick vel0=180 rect1=3 rect2=10 an=1') picks.append(pick)

    slice = 'slice-%d' % i Flow(slice,[asobelt,pick],'slice pick=${SOURCES[1]}') slices.append(slice)

    Flow('picks',picks,'cat ${SOURCES[1:%d]} axis=3 | transp plane=23 | transp' % n1 )Result('picks','byte bar=bar.rsf gainpanel=all bias=180 | grey3 color=j scalebar=y frame1=104 frame2=200 frame3=100 flat=y point1=.3 label1=Time label2=IL label3=XL unit1=s unit2= unit3= title=Azimuth barlabel=Azimuth')#env.AddPostAction('picks.rsf','/bin/bash ./ignore.sh isobelt')#env.AddPostAction('picks.rsf','/bin/bash ./ignore.sh xsobelt')#env.AddPostAction('picks.rsf','/bin/bash ./ignore.sh asobel')#env.AddPostAction('picks.rsf','/bin/bash ./ignore.sh pick')

    Flow('slices',slices,'cat ${SOURCES[1:%d]} axis=3 | transp plane=23 | transp | smooth rect1=3' % n1 )Result('slices',white3 % '"Azimuthal Sobel"')#env.AddPostAction('slices.rsf','/bin/bash ./ignore.sh slice')

    ########################## COHERENCE ##########################for case in range(3): coh = 'coh%d' % case Flow(coh,'pen','coherence mode=c%d twod=n' % (case+1)) Result(coh,black3 % ('"Cross-correlation"','Semblance','Eigenstructure')[case])

    # Gradient structure tensorFlow('dz','pen','deriv order=1')Flow('dx','pen','transp | deriv order=1 | transp')Flow('dy','pen','transp plane=23 | deriv order=1 | transp plane=23')Flow('grad','dz dx dy', ''' cat axis=4 ${SOURCES[1:3]} | transp plane=34 | transp plane=23 | transp plane=12 | spray axis=2 n=1 ''')Flow('gradt','grad','transp')Flow('gst','grad gradt','matrix B=${SOURCES[1]} | smooth rect3=3 rect4=3 rect5=3')

    # Singular valuesFlow('eig','gst','svd')Flow('eig1','eig','window n1=1')Flow('eig2','eig','window n1=1 f1=1')Flow('coh','eig1 eig2','math l1=${SOURCES[0]} l2=${SOURCES[1]} output="(l1-l2)/(l1+l2)" ')Result('coh',black3 % '"Gradient structure tensor"')

    # Predictive coherenceFlow('dip2','pen','dip rect1=5 rect2=20 rect3=20')Flow('pwspray','pen dip2','pwspray2 ns2=2 ns3=2 dip=${SOURCES[1]}')

    box=3

    Flow('pwdiff','pen pwspray', 'spray axis=2 n=25 | math s=${SOURCES[1]} output="(s-input)^2" ')

    Flow('pcoh','pwdiff', ''' transp plane=12 | spray axis=2 n=1 | put n1=5 n2=5 | boxsmooth rect1=%d | boxsmooth rect2=%d | window f1=%d f2=%d | stack axis=2 min=y | stack axis=1 min=y ''' % (box,box,box-1,box-1))

    Result('pcoh',white3 % 'Predictive' )

    End()

  • Phillips & Fomel 11 Plane-wave Sobel attribute

    (a) (b)

    (c) (d)

    Figure 6: Comparison of discontinuity enhancement attributes: (a) cross-correlation, (b) semblance, (c) eigenstructure, and (d) gradient-structure tensor

    from rsf.proj import *

    from math import piimport os.path

    env = Environment()

    gray3 = 'byte gainpanel=all | grey3 flat=y frame1=27 frame2=125 frame3=100 point1=.2 label1=Time label2=IL label3=XL unit1=s unit2= unit3= title=%s'color3 = 'byte bar=bar.rsf gainpanel=all | grey3 color=j flat=y scalebar=y frame1=27 frame2=125 frame3=100 point1=.2 label1=Time label2=IL label3=XL unit1=s unit2= unit3= title=%s barlabel=%s'white3 = 'byte gainpanel=all allpos=y polarity=y | grey3 flat=y frame1=27 frame2=125 frame3=100 point1=.2 label1=Time label2=IL label3=XL unit1=s unit2= unit3= title=%s'black3 = 'byte gainpanel=all allpos=y | grey3 flat=y frame1=27 frame2=125 frame3=100 point1=.2 label1=Time label2=IL label3=XL unit1=s unit2= unit3= title=%s'#gray = 'window f1=27 n1=1 | grey label1=IL label2=XL unit1= unit2= title=%s'#white = 'window f1=27 n1=1 | grey allpos=y polarity=y label1=IL label2=XL unit1= unit2= title=%s'#black = 'window f1=27 n1=1 | grey allpos=y label1=IL label2=XL unit1= unit2= title=%s'#color = 'window f1=27 n1=1 | grey color=j scalebar=y label1=IL label2=XL unit1= unit2= barunit= title=%s barlabel=%s'

    Fetch('penobscot_subset.bin','data', server='https://github.com', top='seg/tutorials-2015/raw/master/1512_Semblance_coherence_and_discontinuity/')

    Flow('penobs','penobscot_subset.bin', ''' echo in=$SOURCE n1=55 n2=200 n3=250 o1=0.116 d1=0.004 unit1=s label1=Time o2=1253 d2=1 label2=Crossline o3=1207 d3=1 label3=Inline data_format=native_short | dd type=float | transp plane=23 ''',stdin=0)Result('penobs',gray3 % '"Seismic data"')

    Flow('dip','penobs','fdip n4=2 rect1=3 rect2=20 rect3=10')Flow('idip','dip','window n4=1')Flow('xdip','dip','window f4=1')Flow('xdip23','xdip','transp plane=23')Result('idip',color3 % ('"IL Dip"','"Slope"') )Result('xdip',color3 % ('"XL Dip"','"Slope"') )

    Flow('pen','penobs dip','pwspray2 dip=${SOURCES[1]} ns2=1 ns3=4 | transp | median')Result('pen',gray3 % '"Seismic data"')

    ################ SOBEL ################Flow('is','pen','grad3 dim=2 | smooth rect3=3')Flow('s','pen is','grad3 dim=3 | smooth rect2=3 | math x=${SOURCES[1]} output="input*input+x*x"')Result('s',white3 % '"Flat Sobel"')

    ################## PWSOBEL ##################Flow('ipwd','pen idip','pwd dip=${SOURCES[1]} n4=0')Flow('xpwd','pen xdip','pwd dip=${SOURCES[1]} n4=1')Result('ipwd',gray3 % '"IL PWD"' )Result('xpwd',gray3 % '"XL PWD"' )

    Flow('isobel','ipwd xdip23','transp plane=23 | pwsmooth dip=${SOURCES[1]} ns=3 | transp plane=23')Flow('xsobel','xpwd idip','pwsmooth dip=${SOURCES[1]} ns=3')Result('isobel',white3 % '"IL Sobel"' )Result('xsobel',white3 % '"XL Sobel"' )

    Flow('sobel','isobel xsobel','math x=${SOURCES[1]} output="input*input+x*x" | smooth rect1=3')Result('sobel',white3 % '"Plane-wave Sobel"' )

    Flow('ipwd2','sobel idip','pwd dip=${SOURCES[1]} n4=0')Flow('xpwd2','sobel xdip','pwd dip=${SOURCES[1]} n4=1')Flow('isobel2','ipwd2 xdip23','transp plane=23 | pwsmooth dip=${SOURCES[1]} ns=3 | transp plane=23 | clip2 lower=0')Flow('xsobel2','xpwd2 idip','pwsmooth dip=${SOURCES[1]} ns=3 | clip2 lower=0')Flow('sobel2','isobel2 xsobel2','math x=${SOURCES[1]} output="input*input+x*x" | smooth rect1=3')Result('sobel2',white3 % '"Cascaded Sobel"' )

    n1 = 55na = 45picks = []slices = []

    for i in range(n1): isobelt = 'isobelt-%d' % i xsobelt = 'xsobelt-%d' % i Flow(isobelt,'isobel2','window f1=%d n1=1' % i ) Flow(xsobelt,'xsobel2','window f1=%d n1=1' % i ) asobels = [] for j in range(0,360,8): a = j*pi/180 asobel = 'asobel-%d-%d' % (i,j) Flow(asobel,[isobelt,xsobelt],'math x=${SOURCES[1]} output="abs(input*cos(%f)+x*sin(%f))"' % (a,a) ) asobels.append(asobel)

    asobelt = 'asobel-%d' % i Flow(asobelt,asobels,'cat ${SOURCES[1:%d]} axis=3 | put d3=8 o3=0 | scale axis=3 | transp plane=23' % na )# env.AddPostAction(asobelt+'.rsf','/bin/bash ./ignore.sh %s' % asobelt )

    ################ pick = 'pick-%d' % i Flow(pick,asobelt,'pick vel0=180 rect1=3 rect2=10 an=1') picks.append(pick)

    slice = 'slice-%d' % i Flow(slice,[asobelt,pick],'slice pick=${SOURCES[1]}') slices.append(slice)

    Flow('picks',picks,'cat ${SOURCES[1:%d]} axis=3 | transp plane=23 | transp' % n1 )Result('picks','byte bar=bar.rsf gainpanel=all bias=180 | grey3 color=j scalebar=y frame1=104 frame2=200 frame3=100 flat=y point1=.3 label1=Time label2=IL label3=XL unit1=s unit2= unit3= title=Azimuth barlabel=Azimuth')#env.AddPostAction('picks.rsf','/bin/bash ./ignore.sh isobelt')#env.AddPostAction('picks.rsf','/bin/bash ./ignore.sh xsobelt')#env.AddPostAction('picks.rsf','/bin/bash ./ignore.sh asobel')#env.AddPostAction('picks.rsf','/bin/bash ./ignore.sh pick')

    Flow('slices',slices,'cat ${SOURCES[1:%d]} axis=3 | transp plane=23 | transp | smooth rect1=3' % n1 )Result('slices',white3 % '"Azimuthal Sobel"')#env.AddPostAction('slices.rsf','/bin/bash ./ignore.sh slice')

    ########################## COHERENCE ##########################for case in range(3): coh = 'coh%d' % case Flow(coh,'pen','coherence mode=c%d twod=n' % (case+1)) Result(coh,black3 % ('"Cross-correlation"','Semblance','Eigenstructure')[case])

    # Gradient structure tensorFlow('dz','pen','deriv order=1')Flow('dx','pen','transp | deriv order=1 | transp')Flow('dy','pen','transp plane=23 | deriv order=1 | transp plane=23')Flow('grad','dz dx dy', ''' cat axis=4 ${SOURCES[1:3]} | transp plane=34 | transp plane=23 | transp plane=12 | spray axis=2 n=1 ''')Flow('gradt','grad','transp')Flow('gst','grad gradt','matrix B=${SOURCES[1]} | smooth rect3=3 rect4=3 rect5=3')

    # Singular valuesFlow('eig','gst','svd')Flow('eig1','eig','window n1=1')Flow('eig2','eig','window n1=1 f1=1')Flow('coh','eig1 eig2','math l1=${SOURCES[0]} l2=${SOURCES[1]} output="(l1-l2)/(l1+l2)" ')Result('coh',black3 % '"Gradient structure tensor"')

    # Predictive coherenceFlow('dip2','pen','dip rect1=5 rect2=20 rect3=20')Flow('pwspray','pen dip2','pwspray2 ns2=2 ns3=2 dip=${SOURCES[1]}')

    box=3

    Flow('pwdiff','pen pwspray', 'spray axis=2 n=25 | math s=${SOURCES[1]} output="(s-input)^2" ')

    Flow('pcoh','pwdiff', ''' transp plane=12 | spray axis=2 n=1 | put n1=5 n2=5 | boxsmooth rect1=%d | boxsmooth rect2=%d | window f1=%d f2=%d | stack axis=2 min=y | stack axis=1 min=y ''' % (box,box,box-1,box-1))

    Result('pcoh',white3 % 'Predictive' )

    End()

  • Phillips & Fomel 12 Plane-wave Sobel attribute

    costs of this attribute are the estimation of local slopes and azimuth scanning. Local slopescan be estimated using accelerated plane-wave destruction. Azimuth scanning and pickingare easy to parallelize. As demonstrated in this paper, the proposed plane-wave Sobelattribute can help geological interpretations of subsurface faults and channels. It can alsobe used to enhance other discontinuous or chaotic features commonly interpreted in seismicimages, such as unconformities, salt boundaries, and mass transport complexes.

    ACKNOWLEDGMENTS

    We thank Nova Scotia Department of Energy, Canada Nova Scotia Offshore PetroleumBoard, and New Zealand Petroleum and Minerals for providing data used in this paper to theSEG open data repository. We thank sponsors of the Texas Consortium for ComputationalSeismology (TCCS) for financial support. We thank Xinming Wu and Ryan Swindemanfor helpful comments and discussions. The computational examples reported in this paperare reproducible using the Madagascar open-source software package (Fomel et al., 2013).

    REFERENCES

    Aqrawi, A. A., 2014, Adaptive Sobel based edge detection for enhaced fault segmentation:International Petroleum Technology Conference, 1424–1428.

    Aqrawi, A. A., and T. H. Boe, 2011, Improved fault segmentation using a dip guided andmodified 3D Sobel filter: 86th Annual International Meeting, SEG Expanded Abstracts,Society of Exploration Geophysicists, 999–1003.

    Aqrawi, A. A., T. H. Boe, S. Barros, et al., 2011, Detecting salt domes using a dip guided 3DSobel seismic attribute: 80th Annual International Meeting, SEG Expanded Abstracts,Society of Exploration Geophysicists, 1014–1018.

    Bahorich, M. S., and S. Farmer, 1995, 3-D seismic discontinuity for faults and stratigraphicfeatures: The coherence cube: The Leading Edge, 14, 1053–1058.

    Bakker, P., 2002, Image structure analysis for seismic interpretation: Delft University ofTechnology.

    Barnes, A. E., 2016, Handbook of poststack seismic attributes: Society of ExplorationGeophysicists.

    Chen, Z., S. Fomel, and W. Lu, 2013, Accelerated plane-wave destruction: Geophysics, 78,V1–V9.

    Chopra, S., R. Kumar, and K. J. Marfurt, 2014, Seismic discontinuity attributes and So-bel filtering: 84th Annual International Meeting, SEG Expanded Abstracts, Society ofExploration Geophysicists, 1624–1628.

    Chopra, S., and K. J. Marfurt, 2007, Seismic attributes for prospect identification andreservoir characterization: Society of Exploration Geophysicists.

    Claerbout, J. F., 1992, Earth soundings analysis: Processing versus inversion: BlackwellScientific Publications Cambridge, Massachusetts, USA, 6.

    Cohen, I., N. Coult, and A. A. Vassiliou, 2006, Detection and extraction of fault surfacesin 3D seismic data: Geophysics, 71, P21–P27.

    Fomel, S., 2002, Applications of plane-wave destruction filters: Geophysics, 67, 1946–1960.——–, 2007, Shaping regularization in geophysical-estimation problems: Geophysics, 72,

    R29–R36.——–, 2009, Velocity analysis using AB semblance: Geophysical Prospecting, 57, 311–321.

  • Phillips & Fomel 13 Plane-wave Sobel attribute

    ——–, 2010, Predictive painting of 3D seismic volumes: Geophysics, 75, A25–A30.Fomel, S., P. Sava, I. Vlad, Y. Liu, and V. Bashkardin, 2013, Madagascar: Open-source

    software project for multidimensional data analysis and reproducible computational ex-periments: Journal of Open Research Software, 1, 1–4.

    Gersztenkorn, A., and K. J. Marfurt, 1999, Eigenstructure-based coherence computationsas an aid to 3-D structural and stratigraphic mapping: Geophysics, 64, 1468–1479.

    Hale, D., 2009, Structure-oriented smoothing and semblance: CWP-635, 261–270.——–, 2013, Methods to compute fault images, extract fault surfaces, and estimate fault

    throws from 3D seismic images: Geophysics, 78, 33–43.Karimi, P., S. Fomel, L. Wood, and D. Dunlap, 2015, Predictive coherence: Interpretation,

    3, SAE1–SAE7.Kington, J., 2015, Semblance, coherence, and other discontinuity attributes: The Leading

    Edge, 34, 1510–1512.Liu, Y., S. Fomel, and G. Liu, 2010, Nonlinear structure-enhancing filtering using plane-

    wave prediction: Geophysical Prospecting, 58, 415–427.Luo, Y., W. G. Higgs, and W. S. Kowalik, 1996, Edge detection and stratigraphic analysis

    using 3D seismic data: 76th Annual International Meeting, SEG Expanded Abstracts,Society of Exploration Geophysicists, 324–327.

    Marfurt, K. J., R. L. Kirlin, S. L. Farmer, and M. S. Bahorich, 1998, 3-D seismic attributesusing a semblance-based coherency algorithm: Geophysics, 63, 1150–1165.

    Merzlikin, D., S. Fomel, X. Wu, and M. Phillips, 2017a, Unconventional reservoir charac-terization using azimuthal seismic diffraction imaging: Presented at the UnconventionalResources Technology Conference.

    Merzlikin, D., T. A. Meckel, S. Fomel, and Y. Sripanich, 2017b, Diffraction imaging ofhigh-resolution 3D P-cable data from the Gulf of Mexico using azimuthal plane-wavedestruction: First Break, 35, 35–41.

    New Zealand Petroleum & Minerals, 2014, SEG Wiki: Parihaka 3D: http://wiki.seg.org/wiki/Parihaka-3D. (accessed 15 September 2017).

    Nova Scotia Department of Energy, 1992, SEG Wiki: Penobscot 3D: http://wiki.seg.org/wiki/Penobscot_3D. (accessed 15 September 2017).

    O’Gorman, L., M. J. Sammon, and M. Seul, 2008, Practical algorithms for image analysis:Cambridge University Press.

    Phillips, M., S. Fomel, and R. Swindeman, 2016, Structure-oriented plane-wave Sobel filterfor edge detection in seismic images: 86th Annual International Meeting, SEG ExpandedAbstracts, 1954–1959.

    Randen, T., E. Monsen, C. Signer, A. Abrahamsen, J. O. Hansen, T. Sæter, J. Schlaf, andL. Sønneland, 2000, Three-dimensional texture attributes for seismic data analysis: 70thAnnual International Meeting, SEG Expanded Abstracts, 668–671.

    Randen, T., S. I. Pedersen, and L. Sonneland, 2001, Automatic extraction of fault surfacesfrom three-dimensional seismic data: 71st Annual International Meeting, SEG ExpandedAbstract, 551–554.

    Sobel, I., and G. Feldman, 1968, A 3x3 isotropic gradient operator for image processing:Stanford Artificial Project, 271–272.

    Swindeman, R. L., 2015, Iterative seismic data interpolation using plane-wave shaping:M.S. thesis, The University of Texas at Austin.

    Wu, X., 2017, Directional structure-tensor-based coherence to detect seismic faults andchannels: Geophysics, 82, A13–A17.

    Wu, X., and D. Hale, 2016, 3D seismic image processing for faults: Geophysics, 81, IM1–

    http://wiki.seg.org/wiki/Parihaka-3Dhttp://wiki.seg.org/wiki/Parihaka-3Dhttp://wiki.seg.org/wiki/Penobscot_3Dhttp://wiki.seg.org/wiki/Penobscot_3D

  • Phillips & Fomel 14 Plane-wave Sobel attribute

    IM11.Wu, X., S. Luo, and D. Hale, 2016, Moving faults while unfaulting 3D seismic images:

    Geophysics, 81, IM25–IM33.