Source code for tonic.functional.spatial_jitter
from typing import List
import numpy as np
[docs]def spatial_jitter_numpy(
events: np.ndarray,
sensor_size: List[int],
var_x: float = 1,
var_y: float = 1,
sigma_xy: float = 0,
clip_outliers: bool = False,
):
"""Changes x/y coordinate for each event by adding samples from a multivariate Gaussian
distribution. It with the following properties:
.. math::
mean = [x,y]
\Sigma = [[var_x, sigma_{xy}],[sigma_{xy}, var_y]]
Jittered events that lie outside the focal plane will be dropped if clip_outliers is True.
Parameters:
events: ndarray of shape [num_events, num_event_channels]
var_x: squared sigma value for the distribution in the x direction
var_y: squared sigma value for the distribution in the y direction
sigma_xy: changes skewness of distribution, only change if you want shifts along diagonal axis.
clip_outliers: when True, events that have been jittered outside the sensor size will be dropped.
Returns:
array of spatially jittered events.
"""
assert "x" and "y" in events.dtype.names
shifts = np.random.multivariate_normal(
[0, 0], [[var_x, sigma_xy], [sigma_xy, var_y]], len(events)
)
events["x"] = events["x"] + shifts[:, 0]
events["y"] = events["y"] + shifts[:, 1]
if clip_outliers:
events = np.delete(
events,
np.where(
(events["x"] < 0)
| (events["x"] >= sensor_size[0])
| (events["y"] < 0)
| (events["y"] >= sensor_size[1])
),
axis=0,
)
return events