dip::MomentAccumulator class

MomentAccumulator accumulates the zeroth order moment, the first order normalized moments, and the second order central normalized moments, in N dimensions.

Samples are added one by one, using the Push method. Other members are used to retrieve the moments.

It is possible to accumulate samples in different objects (e.g. when processing with multiple threads), and add the accumulators together using the + operator.

Constructors, destructors, assignment and conversion operators

MomentAccumulator(dip::uint N)
The constructor determines the dimensionality for the object.


void Reset()
Reset the accumulator, leaving it as if newly allocated.
void Push(dip::FloatArray pos, dip::dfloat weight)
Add a sample to the accumulator. pos must have N dimensions.
auto Sum() const -> dip::dfloat
Sum of weights (zeroth order moment)
auto FirstOrder() const -> dip::FloatArray
First order moments, normalized
auto SecondOrder() const -> dip::FloatArray
Second order central moment tensor, normalized


auto operator+=(dip::MomentAccumulator const& b) -> dip::MomentAccumulator&
Combine two accumulators

Function documentation

dip::FloatArray SecondOrder() const

Second order central moment tensor, normalized

The moments are stored in the same order as symmetric tensors are stored in an image (see dip::Tensor::Shape). That is, fist are the main diagonal elements, then the elements above the diagonal, column-wise. This translates to:

  • 2D: xx, yy, xy
  • 3D: xx, yy, zz, xy, xz, yz
  • 4D: xx, yy, zz, tt, xy, xz, yz, xt, yt, zt
  • etc.

The second order moment tensor is defined as:

\[ I = \Sigma_k m_k ((\vec{r_k} \cdot \vec{r_k}) E - \vec{r_k} \otimes \vec{r_k}) \]

where \(E\) is the identity matrix ( \(E = \Sigma_i \vec{e_i} \otimes \vec{e_i}\) ), \(m_k\) is the weight of point \(k\) , and \(\vec{r_k}\) is its position. In 2D, this leads to:

\begin{eqnarray*} I_{xx} & = & \mathbin{\phantom{-}}\Sigma_k m_k y^2 \\ I_{yy} & = & \mathbin{\phantom{-}}\Sigma_k m_k x^2 \\ I_{xy} & = & - \Sigma_k m_k x y \end{eqnarray*}

In 3D, it leads to:

\begin{eqnarray*} I_{xx} & = & \mathbin{\phantom{-}}\Sigma_k m_k y^2 + \Sigma_k m_k z^2 \\ I_{yy} & = & \mathbin{\phantom{-}}\Sigma_k m_k x^2 + \Sigma_k m_k z^2 \\ I_{zz} & = & \mathbin{\phantom{-}}\Sigma_k m_k x^2 + \Sigma_k m_k y^2 \\ I_{xy} & = & - \Sigma_k m_k x y \\ I_{xz} & = & - \Sigma_k m_k x z \\ I_{yz} & = & - \Sigma_k m_k y z \end{eqnarray*}

The equations above represent the second order moments, we compute instead the central moments, and normalize them by the sum of weights.