Exploring attributes on outcrops with Python. Part II.

 

Dark Gouge Score

Part II A different route toward structure

In the first post the approach was deliberately ambitious. Several attributes were combined in a single pipeline inspired by seismic workflows. Structure tensor coherence, orientation gradients, and enhancement filters were used in an attempt to extract faults from an outcrop image in one coherent step.

The result was instructive but unsatisfying. The mathematics was correct, yet the geological intuition was diluted. Too many assumptions were embedded at once, and when the result disagreed with manual interpretation it was unclear why.

This second attempt deliberately takes a step back. Instead of asking one complex question, it asks two simpler ones.

Is there material in the outcrop that is visually different from the host rock in a way that correlates with faulting
Is there geometric evidence for elongated discontinuities regardless of their photometric contrast

These two questions lead to two attributes that are conceptually independent but geologically complementary.

Philosophy of the new approach

The guiding idea is not to replace interpretation, but to externalize part of it.

When geologists look at this outcrop, faults stand out for two reasons. Many are marked by dark gouge or altered material. Others are visible because they cut across bedding as sharp linear features even when their color contrast is weak.

Instead of forcing both observations into one operator, they are separated into two channels.

A radiometric channel that answers the question
Where is the rock anomalously dark relative to its local surroundings

A geometric channel that answers the question
Where does the image behave like a collection of lines

Only after those questions are answered independently are they combined.

This mirrors how interpreters actually work. First noticing material contrasts, then tracing lines, then deciding which lines matter.

Conditioning the image

All subsequent attributes operate on a conditioned grayscale image.

The conditioning step removes large scale illumination trends using a Gaussian blur. This makes local contrasts more comparable across the photo and reduces the chance that shadows dominate the attributes.

Let I be the original grayscale image normalized between 0 and 1. A smoothed illumination field is computed as

I_blur = GaussianBlur(I, sigma = illum_sigma)

The conditioned image is then

I_cond = I - I_blur + mean(I_blur)

The final term adds the global mean back in. Without it, the high pass image can drift toward values that are hard to view or threshold consistently. With mean restoration, the output stays within a stable dynamic range while still removing the broad lighting trend.

Dark gouge score

The most successful attribute in this experiment is the dark gouge score.

Its logic is intentionally simple. Fault gouge appears darker than surrounding rock, but absolute darkness is not reliable because of shadows and albedo variations. What matters is relative darkness in a local neighborhood.

For each pixel, a local mean and a local mean absolute deviation are computed within a sliding window. Using mean absolute deviation rather than standard deviation makes the normalization tougher because it is less sensitive to extreme outliers. A bright pebble or a deep shadow is less likely to dominate the scale.

Let μ be the local mean and MAD be the local mean absolute deviation. A local normalized value is computed as

Z = (I_cond - μ) / MAD

This is not a true statistical z score. It is a robust local contrast measure. The value is then compressed into a stable range

Z_norm = clip(0.5 + 0.15 * Z, 0, 1)

Finally, darkness is defined simply as

Dark = 1 - Z_norm

Optionally raised to a power to emphasize the darkest material.

The result behaves like a photographic negative. Dark fault material lights up clearly, while bedding and background texture are suppressed. This attribute is easy to read and easy to trust, because it corresponds directly to what the eye sees.

It does not detect all faults. But when it responds, it responds for a clear geological reason.

Lineament score

The lineament score answers a different question. It ignores color and asks only whether the image locally behaves like a line.

This is done using a bank of oriented Gabor filters. Each filter acts like an oriented band pass detector. It responds strongly to features that resemble a stripe with a particular direction and spacing, and weakly to features that do not.

For a set of angles θ between 0 and 180 degrees, a Gabor kernel Gθ is applied to the conditioned image. For each pixel, the maximum absolute response over all orientations is retained.

Line_score(x, y) = max over θ of | I_cond * Gθ |

This produces a map of elongated features regardless of whether they are faults, bedding, or fractures. It is therefore intentionally overinclusive. On its own, the lineament score is not a fault detector. It is a geometric prior.

Fusion of attributes

The two scores are combined linearly.

Fused = w_dark * Dark + w_line * Line_score

This is not a probabilistic model. It is a weighted heuristic. The weights express an interpretation preference. In this outcrop, dark gouge is considered more diagnostic than pure line geometry, so its weight is higher.

The fused score highlights elongated dark features preferentially. Bedding still appears, but it is downweighted unless it coincides with anomalous darkness. This is where the method begins to approximate interpretation rather than pure detection.

Fused Score threshold 0.45

Extracted fault lines and their limitations

The fused score is thresholded and skeletonized to extract line representations. This step is intentionally crude. It produces something that looks like a fault network, but it should not be mistaken for a final interpretation.

Two limitations are visible.

First, some lineaments are displaced relative to where a geologist would draw the fault. This is expected. The algorithm responds to the strongest combined signal, which may be offset from the actual slip surface if gouge is asymmetric or smeared along bedding.

Interpretation note
If gouge is preferentially developed on one side of the slip surface, the strongest radiometric evidence can be consistently offset. That offset is not only an algorithmic artifact. It can be a hint about damage zone width, asymmetric alteration, or shear localization within a broader zone.

Second, some faults are fragmented. The algorithm has no concept of displacement continuity or kinematics. It only sees local evidence. This reinforces an important point. The extracted lines are not faults. They are fault evidence.

Dominant lineament angle map

The angle map shows, for each pixel, the orientation of the Gabor filter that produced the strongest response.

While visually striking, this map is the least convincing result so far. The strongest orientation at a pixel is often controlled by bedding, not by faulting. As a result, the map mixes stratigraphic fabric and structural discontinuities indiscriminately.

At this stage, the angle map is more useful as a diagnostic of the method than as a geological attribute. It reveals where the algorithm is sensitive to bedding versus where it responds to cross cutting structures.

A more meaningful angle analysis would require masking by the fused score or by manual interpretation, so that only likely fault related pixels contribute.

Where this gets us

This second approach is not better in an absolute sense. But it is clearer. Each attribute has a simple geological meaning. Each failure mode is understandable. When the result disagrees with interpretation, the reason is visible.

Most importantly, the dark gouge score demonstrates that simple local statistics can sometimes outperform more sophisticated tensor based measures when the geological signal is strong. The lineament score shows potential, but only when constrained. On its own it is geometry without geology.

The combination begins to approximate how interpreters think, but it still lacks an explicit notion of displacement, hierarchy, and fault zones versus slip surfaces. That is not a flaw of the method. It is a reminder of what interpretation actually is.

Bridge to seismic attribute thinking

None of these image attributes is a direct seismic analogue, but the mental model is similar. In seismic interpretation, a useful attribute often isolates one part of the signal and makes it interpretable before it is combined with others.

The dark gouge score is closest in spirit to any workflow where contrast is normalized locally to highlight anomalous zones. In seismic, this resembles the role of sweetness style measures, envelope based maps, or other attributes that highlight localized anomalies relative to their neighborhood. The geological difference is that here the anomaly is radiometric and tied to altered material, not acoustic amplitude.

The lineament score is closer to a geometry attribute. It asks whether the data contain oriented, laterally coherent features. In seismic terms, it is more like a directional texture detector than a fault likelihood attribute. That is why it responds strongly to bedding as well as faults.

The fused score behaves more like a constrained fault evidence map. It is not a final interpretation, but it is a way to collect evidence that can be edited, masked, and compared with manual picks. That is also how many seismic fault workflows mature. A first pass fault evidence volume is produced, then interpreters impose geological constraints and decide what is real.

If this approach continues to improve, it will not be because the filters get more complex. It will be because the constraints get more geological. Masking, scale separation, and explicit priors are the next steps.

If you want, the next iteration can focus on one practical improvement. The angle map can be recomputed only where fused evidence is high, so bedding does not dominate the orientation field. That single change would already make the orientation output more interpretable.

What geological constraints would be imposed next if this were treated as a serious interpretation aid rather than a visual exploration? Thoughts on the most practical next step are welcome in the comments.

Comments