Two point correlation function

The two-point correlation is widely used as a ‘finger print’ of porous materials. For instance, for doing stochastic reconstructions of porous materials, the are used in the objective function to minimize the difference between the generated and actual images.

PoreSpy contains two functions for calculating the two-point correlation. two_point_correlation_bf uses a brute-force (hence the bf) which overlays a grid on the image, then analyzes the underlying image at the grid points. two_point_correlation_fft uses a fast-Fourier transform to perform an autocorrelation of the image with itself, so it’s much faster. The brute-force version is potentially more accurate because the Fourier transform approach introduces some numerical error; however, the slowness of the brute-force method requires applying a limited number of grid points which reduces its accuracy. As shown below the Fourier transform approach generally produces more acceptable results.

Import necessary packages

import numpy as np
import porespy as ps
import matplotlib.pyplot as plt

Generate artificial image

im = ps.generators.blobs(shape=[400, 400], porosity=0.6, blobiness=2)
fig, ax = plt.subplots()

Compare both approaches

fig, ax = plt.subplots(figsize=(5, 4))
data = ps.metrics.two_point_correlation_bf(im=im, spacing=5)
ax.plot(*data, 'b-', label='brute-force')
data = ps.metrics.two_point_correlation_fft(im=im)
ax.plot(*data, 'r-.', label='Fourier transform')