smooth grain boundaries by a single variational solve
Description
Defines the smooth boundary as the minimizer of
|V - V0|^2 + alpha * |L V|^2where 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