Source code for stimupy.papers.modelfest

"""Modelfest dataset from Carney et al (1999) https://doi.org/10.1117/12.348473

This module reproduces all of the stimuli from the Modelfest dataset
prior to the spatiotemporal extension as described in Carney et al (1999)
but normalized between 0 and 1.
More information on Modelfest can be found here:
https://www.visionscience.com/data/modelfest/

Each stimulus is provided by a separate function,
a full list can be found as stimupy.papers.modelfest.__all__

The output of each of these functions is a stimulus dictionary.

For a visual representation of all the stimuli and their mask,
simply run this module as a script:

    $ python stimuli/papers/modelfest.py

Attributes
----------
__all__ (list of str): list of all stimulus-functions
    that are exported by this module when executing
        >>> from stimupy.papers.modelfest import *

References
-----------
Carney, T., Klein, S. A., Tyler, C. W., Silverstein, A. D., Beutter, B., Levi, D.,
    ... & Eckstein, M. P. (1999).
    Development of an image/threshold database
    for designing and testing human vision models.
    Proceedings of SPIE, 3644, 542-551.
    https://doi.org/10.1117/12.348473
"""

from pathlib import Path

import numpy as np
import pandas as pd

from stimupy import checkerboards
from stimupy.components import gaussians, lines, shapes
from stimupy.components.edges import gaussian as gaussian_edge
from stimupy.components.waves import bessel
from stimupy.noises.binaries import binary as binary_noise
from stimupy.stimuli.gabors import gabor
from stimupy.stimuli.plaids import gabors as plaid
from stimupy.utils import pad_dict_to_shape, resize_dict, resolution, roll_dict, stack_dicts

__all__ = [
    "GaborPatch1",
    "GaborPatch2",
    "GaborPatch3",
    "GaborPatch4",
    "GaborPatch5",
    "GaborPatch6",
    "GaborPatch7",
    "GaborPatch8",
    "GaborPatch9",
    "GaborPatch10",
    "GaborPatch11",
    "GaborPatch12",
    "GaborPatch13",
    "GaborPatch14",
    "ElongatedGabor15",
    "ElongatedGabor16",
    "ElongatedGabor17",
    "Baguette18",
    "Baguette19",
    "Baguette20",
    "Baguette21",
    "Subthreshold22",
    "Subthreshold23",
    "Subthreshold24",
    "Subthreshold25",
    "Gaussians26",
    "Gaussians27",
    "Gaussians28",
    "Gaussians29",
    "Edge30",
    "Line31",
    "Dipole32",
    "GaborString33",
    "GaborString34",
    "Noise35",
    "Orientation36",
    "Orientation37",
    "Plaids38",
    "Plaids39",
    "Disk40",
    "Bessel41",
    "Checkerboard42",
    "NaturalScene43",
]

# Default values:
PPD = 120  # pixel size of 0.5 arcmin
PPD2 = 60  # pixel size of 1 arcmin (pixel replication)
VISUAL_SIZE = resolution.visual_size_from_shape_ppd(shape=256, ppd=PPD)

mean_lum = 0.5

df = pd.read_csv(Path(__file__).parents[0] / "modelfest_data.csv", header=None)
participants = df[0]


def gen_all(ppd=PPD, skip=False):
    stims = {}  # save the stimulus-dicts in a larger dict, with name as key
    for stim_name in __all__:
        print(f"Generating modelfest.{stim_name}")

        # Get a reference to the actual function
        func = globals()[stim_name]
        try:
            stim = func(ppd=ppd)

            # Accumulate
            stims[stim_name] = stim
        except NotImplementedError as e:
            if not skip:
                raise e
            # Skip stimuli that aren't implemented
            print("-- not implemented")
            pass

    return stims


[docs]def GaborPatch1(ppd=PPD): """GaborPatch1 with fixed size in degrees, Carney et al (1999) Frequency: 1.12 cpd Gaussian window: sx=sy=0.5 deg Parameters ---------- ppd : Sequence[Number, Number], Number, or None pixels per degree [vertical, horizontal] Returns ------- dict[str, Any] dict with the stimulus (key: "img") and additional keys containing stimulus parameters References ---------- Carney, T., Klein, S. A., Tyler, C. W., Silverstein, A. D., Beutter, B., Levi, D., ... & Eckstein, M. P. (1999). Development of an image/threshold database for designing and testing human vision models. Proceedings of SPIE, 3644, 542-551. https://doi.org/10.1117/12.348473 """ params = { "visual_size": VISUAL_SIZE, "ppd": ppd, "frequency": 1.12, "sigma": 0.5, "rotation": -90, "phase_shift": 90, "origin": "center", } stim = gabor(**params) v = 1 experimental_data = { "participants": participants, "thresholds1": df[v], "thresholds2": df[v + 1], "thresholds3": df[v + 2], "thresholds4": df[v + 3], } return {**stim, "experimental_data": experimental_data}
[docs]def GaborPatch2(ppd=PPD): """GaborPatch2 with fixed size in degrees, Carney et al (1999) Frequency: 2 cpd Gaussian window: sx=sy=0.5 deg Parameters ---------- ppd : Sequence[Number, Number], Number, or None pixels per degree [vertical, horizontal] Returns ------- dict[str, Any] dict with the stimulus (key: "img") and additional keys containing stimulus parameters References ---------- Carney, T., Klein, S. A., Tyler, C. W., Silverstein, A. D., Beutter, B., Levi, D., ... & Eckstein, M. P. (1999). Development of an image/threshold database for designing and testing human vision models. Proceedings of SPIE, 3644, 542-551. https://doi.org/10.1117/12.348473 """ params = { "visual_size": VISUAL_SIZE, "ppd": ppd, "frequency": 2, "sigma": 0.5, "rotation": -90, "phase_shift": 90, "origin": "center", } stim = gabor(**params) v = 5 experimental_data = { "participants": participants, "thresholds1": df[v], "thresholds2": df[v + 1], "thresholds3": df[v + 2], "thresholds4": df[v + 3], } return {**stim, "experimental_data": experimental_data}
[docs]def GaborPatch3(ppd=PPD): """GaborPatch3 with fixed size in degrees, Carney et al (1999) Frequency: 2.83 cpd Gaussian window: sx=sy=0.5 deg Parameters ---------- ppd : Sequence[Number, Number], Number, or None pixels per degree [vertical, horizontal] Returns ------- dict[str, Any] dict with the stimulus (key: "img") and additional keys containing stimulus parameters References ---------- Carney, T., Klein, S. A., Tyler, C. W., Silverstein, A. D., Beutter, B., Levi, D., ... & Eckstein, M. P. (1999). Development of an image/threshold database for designing and testing human vision models. Proceedings of SPIE, 3644, 542-551. https://doi.org/10.1117/12.348473 """ params = { "visual_size": VISUAL_SIZE, "ppd": ppd, "frequency": 2.83, "sigma": 0.5, "rotation": -90, "phase_shift": 90, "origin": "center", } stim = gabor(**params) v = 9 experimental_data = { "participants": participants, "thresholds1": df[v], "thresholds2": df[v + 1], "thresholds3": df[v + 2], "thresholds4": df[v + 3], } return {**stim, "experimental_data": experimental_data}
[docs]def GaborPatch4(ppd=PPD): """GaborPatch4 with fixed size in degrees, Carney et al (1999) Frequency: 4 cpd Gaussian window: sx=sy=0.5 deg Parameters ---------- ppd : Sequence[Number, Number], Number, or None pixels per degree [vertical, horizontal] Returns ------- dict[str, Any] dict with the stimulus (key: "img") and additional keys containing stimulus parameters References ---------- Carney, T., Klein, S. A., Tyler, C. W., Silverstein, A. D., Beutter, B., Levi, D., ... & Eckstein, M. P. (1999). Development of an image/threshold database for designing and testing human vision models. Proceedings of SPIE, 3644, 542-551. https://doi.org/10.1117/12.348473 """ params = { "visual_size": VISUAL_SIZE, "ppd": ppd, "frequency": 4, "sigma": 0.5, "rotation": -90, "phase_shift": 90, "origin": "center", } stim = gabor(**params) v = 13 experimental_data = { "participants": participants, "thresholds1": df[v], "thresholds2": df[v + 1], "thresholds3": df[v + 2], "thresholds4": df[v + 3], } return {**stim, "experimental_data": experimental_data}
[docs]def GaborPatch5(ppd=PPD): """GaborPatch5 with fixed size in degrees, Carney et al (1999) Frequency: 5.66 cpd Gaussian window: sx=sy=0.5 deg Parameters ---------- ppd : Sequence[Number, Number], Number, or None pixels per degree [vertical, horizontal] Returns ------- dict[str, Any] dict with the stimulus (key: "img") and additional keys containing stimulus parameters References ---------- Carney, T., Klein, S. A., Tyler, C. W., Silverstein, A. D., Beutter, B., Levi, D., ... & Eckstein, M. P. (1999). Development of an image/threshold database for designing and testing human vision models. Proceedings of SPIE, 3644, 542-551. https://doi.org/10.1117/12.348473 """ params = { "visual_size": VISUAL_SIZE, "ppd": ppd, "frequency": 5.66, "sigma": 0.5, "rotation": -90, "phase_shift": 90, "origin": "center", } stim = gabor(**params) v = 17 experimental_data = { "participants": participants, "thresholds1": df[v], "thresholds2": df[v + 1], "thresholds3": df[v + 2], "thresholds4": df[v + 3], } return {**stim, "experimental_data": experimental_data}
[docs]def GaborPatch6(ppd=PPD): """GaborPatch6 with fixed size in degrees, Carney et al (1999) Frequency: 8 cpd Gaussian window: sx=sy=0.5 deg Parameters ---------- ppd : Sequence[Number, Number], Number, or None pixels per degree [vertical, horizontal] Returns ------- dict[str, Any] dict with the stimulus (key: "img") and additional keys containing stimulus parameters References ---------- Carney, T., Klein, S. A., Tyler, C. W., Silverstein, A. D., Beutter, B., Levi, D., ... & Eckstein, M. P. (1999). Development of an image/threshold database for designing and testing human vision models. Proceedings of SPIE, 3644, 542-551. https://doi.org/10.1117/12.348473 """ params = { "visual_size": VISUAL_SIZE, "ppd": ppd, "frequency": 8, "sigma": 0.5, "rotation": -90, "phase_shift": 90, "origin": "center", } stim = gabor(**params) v = 21 experimental_data = { "participants": participants, "thresholds1": df[v], "thresholds2": df[v + 1], "thresholds3": df[v + 2], "thresholds4": df[v + 3], } return {**stim, "experimental_data": experimental_data}
[docs]def GaborPatch7(ppd=PPD): """GaborPatch7 with fixed size in degrees, Carney et al (1999) Frequency: 11.3 cpd Gaussian window: sx=sy=0.5 deg Parameters ---------- ppd : Sequence[Number, Number], Number, or None pixels per degree [vertical, horizontal] Returns ------- dict[str, Any] dict with the stimulus (key: "img") and additional keys containing stimulus parameters References ---------- Carney, T., Klein, S. A., Tyler, C. W., Silverstein, A. D., Beutter, B., Levi, D., ... & Eckstein, M. P. (1999). Development of an image/threshold database for designing and testing human vision models. Proceedings of SPIE, 3644, 542-551. https://doi.org/10.1117/12.348473 """ params = { "visual_size": VISUAL_SIZE, "ppd": ppd, "frequency": 11.3, "sigma": 0.5, "rotation": -90, "phase_shift": 90, "origin": "center", } stim = gabor(**params) v = 25 experimental_data = { "participants": participants, "thresholds1": df[v], "thresholds2": df[v + 1], "thresholds3": df[v + 2], "thresholds4": df[v + 3], } return {**stim, "experimental_data": experimental_data}
[docs]def GaborPatch8(ppd=PPD): """GaborPatch8 with fixed size in degrees, Carney et al (1999) Frequency: 16 cpd Gaussian window: sx=sy=0.5 deg Parameters ---------- ppd : Sequence[Number, Number], Number, or None pixels per degree [vertical, horizontal] Returns ------- dict[str, Any] dict with the stimulus (key: "img") and additional keys containing stimulus parameters References ---------- Carney, T., Klein, S. A., Tyler, C. W., Silverstein, A. D., Beutter, B., Levi, D., ... & Eckstein, M. P. (1999). Development of an image/threshold database for designing and testing human vision models. Proceedings of SPIE, 3644, 542-551. https://doi.org/10.1117/12.348473 """ params = { "visual_size": VISUAL_SIZE, "ppd": ppd, "frequency": 16, "sigma": 0.5, "rotation": -90, "phase_shift": 90, "origin": "center", } stim = gabor(**params) v = 29 experimental_data = { "participants": participants, "thresholds1": df[v], "thresholds2": df[v + 1], "thresholds3": df[v + 2], "thresholds4": df[v + 3], } return {**stim, "experimental_data": experimental_data}
[docs]def GaborPatch9(ppd=PPD): """GaborPatch9 with fixed size in degrees, Carney et al (1999) Frequency: 22.6 cpd Gaussian window: sx=sy=0.5 deg Parameters ---------- ppd : Sequence[Number, Number], Number, or None pixels per degree [vertical, horizontal] Returns ------- dict[str, Any] dict with the stimulus (key: "img") and additional keys containing stimulus parameters References ---------- Carney, T., Klein, S. A., Tyler, C. W., Silverstein, A. D., Beutter, B., Levi, D., ... & Eckstein, M. P. (1999). Development of an image/threshold database for designing and testing human vision models. Proceedings of SPIE, 3644, 542-551. https://doi.org/10.1117/12.348473 """ params = { "visual_size": VISUAL_SIZE, "ppd": ppd, "frequency": 22.6, "sigma": 0.5, "rotation": -90, "phase_shift": 90, "origin": "center", } stim = gabor(**params) v = 33 experimental_data = { "participants": participants, "thresholds1": df[v], "thresholds2": df[v + 1], "thresholds3": df[v + 2], "thresholds4": df[v + 3], } return {**stim, "experimental_data": experimental_data}
[docs]def GaborPatch10(ppd=PPD): """GaborPatch10 with fixed size in degrees, Carney et al (1999) Frequency: 30 cpd Gaussian window: sx=sy=0.5 deg Parameters ---------- ppd : Sequence[Number, Number], Number, or None pixels per degree [vertical, horizontal] Returns ------- dict[str, Any] dict with the stimulus (key: "img") and additional keys containing stimulus parameters References ---------- Carney, T., Klein, S. A., Tyler, C. W., Silverstein, A. D., Beutter, B., Levi, D., ... & Eckstein, M. P. (1999). Development of an image/threshold database for designing and testing human vision models. Proceedings of SPIE, 3644, 542-551. https://doi.org/10.1117/12.348473 """ params = { "visual_size": VISUAL_SIZE, "ppd": ppd, "frequency": 30, "sigma": 0.5, "rotation": -90, "phase_shift": 90, "origin": "center", } stim = gabor(**params) v = 37 experimental_data = { "participants": participants, "thresholds1": df[v], "thresholds2": df[v + 1], "thresholds3": df[v + 2], "thresholds4": df[v + 3], } return {**stim, "experimental_data": experimental_data}
[docs]def GaborPatch11(ppd=PPD): """GaborPatch11 with fixed size in cycles (~1 octave), Carney et al (1999) Frequency: 2 cpd Gaussian window: sx=sy=0.28 deg Parameters ---------- ppd : Sequence[Number, Number], Number, or None pixels per degree [vertical, horizontal] Returns ------- dict[str, Any] dict with the stimulus (key: "img") and additional keys containing stimulus parameters References ---------- Carney, T., Klein, S. A., Tyler, C. W., Silverstein, A. D., Beutter, B., Levi, D., ... & Eckstein, M. P. (1999). Development of an image/threshold database for designing and testing human vision models. Proceedings of SPIE, 3644, 542-551. https://doi.org/10.1117/12.348473 """ params = { "visual_size": VISUAL_SIZE, "ppd": ppd, "frequency": 2, "sigma": 0.28, "rotation": -90, "phase_shift": 90, "origin": "center", } stim = gabor(**params) v = 41 experimental_data = { "participants": participants, "thresholds1": df[v], "thresholds2": df[v + 1], "thresholds3": df[v + 2], "thresholds4": df[v + 3], } return {**stim, "experimental_data": experimental_data}
[docs]def GaborPatch12(ppd=PPD): """GaborPatch12 with fixed size in cycles (~1 octave), Carney et al (1999) Frequency: 4 cpd Gaussian window: sx=sy=0.14 deg Parameters ---------- ppd : Sequence[Number, Number], Number, or None pixels per degree [vertical, horizontal] Returns ------- dict[str, Any] dict with the stimulus (key: "img") and additional keys containing stimulus parameters References ---------- Carney, T., Klein, S. A., Tyler, C. W., Silverstein, A. D., Beutter, B., Levi, D., ... & Eckstein, M. P. (1999). Development of an image/threshold database for designing and testing human vision models. Proceedings of SPIE, 3644, 542-551. https://doi.org/10.1117/12.348473 """ params = { "visual_size": VISUAL_SIZE, "ppd": ppd, "frequency": 4, "sigma": 0.14, "rotation": -90, "phase_shift": 90, "origin": "center", } stim = gabor(**params) v = 45 experimental_data = { "participants": participants, "thresholds1": df[v], "thresholds2": df[v + 1], "thresholds3": df[v + 2], "thresholds4": df[v + 3], } return {**stim, "experimental_data": experimental_data}
[docs]def GaborPatch13(ppd=PPD): """GaborPatch13 with fixed size in cycles (~1 octave), Carney et al (1999) Frequency: 8 cpd Gaussian window: sx=sy=0.07 deg Parameters ---------- ppd : Sequence[Number, Number], Number, or None pixels per degree [vertical, horizontal] Returns ------- dict[str, Any] dict with the stimulus (key: "img") and additional keys containing stimulus parameters References ---------- Carney, T., Klein, S. A., Tyler, C. W., Silverstein, A. D., Beutter, B., Levi, D., ... & Eckstein, M. P. (1999). Development of an image/threshold database for designing and testing human vision models. Proceedings of SPIE, 3644, 542-551. https://doi.org/10.1117/12.348473 """ params = { "visual_size": VISUAL_SIZE, "ppd": ppd, "frequency": 8, "sigma": 0.07, "rotation": -90, "phase_shift": 90, "origin": "center", } stim = gabor(**params) v = 49 experimental_data = { "participants": participants, "thresholds1": df[v], "thresholds2": df[v + 1], "thresholds3": df[v + 2], "thresholds4": df[v + 3], } return {**stim, "experimental_data": experimental_data}
[docs]def GaborPatch14(ppd=PPD): """GaborPatch14 with fixed size in cycles (~1 octave), Carney et al (1999) Frequency: 16 cpd Gaussian window: sx=sy=0.035 deg Parameters ---------- ppd : Sequence[Number, Number], Number, or None pixels per degree [vertical, horizontal] Returns ------- dict[str, Any] dict with the stimulus (key: "img") and additional keys containing stimulus parameters References ---------- Carney, T., Klein, S. A., Tyler, C. W., Silverstein, A. D., Beutter, B., Levi, D., ... & Eckstein, M. P. (1999). Development of an image/threshold database for designing and testing human vision models. Proceedings of SPIE, 3644, 542-551. https://doi.org/10.1117/12.348473 """ params = { "visual_size": VISUAL_SIZE, "ppd": ppd, "frequency": 16, "sigma": 0.035, "rotation": -90, "phase_shift": 90, "origin": "center", } stim = gabor(**params) v = 53 experimental_data = { "participants": participants, "thresholds1": df[v], "thresholds2": df[v + 1], "thresholds3": df[v + 2], "thresholds4": df[v + 3], } return {**stim, "experimental_data": experimental_data}
[docs]def ElongatedGabor15(ppd=PPD): """ElongatedGabor15, Carney et al (1999) Frequency: 4 cpd Gaussian window: sy=0.28 (~0.5octave); sx=0.5 deg Parameters ---------- ppd : Sequence[Number, Number], Number, or None pixels per degree [vertical, horizontal] Returns ------- dict[str, Any] dict with the stimulus (key: "img") and additional keys containing stimulus parameters References ---------- Carney, T., Klein, S. A., Tyler, C. W., Silverstein, A. D., Beutter, B., Levi, D., ... & Eckstein, M. P. (1999). Development of an image/threshold database for designing and testing human vision models. Proceedings of SPIE, 3644, 542-551. https://doi.org/10.1117/12.348473 """ params = { "visual_size": VISUAL_SIZE, "ppd": ppd, "frequency": 4, "sigma": (0.28, 0.5), "rotation": -90, "phase_shift": 90, "origin": "center", } stim = gabor(**params) v = 57 experimental_data = { "participants": participants, "thresholds1": df[v], "thresholds2": df[v + 1], "thresholds3": df[v + 2], "thresholds4": df[v + 3], } return {**stim, "experimental_data": experimental_data}
[docs]def ElongatedGabor16(ppd=PPD): """ElongatedGabor16, Carney et al (1999) Frequency: 8 cpd Gaussian window: sy=0.14 (~0.5octave); sx=0.5 deg Parameters ---------- ppd : Sequence[Number, Number], Number, or None pixels per degree [vertical, horizontal] Returns ------- dict[str, Any] dict with the stimulus (key: "img") and additional keys containing stimulus parameters References ---------- Carney, T., Klein, S. A., Tyler, C. W., Silverstein, A. D., Beutter, B., Levi, D., ... & Eckstein, M. P. (1999). Development of an image/threshold database for designing and testing human vision models. Proceedings of SPIE, 3644, 542-551. https://doi.org/10.1117/12.348473 """ params = { "visual_size": VISUAL_SIZE, "ppd": ppd, "frequency": 8, "sigma": (0.14, 0.5), "rotation": -90, "phase_shift": 90, "origin": "center", } stim = gabor(**params) v = 61 experimental_data = { "participants": participants, "thresholds1": df[v], "thresholds2": df[v + 1], "thresholds3": df[v + 2], "thresholds4": df[v + 3], } return {**stim, "experimental_data": experimental_data}
[docs]def ElongatedGabor17(ppd=PPD): """ElongatedGabor17, Carney et al (1999) Frequency: 16 cpd Gaussian window: sy=0.07 (~0.5octave); sx=0.5 deg Parameters ---------- ppd : Sequence[Number, Number], Number, or None pixels per degree [vertical, horizontal] Returns ------- dict[str, Any] dict with the stimulus (key: "img") and additional keys containing stimulus parameters References ---------- Carney, T., Klein, S. A., Tyler, C. W., Silverstein, A. D., Beutter, B., Levi, D., ... & Eckstein, M. P. (1999). Development of an image/threshold database for designing and testing human vision models. Proceedings of SPIE, 3644, 542-551. https://doi.org/10.1117/12.348473 """ params = { "visual_size": VISUAL_SIZE, "ppd": ppd, "frequency": 16, "sigma": (0.07, 0.5), "rotation": -90, "phase_shift": 90, "origin": "center", } stim = gabor(**params) v = 65 experimental_data = { "participants": participants, "thresholds1": df[v], "thresholds2": df[v + 1], "thresholds3": df[v + 2], "thresholds4": df[v + 3], } return {**stim, "experimental_data": experimental_data}
[docs]def Baguette18(ppd=PPD): """Baguette18 (elongated Gabors; varying aspect ratios), Carney et al (1999) Frequency: 4 cpd Gaussian window: sy=0.14 (~1octave); sx=0.28 deg (~2octaves) Parameters ---------- ppd : Sequence[Number, Number], Number, or None pixels per degree [vertical, horizontal] Returns ------- dict[str, Any] dict with the stimulus (key: "img") and additional keys containing stimulus parameters References ---------- Carney, T., Klein, S. A., Tyler, C. W., Silverstein, A. D., Beutter, B., Levi, D., ... & Eckstein, M. P. (1999). Development of an image/threshold database for designing and testing human vision models. Proceedings of SPIE, 3644, 542-551. https://doi.org/10.1117/12.348473 """ params = { "visual_size": VISUAL_SIZE, "ppd": ppd, "frequency": 4, "sigma": (0.14, 0.28), "rotation": -90, "phase_shift": 90, "origin": "center", } stim = gabor(**params) v = 69 experimental_data = { "participants": participants, "thresholds1": df[v], "thresholds2": df[v + 1], "thresholds3": df[v + 2], "thresholds4": df[v + 3], } return {**stim, "experimental_data": experimental_data}
[docs]def Baguette19(ppd=PPD): """Baguette19 (elongated Gabors; varying aspect ratios), Carney et al (1999) Frequency: 4 cpd Gaussian window: sy=0.14 (~1octave); sx=0.5 deg Parameters ---------- ppd : Sequence[Number, Number], Number, or None pixels per degree [vertical, horizontal] Returns ------- dict[str, Any] dict with the stimulus (key: "img") and additional keys containing stimulus parameters References ---------- Carney, T., Klein, S. A., Tyler, C. W., Silverstein, A. D., Beutter, B., Levi, D., ... & Eckstein, M. P. (1999). Development of an image/threshold database for designing and testing human vision models. Proceedings of SPIE, 3644, 542-551. https://doi.org/10.1117/12.348473 """ params = { "visual_size": VISUAL_SIZE, "ppd": ppd, "frequency": 4, "sigma": (0.14, 0.5), "rotation": -90, "phase_shift": 90, "origin": "center", } stim = gabor(**params) v = 73 experimental_data = { "participants": participants, "thresholds1": df[v], "thresholds2": df[v + 1], "thresholds3": df[v + 2], "thresholds4": df[v + 3], } return {**stim, "experimental_data": experimental_data}
[docs]def Baguette20(ppd=PPD): """Baguette20 (elongated Gabors; varying aspect ratios), Carney et al (1999) Frequency: 4 cpd Gaussian window: sy=0.28 (~2octave); sx=0.14 deg (~1octave) Parameters ---------- ppd : Sequence[Number, Number], Number, or None pixels per degree [vertical, horizontal] Returns ------- dict[str, Any] dict with the stimulus (key: "img") and additional keys containing stimulus parameters References ---------- Carney, T., Klein, S. A., Tyler, C. W., Silverstein, A. D., Beutter, B., Levi, D., ... & Eckstein, M. P. (1999). Development of an image/threshold database for designing and testing human vision models. Proceedings of SPIE, 3644, 542-551. https://doi.org/10.1117/12.348473 """ params = { "visual_size": VISUAL_SIZE, "ppd": ppd, "frequency": 4, "sigma": (0.28, 0.14), "rotation": -90, "phase_shift": 90, "origin": "center", } stim = gabor(**params) v = 77 experimental_data = { "participants": participants, "thresholds1": df[v], "thresholds2": df[v + 1], "thresholds3": df[v + 2], "thresholds4": df[v + 3], } return {**stim, "experimental_data": experimental_data}
[docs]def Baguette21(ppd=PPD): """Baguette20 (elongated Gabors; varying aspect ratios), Carney et al (1999) Frequency: 4 cpd Gaussian window: sy=0.5 deg; sx=0.14 deg (~1octave) Parameters ---------- ppd : Sequence[Number, Number], Number, or None pixels per degree [vertical, horizontal] Returns ------- dict[str, Any] dict with the stimulus (key: "img") and additional keys containing stimulus parameters References ---------- Carney, T., Klein, S. A., Tyler, C. W., Silverstein, A. D., Beutter, B., Levi, D., ... & Eckstein, M. P. (1999). Development of an image/threshold database for designing and testing human vision models. Proceedings of SPIE, 3644, 542-551. https://doi.org/10.1117/12.348473 """ params = { "visual_size": VISUAL_SIZE, "ppd": ppd, "frequency": 4, "sigma": (0.5, 0.14), "rotation": -90, "phase_shift": 90, "origin": "center", } stim = gabor(**params) v = 81 experimental_data = { "participants": participants, "thresholds1": df[v], "thresholds2": df[v + 1], "thresholds3": df[v + 2], "thresholds4": df[v + 3], } return {**stim, "experimental_data": experimental_data}
[docs]def Subthreshold22(ppd=PPD): """Subthreshold22 (compound Gabor), Carney et al (1999) Frequencies: 2 cpd & 2*sqrt(2) cpd Gaussian window: sy=sx=0.5 deg Parameters ---------- ppd : Sequence[Number, Number], Number, or None pixels per degree [vertical, horizontal] Returns ------- dict[str, Any] dict with the stimulus (key: "img") and additional keys containing stimulus parameters References ---------- Carney, T., Klein, S. A., Tyler, C. W., Silverstein, A. D., Beutter, B., Levi, D., ... & Eckstein, M. P. (1999). Development of an image/threshold database for designing and testing human vision models. Proceedings of SPIE, 3644, 542-551. https://doi.org/10.1117/12.348473 """ params = { "visual_size": VISUAL_SIZE, "ppd": ppd, "sigma": 0.5, "rotation": -90, "phase_shift": 90, "origin": "center", } stim1 = gabor(**params, frequency=2) stim2 = gabor(**params, frequency=2 * np.sqrt(2)) stim1["img"] = stim1["img"] / 2 + stim2["img"] / 2 stim1["grating_mask2"] = stim2["grating_mask"] stim1["frequency2"] = stim2["frequency"] stim1["phase_width2"] = stim2["phase_width"] stim1["n_phases2"] = stim2["n_phases"] v = 85 experimental_data = { "participants": participants, "thresholds1": df[v], "thresholds2": df[v + 1], "thresholds3": df[v + 2], "thresholds4": df[v + 3], } return {**stim1, "experimental_data": experimental_data}
[docs]def Subthreshold23(ppd=PPD): """Subthreshold23 (compound Gabor), Carney et al (1999) Frequencies: 2 cpd & 4 cpd Gaussian window: sy=sx=0.5 deg Parameters ---------- ppd : Sequence[Number, Number], Number, or None pixels per degree [vertical, horizontal] Returns ------- dict[str, Any] dict with the stimulus (key: "img") and additional keys containing stimulus parameters References ---------- Carney, T., Klein, S. A., Tyler, C. W., Silverstein, A. D., Beutter, B., Levi, D., ... & Eckstein, M. P. (1999). Development of an image/threshold database for designing and testing human vision models. Proceedings of SPIE, 3644, 542-551. https://doi.org/10.1117/12.348473 """ params = { "visual_size": VISUAL_SIZE, "ppd": ppd, "sigma": 0.5, "rotation": -90, "phase_shift": 90, "origin": "center", } stim1 = gabor(**params, frequency=2) stim2 = gabor(**params, frequency=4) stim1["img"] = stim1["img"] / 2 + stim2["img"] / 2 stim1["grating_mask2"] = stim2["grating_mask"] stim1["frequency2"] = stim2["frequency"] stim1["phase_width2"] = stim2["phase_width"] stim1["n_phases2"] = stim2["n_phases"] v = 89 experimental_data = { "participants": participants, "thresholds1": df[v], "thresholds2": df[v + 1], "thresholds3": df[v + 2], "thresholds4": df[v + 3], } return {**stim1, "experimental_data": experimental_data}
[docs]def Subthreshold24(ppd=PPD): """Subthreshold24 (compound Gabor), Carney et al (1999) Frequencies: 4 cpd & 4*sqrt(2) cpd Gaussian window: sy=sx=0.5 deg Parameters ---------- ppd : Sequence[Number, Number], Number, or None pixels per degree [vertical, horizontal] Returns ------- dict[str, Any] dict with the stimulus (key: "img") and additional keys containing stimulus parameters References ---------- Carney, T., Klein, S. A., Tyler, C. W., Silverstein, A. D., Beutter, B., Levi, D., ... & Eckstein, M. P. (1999). Development of an image/threshold database for designing and testing human vision models. Proceedings of SPIE, 3644, 542-551. https://doi.org/10.1117/12.348473 """ params = { "visual_size": VISUAL_SIZE, "ppd": ppd, "sigma": 0.5, "rotation": -90, "phase_shift": 90, "origin": "center", } stim1 = gabor(**params, frequency=4) stim2 = gabor(**params, frequency=4 * np.sqrt(2)) stim1["img"] = stim1["img"] / 2 + stim2["img"] / 2 stim1["grating_mask2"] = stim2["grating_mask"] stim1["frequency2"] = stim2["frequency"] stim1["phase_width2"] = stim2["phase_width"] stim1["n_phases2"] = stim2["n_phases"] v = 93 experimental_data = { "participants": participants, "thresholds1": df[v], "thresholds2": df[v + 1], "thresholds3": df[v + 2], "thresholds4": df[v + 3], } return {**stim1, "experimental_data": experimental_data}
[docs]def Subthreshold25(ppd=PPD): """Subthreshold24 (compound Gabor), Carney et al (1999) Frequencies: 4 cpd & 8 cpd Gaussian window: sy=sx=0.5 deg Parameters ---------- ppd : Sequence[Number, Number], Number, or None pixels per degree [vertical, horizontal] Returns ------- dict[str, Any] dict with the stimulus (key: "img") and additional keys containing stimulus parameters References ---------- Carney, T., Klein, S. A., Tyler, C. W., Silverstein, A. D., Beutter, B., Levi, D., ... & Eckstein, M. P. (1999). Development of an image/threshold database for designing and testing human vision models. Proceedings of SPIE, 3644, 542-551. https://doi.org/10.1117/12.348473 """ params = { "visual_size": VISUAL_SIZE, "ppd": ppd, "sigma": 0.5, "rotation": -90, "phase_shift": 90, "origin": "center", } stim1 = gabor(**params, frequency=4) stim2 = gabor(**params, frequency=8) stim1["img"] = stim1["img"] / 2 + stim2["img"] / 2 stim1["grating_mask2"] = stim2["grating_mask"] stim1["frequency2"] = stim2["frequency"] stim1["phase_width2"] = stim2["phase_width"] stim1["n_phases2"] = stim2["n_phases"] v = 97 experimental_data = { "participants": participants, "thresholds1": df[v], "thresholds2": df[v + 1], "thresholds3": df[v + 2], "thresholds4": df[v + 3], } return {**stim1, "experimental_data": experimental_data}
[docs]def Gaussians26(ppd=PPD): """Gaussians26, Carney et al (1999) Gaussian window: sy=sx=0.5 deg Parameters ---------- ppd : Sequence[Number, Number], Number, or None pixels per degree [vertical, horizontal] Returns ------- dict[str, Any] dict with the stimulus (key: "img") and additional keys containing stimulus parameters References ---------- Carney, T., Klein, S. A., Tyler, C. W., Silverstein, A. D., Beutter, B., Levi, D., ... & Eckstein, M. P. (1999). Development of an image/threshold database for designing and testing human vision models. Proceedings of SPIE, 3644, 542-551. https://doi.org/10.1117/12.348473 """ params = { "visual_size": VISUAL_SIZE, "ppd": ppd, "sigma": 0.5, "intensity_max": 1, "origin": "center", } stim = gaussians.gaussian(**params) stim["img"] = stim["img"] / 2 + 0.5 v = 101 experimental_data = { "participants": participants, "thresholds1": df[v], "thresholds2": df[v + 1], "thresholds3": df[v + 2], "thresholds4": df[v + 3], } return {**stim, "experimental_data": experimental_data}
[docs]def Gaussians27(ppd=PPD): """Gaussians27, Carney et al (1999) Gaussian window: sy=sx=8.43 arcmin Parameters ---------- ppd : Sequence[Number, Number], Number, or None pixels per degree [vertical, horizontal] Returns ------- dict[str, Any] dict with the stimulus (key: "img") and additional keys containing stimulus parameters References ---------- Carney, T., Klein, S. A., Tyler, C. W., Silverstein, A. D., Beutter, B., Levi, D., ... & Eckstein, M. P. (1999). Development of an image/threshold database for designing and testing human vision models. Proceedings of SPIE, 3644, 542-551. https://doi.org/10.1117/12.348473 """ params = { "visual_size": VISUAL_SIZE, "ppd": ppd, "sigma": 8.43 / 60, "intensity_max": 1, "origin": "center", } stim = gaussians.gaussian(**params) stim["img"] = stim["img"] / 2 + 0.5 v = 105 experimental_data = { "participants": participants, "thresholds1": df[v], "thresholds2": df[v + 1], "thresholds3": df[v + 2], "thresholds4": df[v + 3], } return {**stim, "experimental_data": experimental_data}
[docs]def Gaussians28(ppd=PPD): """Gaussians28, Carney et al (1999) Gaussian window: sy=sx=2.106 arcmin Parameters ---------- ppd : Sequence[Number, Number], Number, or None pixels per degree [vertical, horizontal] Returns ------- dict[str, Any] dict with the stimulus (key: "img") and additional keys containing stimulus parameters References ---------- Carney, T., Klein, S. A., Tyler, C. W., Silverstein, A. D., Beutter, B., Levi, D., ... & Eckstein, M. P. (1999). Development of an image/threshold database for designing and testing human vision models. Proceedings of SPIE, 3644, 542-551. https://doi.org/10.1117/12.348473 """ params = { "visual_size": VISUAL_SIZE, "ppd": ppd, "sigma": 2.106 / 60, "intensity_max": 1, "origin": "center", } stim = gaussians.gaussian(**params) stim["img"] = stim["img"] / 2 + 0.5 v = 109 experimental_data = { "participants": participants, "thresholds1": df[v], "thresholds2": df[v + 1], "thresholds3": df[v + 2], "thresholds4": df[v + 3], } return {**stim, "experimental_data": experimental_data}
[docs]def Gaussians29(ppd=PPD): """Gaussians29, Carney et al (1999) Gaussian window: sy=sx=1.05 arcmin Parameters ---------- ppd : Sequence[Number, Number], Number, or None pixels per degree [vertical, horizontal] Returns ------- dict[str, Any] dict with the stimulus (key: "img") and additional keys containing stimulus parameters References ---------- Carney, T., Klein, S. A., Tyler, C. W., Silverstein, A. D., Beutter, B., Levi, D., ... & Eckstein, M. P. (1999). Development of an image/threshold database for designing and testing human vision models. Proceedings of SPIE, 3644, 542-551. https://doi.org/10.1117/12.348473 """ params = { "visual_size": VISUAL_SIZE, "ppd": ppd, "sigma": 1.05 / 60, "intensity_max": 1, "origin": "center", } stim = gaussians.gaussian(**params) stim["img"] = stim["img"] / 2 + 0.5 v = 113 experimental_data = { "participants": participants, "thresholds1": df[v], "thresholds2": df[v + 1], "thresholds3": df[v + 2], "thresholds4": df[v + 3], } return {**stim, "experimental_data": experimental_data}
[docs]def Edge30(ppd=PPD): """Edge30, Carney et al (1999) Gaussian window: sy=sx=0.5 deg Parameters ---------- ppd : Sequence[Number, Number], Number, or None pixels per degree [vertical, horizontal] Returns ------- dict[str, Any] dict with the stimulus (key: "img") and additional keys containing stimulus parameters References ---------- Carney, T., Klein, S. A., Tyler, C. W., Silverstein, A. D., Beutter, B., Levi, D., ... & Eckstein, M. P. (1999). Development of an image/threshold database for designing and testing human vision models. Proceedings of SPIE, 3644, 542-551. https://doi.org/10.1117/12.348473 """ stim = gaussian_edge(visual_size=VISUAL_SIZE, ppd=ppd, rotation=-90, sigma=0.5) v = 117 experimental_data = { "participants": participants, "thresholds1": df[v], "thresholds2": df[v + 1], "thresholds3": df[v + 2], "thresholds4": df[v + 3], } return {**stim, "experimental_data": experimental_data}
[docs]def Line31(ppd=PPD): """Line31: line x Gaussian, Carney et al (1999) Line width: 0.5 arcmin Gaussian window: sy=sx=0.5 deg Parameters ---------- ppd : Sequence[Number, Number], Number, or None pixels per degree [vertical, horizontal] Returns ------- dict[str, Any] dict with the stimulus (key: "img") and additional keys containing stimulus parameters References ---------- Carney, T., Klein, S. A., Tyler, C. W., Silverstein, A. D., Beutter, B., Levi, D., ... & Eckstein, M. P. (1999). Development of an image/threshold database for designing and testing human vision models. Proceedings of SPIE, 3644, 542-551. https://doi.org/10.1117/12.348473 """ stim = lines.line( visual_size=VISUAL_SIZE, ppd=ppd, line_length=VISUAL_SIZE.width, line_width=resolution.visual_angle_from_length_ppd(length=0.5, ppd=PPD2), rotation=90, intensity_background=0.5, ) window = gaussians.gaussian(visual_size=VISUAL_SIZE, ppd=ppd, sigma=0.5) img = (stim["img"] - 0.5) * window["img"] + 0.5 stim["img"] = img stim["sigma"] = window["sigma"] v = 121 experimental_data = { "participants": participants, "thresholds1": df[v], "thresholds2": df[v + 1], "thresholds3": df[v + 2], "thresholds4": df[v + 3], } return {**stim, "experimental_data": experimental_data}
[docs]def Dipole32(ppd=PPD): """Dipole32: lines x Gaussian, Carney et al (1999) Line width: 3 px = Separation: 1 px = Gaussian window: sy=sx=0.5 deg Parameters ---------- ppd : Sequence[Number, Number], Number, or None pixels per degree [vertical, horizontal] Returns ------- dict[str, Any] dict with the stimulus (key: "img") and additional keys containing stimulus parameters References ---------- Carney, T., Klein, S. A., Tyler, C. W., Silverstein, A. D., Beutter, B., Levi, D., ... & Eckstein, M. P. (1999). Development of an image/threshold database for designing and testing human vision models. Proceedings of SPIE, 3644, 542-551. https://doi.org/10.1117/12.348473 """ stim = lines.dipole( visual_size=VISUAL_SIZE, ppd=ppd, line_length=VISUAL_SIZE.width, line_width=resolution.visual_angle_from_length_ppd(length=1, ppd=PPD), line_gap=resolution.visual_angle_from_length_ppd(length=2, ppd=PPD), rotation=270, ) stim = roll_dict(stim, -1, axes=0) window = gaussians.gaussian(visual_size=VISUAL_SIZE, ppd=ppd, sigma=0.5) img = (stim["img"] - 0.5) * window["img"] + 0.5 stim["img"] = img stim["sigma"] = window["sigma"] v = 125 experimental_data = { "participants": participants, "thresholds1": df[v], "thresholds2": df[v + 1], "thresholds3": df[v + 2], "thresholds4": df[v + 3], } return {**stim, "experimental_data": experimental_data}
[docs]def GaborString33(ppd=PPD): """GaborString33 - 5 collinear in-phase Gabors, Carney et al (1999) Frequency: 8 cpd Gaussian window of individual Gabors: sx=sy=0.07 deg (~1octave) Separation: 5sx Parameters ---------- ppd : Sequence[Number, Number], Number, or None pixels per degree [vertical, horizontal] Returns ------- dict[str, Any] dict with the stimulus (key: "img") and additional keys containing stimulus parameters References ---------- Carney, T., Klein, S. A., Tyler, C. W., Silverstein, A. D., Beutter, B., Levi, D., ... & Eckstein, M. P. (1999). Development of an image/threshold database for designing and testing human vision models. Proceedings of SPIE, 3644, 542-551. https://doi.org/10.1117/12.348473 """ params = { "visual_size": VISUAL_SIZE.width / 6, "ppd": ppd, "frequency": 8, "sigma": 0.07, "rotation": -90, "phase_shift": 90, "origin": "center", } stim = gabor(**params) # Stack collinear Gabors horizontally and pad stimc = stack_dicts(stim, stim) stimc = stack_dicts(stimc, stimc) stimc = stack_dicts(stimc, stim) stimc = pad_dict_to_shape(stimc, (256, 256), pad_value=0.5) stim["img"] = stimc["img"] stim["grating_mask"] = stimc["grating_mask"] stim["visual_size"] = stimc["visual_size"] stim["shape"] = stimc["shape"] stim = roll_dict(stim, (-1, -1), axes=(0, 1)) v = 129 experimental_data = { "participants": participants, "thresholds1": df[v], "thresholds2": df[v + 1], "thresholds3": df[v + 2], "thresholds4": df[v + 3], } return {**stim, "experimental_data": experimental_data}
[docs]def GaborString34(ppd=PPD): """GaborString33 - 5 collinear out-of-phase Gabors, Carney et al (1999) Frequency: 8 cpd Gaussian window of individual Gabors: sx=sy= deg (~1octave) Separation: 5sx Parameters ---------- ppd : Sequence[Number, Number], Number, or None pixels per degree [vertical, horizontal] Returns ------- dict[str, Any] dict with the stimulus (key: "img") and additional keys containing stimulus parameters References ---------- Carney, T., Klein, S. A., Tyler, C. W., Silverstein, A. D., Beutter, B., Levi, D., ... & Eckstein, M. P. (1999). Development of an image/threshold database for designing and testing human vision models. Proceedings of SPIE, 3644, 542-551. https://doi.org/10.1117/12.348473 """ params = { "visual_size": VISUAL_SIZE.width / 6, "ppd": ppd, "frequency": 8, "sigma": 0.07, "rotation": -90, "origin": "center", } stim1 = gabor(**params, phase_shift=-90) stim2 = gabor(**params, phase_shift=90) # Stack collinear Gabors horizontally and pad stimc = stack_dicts(stim2, stim1) stimc = stack_dicts(stimc, stim2) stimc = stack_dicts(stimc, stim1) stimc = stack_dicts(stimc, stim2) stimc = pad_dict_to_shape(stimc, (256, 256), pad_value=0.5) stim1["img"] = stimc["img"] stim1["grating_mask"] = stimc["grating_mask"] stim1["visual_size"] = stimc["visual_size"] stim1["shape"] = stimc["shape"] stim1["phase_shift2"] = stim2["phase_shift"] stim1 = roll_dict(stim1, (-1, -1), axes=(0, 1)) v = 133 experimental_data = { "participants": participants, "thresholds1": df[v], "thresholds2": df[v + 1], "thresholds3": df[v + 2], "thresholds4": df[v + 3], } return {**stim1, "experimental_data": experimental_data}
def Noise35_random(ppd=PPD): """Noise35 - binary noise x Gaussian, Carney et al (1999) Gaussian window: sy=sx=0.5 deg Parameters ---------- ppd : Sequence[Number, Number], Number, or None pixels per degree [vertical, horizontal] Returns ------- dict[str, Any] dict with the stimulus (key: "img") and additional keys containing stimulus parameters References ---------- Carney, T., Klein, S. A., Tyler, C. W., Silverstein, A. D., Beutter, B., Levi, D., ... & Eckstein, M. P. (1999). Development of an image/threshold database for designing and testing human vision models. Proceedings of SPIE, 3644, 542-551. https://doi.org/10.1117/12.348473 """ stim = binary_noise(visual_size=VISUAL_SIZE, ppd=ppd / 2, rms_contrast=1) stim = resize_dict(stim, (2, 2)) window = gaussians.gaussian(visual_size=VISUAL_SIZE, ppd=ppd, sigma=0.5) img = stim["img"] * window["img"] stim["img"] = img / 2 + 0.5 stim["mask"] = np.zeros(img.shape).astype(int) return stim
[docs]def Noise35(ppd=PPD): """Noise35 - binary noise x Gaussian, Carney et al (1999) Gaussian window: sy=sx=0.5 deg Parameters ---------- ppd : Sequence[Number, Number], Number, or None pixels per degree [vertical, horizontal] Returns ------- dict[str, Any] dict with the stimulus (key: "img") and additional keys containing stimulus parameters References ---------- Carney, T., Klein, S. A., Tyler, C. W., Silverstein, A. D., Beutter, B., Levi, D., ... & Eckstein, M. P. (1999). Development of an image/threshold database for designing and testing human vision models. Proceedings of SPIE, 3644, 542-551. https://doi.org/10.1117/12.348473 """ # Read natural image from Modelfest img = read_tif(Path(__file__).parents[0] / "modelfest_noise.tif") img = img / 255 stim = { "img": img, "visual_size": VISUAL_SIZE, "shape": img.shape, "ppd": PPD, "intensity_range": (img.min(), img.max()), } v = 169 experimental_data = { "participants": participants, "thresholds1": df[v], "thresholds2": df[v + 1], "thresholds3": df[v + 2], "thresholds4": df[v + 3], } mask = np.zeros(img.shape).astype(int) return {**stim, "mask": mask, "experimental_data": experimental_data}
[docs]def Orientation36(ppd=PPD): """Orientation36 - oriented Gabor, Carney et al (1999) Frequency: 4 cpd Rotation: 45 deg Gaussian window: sx=sy=0.14 deg (~1octave) Parameters ---------- ppd : Sequence[Number, Number], Number, or None pixels per degree [vertical, horizontal] Returns ------- dict[str, Any] dict with the stimulus (key: "img") and additional keys containing stimulus parameters References ---------- Carney, T., Klein, S. A., Tyler, C. W., Silverstein, A. D., Beutter, B., Levi, D., ... & Eckstein, M. P. (1999). Development of an image/threshold database for designing and testing human vision models. Proceedings of SPIE, 3644, 542-551. https://doi.org/10.1117/12.348473 """ params = { "visual_size": VISUAL_SIZE, "ppd": ppd, "frequency": 4, "sigma": 0.14, "rotation": -45, "phase_shift": 90, "origin": "center", } stim = gabor(**params) v = 141 experimental_data = { "participants": participants, "thresholds1": df[v], "thresholds2": df[v + 1], "thresholds3": df[v + 2], "thresholds4": df[v + 3], } return {**stim, "experimental_data": experimental_data}
[docs]def Orientation37(ppd=PPD): """Orientation37 - oriented Gabor, Carney et al (1999) Frequency: 4 cpd Rotation: 0 deg Gaussian window: sx=sy=0.14 deg (~1octave) Parameters ---------- ppd : Sequence[Number, Number], Number, or None pixels per degree [vertical, horizontal] Returns ------- dict[str, Any] dict with the stimulus (key: "img") and additional keys containing stimulus parameters References ---------- Carney, T., Klein, S. A., Tyler, C. W., Silverstein, A. D., Beutter, B., Levi, D., ... & Eckstein, M. P. (1999). Development of an image/threshold database for designing and testing human vision models. Proceedings of SPIE, 3644, 542-551. https://doi.org/10.1117/12.348473 """ params = { "visual_size": VISUAL_SIZE, "ppd": ppd, "frequency": 4, "sigma": 0.14, "rotation": 0, "phase_shift": 90, "origin": "center", } stim = gabor(**params) v = 145 experimental_data = { "participants": participants, "thresholds1": df[v], "thresholds2": df[v + 1], "thresholds3": df[v + 2], "thresholds4": df[v + 3], } return {**stim, "experimental_data": experimental_data}
[docs]def Plaids38(ppd=PPD): """Plaids38 - compound Gabors, Carney et al (1999) Frequency: 4 cpd Rotation: 0 & 90 deg Gaussian window: sx=sy=0.14 deg (~1octave) Parameters ---------- ppd : Sequence[Number, Number], Number, or None pixels per degree [vertical, horizontal] Returns ------- dict[str, Any] dict with the stimulus (key: "img") and additional keys containing stimulus parameters References ---------- Carney, T., Klein, S. A., Tyler, C. W., Silverstein, A. D., Beutter, B., Levi, D., ... & Eckstein, M. P. (1999). Development of an image/threshold database for designing and testing human vision models. Proceedings of SPIE, 3644, 542-551. https://doi.org/10.1117/12.348473 """ params = { "visual_size": VISUAL_SIZE, "ppd": ppd, "frequency": 4, "sigma": 0.14, "phase_shift": 90, "origin": "center", "round_phase_width": False, } stim = plaid( gabor_parameters1={**params, "rotation": 0}, gabor_parameters2={**params, "rotation": -90}, ) v = 149 experimental_data = { "participants": participants, "thresholds1": df[v], "thresholds2": df[v + 1], "thresholds3": df[v + 2], "thresholds4": df[v + 3], } return {**stim, "experimental_data": experimental_data}
[docs]def Plaids39(ppd=PPD): """Plaids39 - compound Gabors, Carney et al (1999) Frequency: 4 cpd Rotation: 45 & 90 deg Gaussian window: sx=sy=0.14 deg (~1octave) Parameters ---------- ppd : Sequence[Number, Number], Number, or None pixels per degree [vertical, horizontal] Returns ------- dict[str, Any] dict with the stimulus (key: "img") and additional keys containing stimulus parameters References ---------- Carney, T., Klein, S. A., Tyler, C. W., Silverstein, A. D., Beutter, B., Levi, D., ... & Eckstein, M. P. (1999). Development of an image/threshold database for designing and testing human vision models. Proceedings of SPIE, 3644, 542-551. https://doi.org/10.1117/12.348473 """ params = { "visual_size": VISUAL_SIZE, "ppd": ppd, "frequency": 4, "sigma": 0.14, "phase_shift": 90, "origin": "center", } stim = plaid( gabor_parameters1={**params, "rotation": -45}, gabor_parameters2={**params, "rotation": -90}, ) v = 153 experimental_data = { "participants": participants, "thresholds1": df[v], "thresholds2": df[v + 1], "thresholds3": df[v + 2], "thresholds4": df[v + 3], } return {**stim, "experimental_data": experimental_data}
[docs]def Disk40(ppd=PPD): """Disk40 - Carney et al (1999) Diameter: 0.25 deg Parameters ---------- ppd : Sequence[Number, Number], Number, or None pixels per degree [vertical, horizontal] Returns ------- dict[str, Any] dict with the stimulus (key: "img") and additional keys containing stimulus parameters References ---------- Carney, T., Klein, S. A., Tyler, C. W., Silverstein, A. D., Beutter, B., Levi, D., ... & Eckstein, M. P. (1999). Development of an image/threshold database for designing and testing human vision models. Proceedings of SPIE, 3644, 542-551. https://doi.org/10.1117/12.348473 """ stim = shapes.disc( visual_size=VISUAL_SIZE, ppd=ppd, radius=0.1249, origin="center", intensity_background=0.5 ) stim = roll_dict(stim, (-2, -2), axes=(0, 1)) v = 157 experimental_data = { "participants": participants, "thresholds1": df[v], "thresholds2": df[v + 1], "thresholds3": df[v + 2], "thresholds4": df[v + 3], } return {**stim, "experimental_data": experimental_data}
[docs]def Bessel41(ppd=PPD): """Bessel41 - Bessel x Gaussian, Carney et al (1999) Frequency: 4cpd Gaussian window: sy=sx=0.5 deg Parameters ---------- ppd : Sequence[Number, Number], Number, or None pixels per degree [vertical, horizontal] Returns ------- dict[str, Any] dict with the stimulus (key: "img") and additional keys containing stimulus parameters References ---------- Carney, T., Klein, S. A., Tyler, C. W., Silverstein, A. D., Beutter, B., Levi, D., ... & Eckstein, M. P. (1999). Development of an image/threshold database for designing and testing human vision models. Proceedings of SPIE, 3644, 542-551. https://doi.org/10.1117/12.348473 """ stim = bessel(visual_size=VISUAL_SIZE, ppd=ppd, frequency=4, origin="center") window = gaussians.gaussian(visual_size=VISUAL_SIZE, ppd=ppd, sigma=0.5) stim["sigma"] = window["sigma"] # Apply Gaussian windows to Bessel stim["img"] = (stim["img"] - stim["img"].mean()) * window["img"] # Set "background" intensity to 0.5 and make sure that max intensity = 1 stim["img"] = stim["img"] / stim["img"].max() / 2 + 0.5 v = 161 experimental_data = { "participants": participants, "thresholds1": df[v], "thresholds2": df[v + 1], "thresholds3": df[v + 2], "thresholds4": df[v + 3], } return {**stim, "experimental_data": experimental_data}
[docs]def Checkerboard42(ppd=PPD): """Checkerboard42 - Checkerboard x Gaussian, Carney et al (1999) Frequency: 4cpd fundamental Gaussian window: sy=sx=0.5 deg Parameters ---------- ppd : Sequence[Number, Number], Number, or None pixels per degree [vertical, horizontal] Returns ------- dict[str, Any] dict with the stimulus (key: "img") and additional keys containing stimulus parameters References ---------- Carney, T., Klein, S. A., Tyler, C. W., Silverstein, A. D., Beutter, B., Levi, D., ... & Eckstein, M. P. (1999). Development of an image/threshold database for designing and testing human vision models. Proceedings of SPIE, 3644, 542-551. https://doi.org/10.1117/12.348473 """ params = { "visual_size": VISUAL_SIZE, "ppd": ppd, "frequency": 2.81, "rotation": -45, "round_phase_width": False, "intensity_checks": (1.0, 0.0), } stim = checkerboards.checkerboard(**params) window = gaussians.gaussian(visual_size=VISUAL_SIZE, ppd=ppd, sigma=0.5) img = (stim["img"] - 0.5) * window["img"] + 0.5 stim["img"] = img stim["sigma"] = window["sigma"] v = 165 experimental_data = { "participants": participants, "thresholds1": df[v], "thresholds2": df[v + 1], "thresholds3": df[v + 2], "thresholds4": df[v + 3], } return {**stim, "experimental_data": experimental_data}
[docs]def NaturalScene43(ppd=PPD): """NaturalScene43 - Natural image x Gaussian, Carney et al (1999) Gaussian window: sy=sx=0.5 deg Parameters ---------- ppd : Sequence[Number, Number], Number, or None pixels per degree [vertical, horizontal] Returns ------- dict[str, Any] dict with the stimulus (key: "img") and additional keys containing stimulus parameters References ---------- Carney, T., Klein, S. A., Tyler, C. W., Silverstein, A. D., Beutter, B., Levi, D., ... & Eckstein, M. P. (1999). Development of an image/threshold database for designing and testing human vision models. Proceedings of SPIE, 3644, 542-551. https://doi.org/10.1117/12.348473 """ # Read natural image from Modelfest img = read_tif(Path(__file__).parents[0] / "modelfest_natural_scene.tif") img /= 255 stim = { "img": img, "visual_size": VISUAL_SIZE, "shape": img.shape, "ppd": PPD, "intensity_range": (img.min(), img.max()), } v = 169 experimental_data = { "participants": participants, "thresholds1": df[v], "thresholds2": df[v + 1], "thresholds3": df[v + 2], "thresholds4": df[v + 3], } mask = np.zeros(img.shape).astype(int) return {**stim, "mask": mask, "experimental_data": experimental_data}
def read_tif(filename): from PIL import Image img = np.array(Image.open(filename)).astype(float) return img if __name__ == "__main__": from stimupy.utils import plot_stimuli stims = gen_all(skip=True) plot_stimuli(stims, mask=False, units="visual_size")