Motion Clouds: Synthesis of random textures for motion perception (Leon et al. 2012)

 Download zip file 
Help downloading and running models
Accession:146953
We describe a framework to generate random texture movies with controlled information content. In particular, these stimuli can be made closer to naturalistic textures compared to usual stimuli such as gratings and random-dot kinetograms. We simplified the definition to parametrically define these "Motion Clouds" around the most prevalent feature axis (mean and bandwith): direction, spatial frequency, orientation.
Reference:
1 . Leon PS, Vanzetta I, Masson GS, Perrinet LU (2012) Motion clouds: model-based stimulus synthesis of natural-like random textures for the study of motion perception. J Neurophysiol 107:3217-26 [PubMed]
Model Information (Click on a link to find other models with that property)
Model Type: Connectionist Network;
Brain Region(s)/Organism:
Cell Type(s):
Channel(s):
Gap Junctions:
Receptor(s):
Gene(s):
Transmitter(s):
Simulation Environment: Python;
Model Concept(s): Pattern Recognition; Temporal Pattern Generation; Spatio-temporal Activity Patterns; Parameter Fitting; Methods; Perceptual Categories; Noise Sensitivity; Envelope synthesis; Sensory processing; Motion Detection;
Implementer(s):
#!/usr/bin/env python
"""

Superposition of MotionClouds to generate competing motions.

(c) Laurent Perrinet - INT/CNRS

"""
import numpy
import MotionClouds as mc
fx, fy, ft = mc.get_grids(mc.N_X, mc.N_Y, mc.N_frame)

name = 'competing'
name_ = mc.figpath + name
if mc.anim_exist(name_):
    z = (.5*mc.envelope_gabor(fx, fy, ft, sf_0=0.2, V_X=-1.5)
         + .1*mc.envelope_gabor(fx, fy, ft, sf_0=0.4, V_X=.5)#, theta=numpy.pi/2.)
        )
    mc.figures(z, name_)

name = 'two_bands'
name_ = mc.figpath + name
if mc.anim_exist(name_):
    # and now selecting blobs:
    # one band
    one = mc.envelope_gabor(fx, fy, ft, B_theta=10.)
    # a second band
    two = mc.envelope_gabor(fx, fy, ft, sf_0=.9, B_theta=10.)

    mc.figures(one + two, name_)

# explore parameters
for sf_0 in [0.0, 0.1 , 0.2, 0.3, 0.8, 0.9]:
    name_ = mc.figpath + name + '-sf_0' + str(sf_0).replace('.', '_')
    if mc.anim_exist(name_):
        one = mc.envelope_gabor(fx, fy, ft, B_theta=10.)
        two = mc.envelope_gabor(fx, fy, ft, sf_0=sf_0, B_theta=10.)
        mc.figures(one + two, name_)


name = 'counterphase_grating'
name_ = mc.figpath + name
if mc.anim_exist(name_):
    right = mc.envelope_speed(fx, fy, ft, V_X=.5 )
    left = mc.envelope_speed(fx, fy, ft, V_X=-.5 )
    grating = mc.envelope_gabor(fx, fy, ft)
    z = grating * (left + right ) # thanks to the addititivity of MCs 
    mc.figures(z, name_)

name = 'plaid'
name_ = mc.figpath + name
if mc.anim_exist(name):
    color = mc.envelope_color(fx, fy, ft)
    diag1 = mc.envelope_gabor(fx, fy, ft, theta=numpy.pi/4.)
    diag2 = mc.envelope_gabor(fx, fy, ft, theta=-numpy.pi/4.)
    z = color *(diag1 + diag2)
    mc.figures(z, name_)

# explore parameters
for V_X in [0., 0.5, 1.]:
    name_ = mc.figpath + name + '-V_X' + str(V_X).replace('.', '_')
    if mc.anim_exist(name_):
        diag = mc.envelope_gabor(fx, fy, ft, V_X=V_X)
        z = color *(diag + diag2)
        mc.figures(z, name_)

for V_Y in [0., 0.5, 1.]:
    name_ = mc.figpath + name + '-V_Y' + str(V_Y).replace('.', '_')
    if mc.anim_exist(name_):
        diag = mc.envelope_gabor(fx, fy, ft, V_Y=V_Y)
        z = color *(diag + diag2)
        mc.figures(z, name_)

for div in [1, 2, 3, 5, 8, 13 ]:
    name_ = mc.figpath + name + '-theta=pi-over-' + str(div).replace('.', '_')
    if mc.anim_exist(name_):
        z = color *(mc.envelope_gabor(fx, fy, ft, theta=numpy.pi/div) + mc.envelope_gabor(fx, fy, ft, theta=-numpy.pi/div))
        mc.figures(z, name_)

Loading data, please wait...