curvatureFilter edit page

smooth grain boundaries by a single variational solve

Description

Defines the smooth boundary as the minimizer of

|V - V0|^2 + alpha * |L V|^2

where L is the normalized Laplacian of the boundary network, i.e. L V measures how far a vertex sits off the line through its neighbours. The first term keeps the result close to the measured boundary, the second one penalizes curvature, and alpha decides between them.

There is no iteration count. The minimizer is the solution of one sparse linear system, so the result depends on alpha alone and not on how long the algorithm was run. Junctions are eliminated from that system rather than penalized, so they stay exactly where they are.

alpha is not stated directly but through smoothingLength, a length in the units of the map. On a boundary sampled at spacing h the filter has gain 1/(1+4*alpha*sin(w/2)^4) at the spatial frequency w, so it damps the wavelength

Lambda = pi*h / asin((4*alpha)^(-1/4))

to half amplitude. smoothingLength is that wavelength - detail finer than it is removed, detail coarser than it survives. Being a length, it means the same thing whatever step size the map was measured at. It cannot be shorter than 2*h, which is all the sampling can represent.

Syntax

grains = smoothBoundary(grains,curvatureFilter)
F = curvatureFilter;
F.smoothingLength = 3;   % in the units of the map
grains = smoothBoundary(grains,F)

Class Properties

smoothingLength wavelength damped to half amplitude, in map units (default: 4 times the vertex spacing)
alpha the regularization weight itself; set it to override smoothingLength

See also

grain2d.smoothBoundary boundaryFilter laplaceFilter taubinFilter huberFilter