The optics stage applies the effects that belong to the glass: radial distortion, chromatic aberration, blur, bloom, veiling glare, vignetting. Two structural facts about it are worth more than the list.
They are centred on the optical centre, not the image centre. Every one of these effects is computed from a radius built out of — — so when the principal point is off-centre, as it always is by a few pixels, the vignette and the distortion are off-centre with it. That is the physically correct choice, and it is also why a figure that draws the vignette around the image centre and one that draws it around disagree in a way that looks like a bug in both.
They are a look, not a derivation. The vignette is for a radius parameter — a mask with two dials on it. The physical falloff of an ideal lens is of the field angle, which has no dials at all. These are different functions, and the simulation is honest about modelling the appearance rather than the optics — but it means the vignette strength is not a number you can carry to a real lens.
How far the labels move
-
Radial distortion in normalised coordinates, as always applied before K. The displacement is what is left when the ideal position is subtracted.
-
Because the displacement is radial, its magnitude is the radial factor times the radius itself — so it grows as the cube of the radius, not linearly. That cubic growth is the fingerprint.
-
In pixels, each component is scaled by its own focal length — which is also why the drift is not radially symmetric in pixel units unless the pixels are square.
-
A coefficient of the size the camera preset samples, on a modest frame, already moves the corner by four pixels — while the centre moves by nothing at all. Nobody notices a four-pixel label error that is zero where they looked.
Your segmentation masks are within half a pixel of the image in the centre and about three pixels out at the corners. Which stage is responsible?
Show answer
Radial distortion applied to the RGB only. The signature is the growth law: a crop offsets everything by a constant, a resize scales the offset linearly with radius, and only the radial term grows as — negligible in the middle, several pixels at the edge. Confirm it by undistorting the image with the recorded and re-checking the alignment; if the corners snap into place, you have found it, and the fix is to distort the masks with the same coefficients rather than to undistort every image at training time.