Symmetric nearest neighbour filter

From SubSurfWiki
Jump to navigation Jump to search
SNN filter kernel.png

The SNN smoothing filter is designed to preserve edges in data and is very effective at noise reduction. It compares opposite pairs of pixels in the support, and selects those that are closest in value to the central input pixel (see the figure). It then returns the mean of the selected pixels. In this way, it avoids smoothing across edges. In my experience, it is somewhere between the median and Kuwahara filters in terms of edge preservation. It is a good choice for filtering a faulted horizon, for which edge preservation is paramount. According to Hall (2007[1]) it is the most versatile filter in the interpreter’s toolkit.

Example

Result h was generated from noisy b to try to recover original a. See smoothing filters for the other methods.

Smoothing with various filters.jpg

Implementation in Python

This is how the algorithm is implemented in bruges. It's rather slow, but it works.

import numpy as np
import scipy.ndimage

def snn(horizon, size=5):

    def nearest(a, num):
        return a.flat[np.abs(a - num).argmin()]
    
    def func(this, pairs):
        centre = this[this.size // 2]
        select = [nearest(this[p], centre) for p in pairs]
        return np.mean(select)

    pairs = [[i, size**2-1 - i] for i in range(size**2 // 2)]
    return scipy.ndimage.generic_filter(horizon, func, size=size,
                                        extra_keywords={'pairs': pairs}
                                       )

See also

References

  1. Hall, M (2007). Smooth operator: smoothing seismic horizons and attributes. The Leading Edge 26 (1), January 2007, p 16-20. DOI:10.1190/1.2431821