# Utilities

## Edge detection

The function `extract_edges`

complements `imfilter`

from `Images.jl`

and can be used to extract edges from an image on CPU and GPU.

`CorrelationFunctions.Utilities.extract_edges`

— Function`extract_edges(array, filter, topology)`

Perform edge extraction in the same way as in `surfsurf`

and `surfvoid`

functions from `Map`

and `Directional`

modules. `array`

may be a CUDA array or an ordinary array. `filter`

is a value of `AbstractKernel`

type which selects an edge extraction algorithm. Boundary conditions are affected by `topology`

. Periodic boundary conditions are assumed if `topology`

is `Torus()`

and reflection from the boundaries is used if `topology`

is `Plane()`

.

See also: `AbstractKernel`

, `AbstractTopology`

.

`CorrelationFunctions.Utilities.AbstractTopology`

— Type`CorrelationFunctions.Utilities.Plane`

— Type`Plane()`

Topology for calculation of correlation functions in non-periodic mode. Usually this means zero-padding of an input for out-of-bounds array access.

**NB**: When extracting edges with `Plane`

topology, reflection from array borders is used for out-of-bounds access. Although, it's natural to assume zero padding must be used, we want an equality $F_{ss}^{(false)} = F_{ss}^{(true)}$ for two-phase system, hence we cannot pad the input with some constant value.

See also: `AbstractTopology`

.

`CorrelationFunctions.Utilities.Torus`

— Type`Torus()`

Topology for calculation of correlation functions in periodic mode. An input is extended to the infinity periodically as if it was wrapped around a torus.

See also: `AbstractTopology`

.

`CorrelationFunctions.Utilities.AbstractKernel`

— Type`CorrelationFunctions.Utilities.ConvKernel`

— Type`ConvKernel(n)`

Convolution kernel of width `n`

used in edge detection. Values `5`

and `7`

are possible values for `n`

. Using `n = 7`

works best for the most cases (`lowfreq_energy_ratio(array) > 0.97`

).

See also: `AbstractKernel`

, `extract_edges`

.

`CorrelationFunctions.Utilities.ErosionKernel`

— Type`ErosionKernel(n)`

Erosion kernel of width `n`

used in edge detection. Used in three-point surface correlation functions.

See also: `AbstractKernel`

, `extract_edges`

.

## Patterns for three-point functions

These patterns can be used to generate array-like objects which can be used as `ps1`

and `ps2`

arguments to the functions based on three-point statistics.

`CorrelationFunctions.Utilities.make_pattern`

— Function`make_pattern(array, plane)`

Make a set of points for calculation of correlation functions based on three-point statistics. The created set is based of a right triangle with varying lengths of catheti. The second argument defines alignment of the pattern with one of the planes.

See also: `AbstractPlane`

, `PlaneXY`

, `PlaneXZ`

, `PlaneYZ`

.

`CorrelationFunctions.Utilities.PlaneXY`

— Type`PlaneXY()`

A designator for a plane defined by vectors `[1, 0]`

and `[0, 1]`

(2D case) or `[1, 0, 0]`

and `[0, 1, 0]`

(3D case).

See also: `AbstractPlane`

.

`CorrelationFunctions.Utilities.PlaneYZ`

— Type`PlaneYZ()`

A designator for a plane defined by vectors `[0, 1, 0]`

and `[0, 0, 1]`

.

See also: `AbstractPlane`

.

`CorrelationFunctions.Utilities.PlaneXZ`

— Type`PlaneXZ()`

A designator for a plane defined by vectors `[1, 0, 0]`

and `[0, 0, 1]`

.

See also: `AbstractPlane`

.

`CorrelationFunctions.Utilities.AbstractPlane`

— Type## Misc

Some miscellaneous functions and helpers.

`CorrelationFunctions.Utilities.read_cuboid`

— Function`read_cuboid(datapath :: String, side, dim)`

Read 3D array from a disk. The data on the disk must be in binary format, one octet per sample. Totally, there must be $side^{dim}$ octets which are read into $side \times side \times \dots \times side$ array.

`CorrelationFunctions.Utilities.lowfreq_energy_ratio`

— Function`lowfreq_energy_ratio(array, fraction = 0.5)`

Calculate a ratio $E_a/E$ where $E$ is a total energy of a signal `array`

and $E_a$ is the energy concentrated in frequencies $[0, af/2]$ where $f$ is the sampling rate and $a$ is set via parameter `fraction`

. `mean(array)`

is subtracted from the array before calculations.

This function can be helpful in estimating if `array`

is suitable for calculating surface-surface or surface-void function. An empirical criterion is that if this function returns a value greater than `0.97`

, the array is good.

`CorrelationFunctions.Utilities.make_rotation`

— Function`make_rotation(ϕ)`

Make a rotation of 2-dimensional data by ϕ radians clockwise.

See also: `rotate_array`

.

`make_rotation(vec :: SVector{3}, ϕ)`

Make a rotation of 3-dimensional data by ϕ radians around a vector `vec`

clockwise.

See also: `rotate_array`

.

`make_rotation(m :: SMatrix{D,D})`

Make a rotation which transforms unit vectors to columns of `m`

. It is implicitly assumed that any two columns `c₁`

and `c₂`

have zero dot product: `(c₁, c₂) = 0`

and all columns are unit vectors.

`CorrelationFunctions.Utilities.rotate_array`

— Function`rotate_array(array, rot, topology)`

Rotate an array using rotation defined by `rot`

. The coordinate system's origin is placed into the center of the array. Out-of-bounds array access is specified by `topology`

argument. It is periodic extension of the array if `topology`

is `Torus()`

and zero padding if `topology`

is `Plane()`

.

See also: `AbstractTopology`

, `Torus`

, `Plane`

, `make_rotation`

.

`CorrelationFunctions.Utilities.detect_anisotropy`

— Function`detect_anisotropy(array, phase)`

Return a square matrix which characterizes anisotropy of the specified phase in the input. Each column of the matrix is a unit vector. The first vector points toward anisotropy and the other two vectors are perpendicular to the first vector and to each other. The resulting matrix can be used as an argument to `make_rotation`

.

See also: `rotate_array`

, `make_rotation`

.