Grilles de Hermann

Grilles simples

Cette illusion découverte par Hermann (1870) fait apparaître les blancs de la grille un peu gris. L'effet est accentué aux coins, là où les noirs sont plus denses dans le voisinage. En fixant une zone particulière l'illusion disparaît, la partie centrale de la rétine (fovéa) qui est alors sollicitée est moins sensible à l'environnement.
Dans la deuxième figure, la grille est inversée et le phénomène demeure, c'est le noir qui devient un peu gris.

hermann1.mp
u = 25;
 
path carre;
carre = ((-1,-1) -- (-1,1) -- (1,1) -- (1,-1) -- cycle)
        scaled (u-5); 
 
hermann1 (figure 1)
beginfig(1);
    for j:=1 upto 9:
        for h:=1 upto 6:
            fill carre shifted (2*j*u,2*h*u) 
                 withcolor black;
        endfor;
    endfor;
endfig;
 
hermann1 (figure 2)
beginfig(2);
    for h:=0 upto 6:
        draw (u,(2*h+1)*u) -- (19u,(2*h+1)*u) 
            withpen pensquare scaled 10
            withcolor black;
    endfor;
    for j:=0 upto 9:
        draw ((2*j+1)*u,u) -- ((2*j+1)*u,13u)
            withpen pensquare scaled 10
            withcolor black;
    endfor;
endfig;
 
end
 

Des points qui scintillent

La figure ci-dessous est une grille de Hermann inversée dont les bords ont été rendus flous (James Bergen). À l'intersection des lignes horizontales et verticales apparaissent des points qui scintillent...
La réalisation de cette image nécessite quelques ajustements, l'effet est sensible à la répartition des gris aux coins des carrés. Il faut ménager la plage sombre dans laquelle se forme l'illusion.

hermann2.mp
% Paramètres d'ajustement de l'image
u = 25;    % unité
v = 0.3;   % indice pour le décrochage du coin des carrés
w = 0.015; % indice pour la profondeur du coin
d = 0.1;   % indice pour le premier niveau de gris
e = 0.2;   % indice pour la variation des gris
n = 5;     % nombre de niveau de gris
 
def f(expr x) =
    x * ( 1 + 4 * e * ( 1 - x) )
enddef;
 
def cadre (expr a,b) =
    (-1+a,-1){dir 180} ... (-1+b,-1+b) ... {dir  90}(-1,-1+a) --
    (-1, 1-a){dir  90} ... (-1+b, 1-b) ... {dir   0}(-1+a, 1) --
    (1-a,  1){dir   0} ... (1-b , 1-b) ... {dir -90}(1 , 1-a) --
    (1, -1+a){dir -90} ... (1-b ,-1+b) ... {dir 180}(1-a, -1) --
    cycle
enddef;
 
picture carre;
carre := image(
            fill ((-1,-1)--(-1,1)--(1,1)--(1,-1)--cycle)
                 scaled u withcolor f(d/(n+d))*white;
            for i:=1 upto n:
                fill cadre(v,w*(5-(i-1)*4/(n-1))) scaled (u-i) 
                   withpen pensquare scaled 1pt
                   withcolor f((i+d)/(n+d))*white;
            endfor;
        );
 
hermann2 (figure 1)
beginfig(1);
    for j:=1 upto 9:
        for h:=1 upto 6:
            draw carre shifted (2*j*u,2*h*u); 
        endfor;
    endfor;    
    draw bbox(currentpicture) withcolor blue;
endfig;
 
end
 

Noir ou blanc

Les disques aux intersections des allées grises sont-ils noirs ou blancs?

hermann3.mp
u = 25;
 
path carre;
carre = ((-1,-1) -- (-1,1) -- (1,1) -- (1,-1) -- cycle)
        scaled (u-5); 
 
picture grille;
path cadre;
 
hermann3 (figure 1)
beginfig(1);
    grille = image (
                for j:=1 upto 9:
                    for h:=1 upto 6:
                        fill carre shifted (2*j*u,2*h*u) 
                             withcolor black;
                    endfor;
                endfor;
             );
    cadre  = bbox(grille);
    fill cadre withcolor .5white;
    draw grille;
    for j:=1 upto 8:
        for h:=1 upto 5:
            fill fullcircle scaled 10 shifted ((2*j+1)*u,(2*h+1)*u)
                            withcolor white;
        endfor;
    endfor;
    draw bbox(currentpicture) withcolor blue;
endfig;
 
end