pylops.utils.signalprocessing.slope_estimate(d, dz=1.0, dx=1.0, smooth=5, eps=0)[source]

Local slope estimation

Local slopes are estimated using the Structure Tensor algorithm [1]. Slopes are returned as \(\tan\theta\), defined in a RHS coordinate system with \(z\)-axis pointing upward.


For stability purposes, it is important to ensure that the orders of magnitude of the samplings are similar.

d : np.ndarray

Input dataset of size \(n_z \times n_x\)

dz : float

Sampling in \(z\)-axis, \(\Delta z\)


Since version 1.17.0, defaults to 1.0.

dx : float

Sampling in \(x\)-axis, \(\Delta x\)


Since version 1.17.0, defaults to 1.0.

smooth : float, optional

Standard deviation for Gaussian kernel. The standard deviations of the Gaussian filter are given for each axis as a sequence, or as a single number, in which case it is equal for all axes.


Default changed in version 1.17.0 to 5 from previous value of 20.

eps : float, optional

New in version 1.17.0.

Regularization term. All slopes where \(|g_{zx}| < \epsilon \max |g_{zx}|\) are set to zero. All anisotropies where \(\lambda_\text{max} < \epsilon\) are also set to zero. See Notes. When using with small values of smooth, start from a very small number (e.g. 1e-10) and start increasing by a power of 10 until results are satisfactory.

slopes : np.ndarray

Estimated local slopes. Unit is that of \(\Delta z/\Delta x\).


Prior to version 1.17.0, erroneously returned angles in radians instead of slopes.

anisotropies : np.ndarray

Estimated local anisotropies: \(1-\lambda_\text{min}/\lambda_\text{max}\)


Since 1.17.0, changed name from linearity to anisotropies. Definition remains the same.


For each pixel of the input dataset \(\mathbf{d}\) the local gradients \(g_z = \frac{\partial \mathbf{d}}{\partial z}\) and \(g_x = \frac{\partial \mathbf{d}}{\partial x}\) are computed and used to define the following three quantities:

\[\begin{split}\begin{align} g_{zz} &= \left(\frac{\partial \mathbf{d}}{\partial z}\right)^2\\ g_{xx} &= \left(\frac{\partial \mathbf{d}}{\partial x}\right)^2\\ g_{zx} &= \frac{\partial \mathbf{d}}{\partial z}\cdot\frac{\partial \mathbf{d}}{\partial x} \end{align}\end{split}\]

They are then spatially smoothed and at each pixel their smoothed versions are arranged in a \(2 \times 2\) matrix called the smoothed gradient-square tensor:

\[\begin{split}\mathbf{G} = \begin{bmatrix} g_{zz} & g_{zx} \\ g_{zx} & g_{xx} \end{bmatrix}\end{split}\]

Local slopes can be expressed as \(p = \frac{\lambda_\text{max} - g_{zz}}{g_{zx}}\), where \(\lambda_\text{max}\) is the largest eigenvalue of \(\mathbf{G}\).

Moreover, we can obtain a measure of local anisotropy, defined as

\[a = 1-\lambda_\text{min}/\lambda_\text{max}\]

where \(\lambda_\text{min}\) is the smallest eigenvalue of \(\mathbf{G}\). A value of \(a = 0\) indicates perfect isotropy whereas \(a = 1\) indicates perfect anisotropy.

[1]Van Vliet, L. J., Verbeek, P. W., “Estimators for orientation and anisotropy in digitized images”, Journal ASCI Imaging Workshop. 1995.

Examples using pylops.utils.signalprocessing.slope_estimate