symmetry op• Data kinds: points → matrix
• Call: import fullseye as fs; fs.ledger.mirror_plane_from_pairs(landmarks, pairs=None, midline=None) (to call the implementation directly, import shapestats; shapestats.mirror_plane_from_pairs(landmarks, pairs=None, midline=None); from the registry, opsshapestat.get("mirror_plane_from_pairs"))
Derives the median (midsagittal) plane from corresponding left/right landmarks. → (2, 3) (row 1 = point, row 2 = normal).
The midpoints of the left-right pairs (i, j) all lie on the midsagittal plane. So it suffices to fit a plane to that set of midpoints -- the key point is that the plane is determined regardless of the amount of deformation, and it is a different thing from the plane that minimises the residual (symmetry3d.detect_reflection_symmetry).
★ Measured on 2026-09-06: with a one-sided deformation of 6.4 mm, the residual-optimal plane deviated from the true midsagittal plane by 2.92 mm / 1.72 degrees and erased 46 % of the asymmetry (gain 0.54). With this landmark plane the gain is 1.03. To find it, use the residual-optimal plane; to state the amount, use this one.
*midline* holds the indices of landmarks on the midline (not part of a pair). If given, they are added to the set of midpoints to stabilise the plane fit.
pairs=None is the convention of pairing the first half with the second half (i and i + N//2). It matches the storage format common in morphometrics, where all left landmarks are listed first and then the right ones in the same order. An odd number of points is rejected -- silently truncating an order that cannot be split in half shifts every pair by 1, swapping the sign of all of them.
• shape_statistics family guide
• Sample-data catalog (download URLs / licences) — 2-D uses skimage.data (BSD/public domain) plus synthetic images; 3-D lists download URLs for real data sources (Stanford, PDS, …).
• Operator provenance and references — the sources of the research/methods this op family came from.
• The canonical algorithm (author, year) and its uses are named in the family usage guide above.
• shapestat_landmark_tour — py -3.11 examples/shapestat_landmark_tour.py
matrix as input)—
symmetry)*Provenance: shapestats.py — SHAPESTAT operator registry. This per-op note is generated by tools/opdocs.py md (do not hand-edit).*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.