Biometric Analysis
The Signature API looks not only at the shape of a signature on paper but at the traces of the hand movement that produced it. Pen speed or pressure cannot be measured directly from a static image; line width, ink density and changes in curvature do, however, give reliable indirect indicators of those dynamics. This page explains which features are extracted, how, and how they feed into the score.
Extracting the Stroke Curve
After preprocessing, the signature is reduced to a skeleton one pixel wide. The skeleton is split into strokes at the points where the pen lifted and landed, and each stroke is represented by a smooth B-spline curve. At every point on the curve, local curvature, direction and the line width in the original image are sampled. All biometric features are computed from these samples, which makes them independent of the image's size and position.
Features
| Feature | Measured | What it shows |
|---|---|---|
| stroke_curvature | Curvature profile and turning points along the stroke | A personal movement habit; the hardest feature to get right in a forgery. |
| pressure_proxy | Distribution of line width and ink density | Where pressure rises and falls; an indirect trace of rhythm. |
| speed_indicator | Width thinning, tapered ends, smoothness of curvature | Whether it was signed fast and fluently or slowly and carefully. |
| tremor_index | High-frequency deviations in the curve | Tremor seen in slow copying; can also come from age or illness. |
| slant_angle | Angle of the main axes to the horizontal | The person's consistent slant; usually stays within ±4°. |
| proportions | Letter heights, width/height ratio, spacing | Overall structure; enables scale-independent comparison. |
| pen_lifts | Number and positions of pen lifts | Stroke order; extra lifts are common in forgeries. |
| baseline_drift | Slope and waviness of the baseline | The habit of positioning against the writing line. |
For each feature a range (mean and deviation) is computed from the references; the questioned signature's value is scored against that range. This is why a single reference cannot establish a range and feature contributions become weak.
Biometric Data in the Response
The GET /v2.4/signature/comparisons/{id}?include=features call returns every feature in detail:
{
"features": [
{
"feature": "tremor_index",
"questioned": 0.31,
"reference_range": { "mean": 0.08, "std": 0.03 },
"deviation_sigma": 7.7,
"contribution": -14.2
},
{
"feature": "slant_angle",
"questioned": 62.5,
"reference_range": { "mean": 61.8, "std": 1.9 },
"deviation_sigma": 0.4,
"contribution": 6.1
}
]
}In this example the slant matches the references, but the tremor index is 7.7 standard deviations from the mean; that can point to a slow, careful attempt at copying.
A high tremor_index does not always mean forgery; old age, fatigue or neurological conditions cause tremor too. If the references are close in time to the questioned signature, this effect largely evens out.