Skip to content

Interfacial Surface Area

The interfacial surface area is the area of the boundary between pore and solid. Normalised by the sample's bulk volume, it gives the specific surface area \(s_v\), which the app reports as area / bulk volume. It controls reaction rates, adsorption capacity and the Kozeny–Carman prediction of permeability.

  • Measures the area of the pore–solid surface inside the image
  • Method a voxel-face mesh smoothed with Taubin's filter, with PoreSpy and trimesh
  • Reports raw and final smoothed area, and area / bulk volume, at every smoothing iteration
  • How to run it Interfacial Surface Area in the User guide

In progress

Its accuracy against analytical surfaces is still being checked.

Definition

The interfacial area \(A\) is the area of the surface that separates the pore space \(\Omega_p\) from the solid \(\Omega_s\) inside the image, and the specific surface area is \(s_v = A/V_\text{bulk}\), where \(V_\text{bulk}\) counts every voxel of the image. Voxels are cubes, so the surface has the same scale along every axis.

The voxel-surface problem

The obvious measure, counting the voxel faces between pore and solid, is biased. A staircase of faces overstates the area of the smooth surface it approximates. For a surface of random orientation, the bias is a factor of \(3/2\): the face count measures \(|n_x| + |n_y| + |n_z|\) per unit true area, which averages \(3/2\) over all directions.2 Refining the resolution doesn't remove this bias. Every staircase overstates by the same factor.

PoreStore therefore reports the voxel-face area and a sequence of smoothed values, so you can see how much of the area is staircase.

How it's computed

  1. Mesh the voxel faces with PoreSpy's mesh export.3 Every face between a pore voxel and a solid voxel becomes two triangles, with corners on the integer voxel grid. Shared vertices are welded exactly. No faces are added where the pore space meets the edge of the image. The area of this mesh is \(A_0\), the raw area (voxel-face area).
  2. Pin the crop boundary. Vertices on the image's outer faces, the crop boundary, are held fixed, so smoothing can't shrink the surface away from the edges.
  3. Freeze edge and corner contacts. Where two pore regions touch only along a voxel edge or at a corner, the welded mesh is non-manifold: more than one sheet of surface meets at a vertex. Every voxel face that touches such a vertex is frozen whole, both its triangles, by pinning all its corners. The frozen faces keep their voxel-face area, and the rest of the surface is smoothed around them. Only those faces are frozen; the freeze doesn't spread to their neighbours.
  4. Smooth with Taubin's \(\lambda|\mu\) filter.1 Each iteration is one Taubin pair: it moves every free vertex \(\mathbf{v}\) twice along the uniform Laplacian \(\Delta \mathbf{v} = \bar{\mathbf{v}}_\text{nb} - \mathbf{v}\), where \(\bar{\mathbf{v}}_\text{nb}\) is the mean of the vertex's neighbours: $$ \mathbf{v} \leftarrow \mathbf{v} + \lambda\,\Delta\mathbf{v}, \qquad \mathbf{v} \leftarrow \mathbf{v} + \mu\,\Delta\mathbf{v}, \qquad \lambda = 0.5, \mu = -0.525 . $$ The first pass smooths and shrinks, and the second, slightly stronger, re-inflates. Together they remove the staircase without the steady shrinkage of plain Laplacian smoothing. Each neighbour counts once in the mean, even where sheets meet, so the result doesn't depend on where a shape sits in the image. The filter is trimesh's Taubin filter, which writes the same filter with \(\nu = -\mu = 0.525\).
  5. Measure after every iteration. Iteration zero is the raw area, and ten iterations give \(A_0, A_1, \dots, A_{10}\). \(A_{10}\) is the final smoothed area.

The number of iterations, \(\lambda\) and \(\mu\) are fixed.

A 120³ synthetic sample, porosity 0.55, run through PoreStore's own analysis code: the area of its surface over ten smoothing iterations, relative to the raw area. It drops fast at first, as the staircase goes, then levels off. The flattening curve shows smoothing has converged.

Area / bulk volume is the specific surface area per bulk volume, every voxel of the image: \(s_v = A_i / V_\text{bulk}\). Divide by the porosity for area per pore volume. The relative change at iteration \(i\) is \(A_i/A_0 - 1\), shown as a percentage.

Edge and corner contacts

When the surface has edge or corner contacts, the analysis still completes, freezes the faces around them as in step 3, and reports how much geometry that constrained: the contact vertices, the voxel faces frozen and the vertices pinned around them. It also adds an experimental topology warning naming the first contact's location. In progress How accurate the smoothed area of such a partly frozen surface is hasn't been checked yet.

Isolated voxel cleanup

Single voxels of one phase surrounded on all six faces by the other phase are often segmentation noise, and each adds six faces of area. With Remove isolated interior voxels before analysis, PoreStore removes them before meshing, on a copy of the image:

  • In one simultaneous pass, every voxel with no face neighbour of its own phase flips to the other phase: isolated pore voxels are filled and isolated solid voxels are removed. Every voxel is tested against the original image, so the order doesn't matter.
  • Crop-boundary voxels, the outermost layer, are left alone, because their neighbours outside the image are unknown.
  • The stored image is unchanged.

The result then reports the voxel-face area before cleanup as the original raw area, and every other area, including \(A_0\), is for the cleaned image, with the voxels filled and removed and the share of the image they make up.

Reading the result

  • The size of the drop. The voxel-face count of a randomly oriented surface is about 3/2 of its true area, so a relative change approaching −⅓ is the staircase going, not real surface being lost.
  • A plateau isn't proof of accuracy. The flattening curve shows smoothing has settled, not that the settled value is the true area.
  • Edge and corner contacts. Faces frozen around them keep their voxel-face area, so the more faces the result reports frozen, the closer the smoothed area stays to \(A_0\).
  • Thin features. Smoothing can shrink features only a voxel or two thick.
  • A cross-check. In an isotropic sample, \(4\varphi/s_v\) should match the mean pore chord length from the chord length distribution.

References


  1. G. Taubin, "A signal processing approach to fair surface design," Proceedings of SIGGRAPH '95 (1995) 351–358. doi:10.1145/218380.218473 ↩

  2. J. Lindblad, "Surface area estimation of digitized 3D objects using weighted local configurations," Image and Vision Computing 23 (2005) 111–122. doi:10.1016/j.imavis.2004.06.012 ↩

  3. J. T. Gostick et al., "PoreSpy: A Python toolkit for quantitative analysis of porous media images," Journal of Open Source Software 4 (2019) 1296. doi:10.21105/joss.01296 ↩