from stimupy.components import waves
from stimupy.components.gaussians import gaussian
__all__ = ["gabor"]
[docs]def gabor(
visual_size=None,
ppd=None,
shape=None,
frequency=None,
n_bars=None,
bar_width=None,
period="ignore",
rotation=0.0,
phase_shift=0,
intensities=(0.0, 1.0),
origin="center",
round_phase_width=False,
sigma=None,
):
"""Draw a Gabor: a sinewave grating in a Gaussian envelope
Parameters
----------
visual_size : Sequence[Number, Number], Number, or None (default)
visual size [height, width] of image, in degrees
ppd : Sequence[Number, Number], Number, or None (default)
pixels per degree [vertical, horizontal]
shape : Sequence[Number, Number], Number, or None (default)
shape [height, width] of image, in pixels
frequency : Number, or None (default)
spatial frequency of grating, in cycles per degree visual angle
n_bars : Number, or None (default)
number of bars in the grating
bar_width : Number, or None (default)
width of a single bar, in degrees visual angle
sigma : float or (float, float)
sigma of Gaussian in degree visual angle (y, x)
period : "even", "odd", "either" or "ignore" (default)
ensure whether the grating has "even" number of phases, "odd"
number of phases, either or whether not to round the number of
phases ("ignore")
rotation : float, optional
rotation (in degrees), counterclockwise, by default 0.0 (horizontal)
phase_shift : float
phase shift of grating in degrees
intensities : Sequence[float, ...]
maximal intensity value for each bar, by default (0.0, 1.0).
origin : "corner", "mean" or "center"
if "corner": set origin to upper left corner
if "mean": set origin to hypothetical image center (default)
if "center": set origin to real center (closest existing value to mean)
Returns
-------
dict[str, Any]
dict with the stimulus (key: "img"),
mask with integer index for each bar (key: "grating_mask"),
and additional keys containing stimulus parameters
"""
if sigma is None:
raise ValueError("gabor() missing argument 'sigma' which is not 'None'")
stim = waves.sine(
visual_size=visual_size,
ppd=ppd,
shape=shape,
frequency=frequency,
n_phases=n_bars,
phase_width=bar_width,
period=period,
rotation=rotation,
phase_shift=phase_shift,
intensities=intensities,
origin=origin,
distance_metric="oblique",
round_phase_width=round_phase_width,
)
gaussian_window = gaussian(
visual_size=visual_size,
ppd=ppd,
sigma=sigma,
origin=origin,
)
mean_int = (intensities[0] + intensities[1]) / 2
stim["img"] = (stim["img"] - mean_int) * gaussian_window["img"] + mean_int
del stim["intensities"]
return {
**stim,
"sigma": sigma,
"gaussian_mask": gaussian_window["gaussian_mask"],
"intensities": intensities,
}
def overview(**kwargs):
"""Generate example stimuli from this module
Returns
-------
stims : dict
dict with all stimuli containing individual stimulus dicts.
"""
default_params = {
"visual_size": 10,
"ppd": 20,
"rotation": 45,
}
default_params.update(kwargs)
# fmt: off
stimuli = {
"gabor": gabor(**default_params, frequency=1, sigma=2, phase_shift=0, round_phase_width=False, origin="center"),
}
# fmt: on
return stimuli
if __name__ == "__main__":
from stimupy.utils import plot_stimuli
stims = overview()
plot_stimuli(stims, mask=False, save=None)