mardi 6 avril 2010

Mise en abyme (didactiel 4/5)

La description mathématique de l'effet Droste est plus facile à faire quand l'image d'origine est constituée de zones couronnaires concentriques (d'où le choix de l'image de madnzany ). Dans ce cas, on peut simplement utiliser la classique fonction z ↦ ln(z) et sa réciproque z ↦ exp(z).
Dans le plan complexe en effet, l'image d'un cercle de rayon r centré sur l'origine par z ↦ ln(z/r) est un segment de droite vertical d'extrémités -iπ et +iπ et donc l'image d'une couronne délimitée par deux cercles de rayons r<R centrés sur l'origine est un rectangle de largeur ln(R/r). Cela suppose cependant qu'on a choisi la détermination principale des angles comprise entre -π et +π.
L'effet Droste n'est alors qu'une application possible de la propriété suivante : l'image par la fonction z ↦ exp(z) d'un segment de droite oblique est une portion de spirale logarithmique. L'image par cette fonction d'un rectangle incliné est donc une zone délimitée par 4 portions de spirales logarithmiques et un algorithme de mise en abyme sur une image n'a pour rôle que de gérer les continuités entre ces zones.
En résumé, l'image ln(z/r) d'un pixel z de l'image doit d'abord être recopiée dans tous les rectangles du plan complexe de manière à obtenir une série infinie de rectangles semblables c'est-à-dire de manière à conserver les positions relatives du pixel concerné vis à vis des 4 sommets du rectangle concerné (il suffit de recopier ln(z/r) tous les ln(R/r) sur la composante réelle en conservant sa composante imaginaire grâce à la périodicité des fonctions mises en jeu). Ensuite, le plan complexe est incliné d'un angle à déterminer. Enfin, on obtient l'image (au sens graphique) modifiée en prenant l'image (au sens analytique) par la fonction z ↦ exp(z) du plan complexe incliné (à une nuance près : un coefficient multiplicateur à déterminer doit être préalablement appliqué pour rester cohérent avec le choix de la détermination principale.)
La valeur de l'angle α à déterminer est conditionnée par un critère de continuité : la diagonale d'un rectangle incliné doit devenir verticale après inclinaison pour que les extrémités de cette diagonale ait la meme composante réelle (continuité des rayons). On montre que α vérifie tan α= ln(R/r)/(2π).
La valeur du coefficient k à déterminer est telle que la diagonale d'un rectangle soit égale à 2π (la diagonale devient une hauteur après inclinaison). On montre que k=cos(α).
L'algorithme procède à reculons en cherchant la couleur d'un pixel étant donnée sa position finale : étant donné un pixel z de l'image modifiée, on commence par se ramener au plan complexe incliné par la réciproque de z ↦ exp(z) c'est-à-dire par z ↦ ln(z). Puis on divise par k pour retrouver la taille du rectangle incliné originel. On ramène ce rectangle dans la position où ses cotés sont verticaux et horizontaux par rotation d'un angle -α. Puis on retrouve le rectangle qui lui a servi de modèle et on peut enfin retrouver la position du pixel de l'image d'origine (donc sa couleur) par application de la réciproque de z ↦ ln(z/r) à savoir z ↦ r exp(z) :

function [imdroste,mapdroste]=droste(im,map,r,R,cx,cy)
[dimy, dimx] = size(im);
width=log(R/r);
tana=width/(2*pi);
cosa=sqrt(1/(1+tana^2));
sina=cosa*tana;
imdroste=im;
mapdroste=zeros(dimx*dimy,3);

for x=1:dimx
for y=1:dimy
zr=distance2(0,0,x-cx,y-cy);
za=atan2(y-cy,x-cx);

z1x=log(zr);
z1y=za;

z1y/=cosa;

z2x=cosa*z1x+sina*z1y;
z2y=cosa*z1y-sina*z1x;

n=floor(abs(z2x)/width);
if z2x<0, z2x+=n*width; else z2x-=n*width; end

X=r*exp(z2x)*cos(z2y)+cx;
Y=r*exp(z2x)*sin(z2y)+cy;

if X>0 && X<=dimx && Y>0 && Y<=dimy
idx=dimy*(x-1)+y;
[i,j]=tweak(floor(X),floor(Y),X,Y,1,1);
if i>dimx-2, i=dimx-2;end
if j>dimy-2, j=dimy-2;end
if i<1, i=1;end
if j<1, j=1;end
if distance2(X,Y,i,(j+1)) < distance2(X,Y,(i+1),j)
[i0,i1,i2] = three([i,i+1,i]);
[j0,j1,j2] = three([j,j+1,j+1]);
else
[i0,i1,i2] = three([i,i+1,i+1]);
[j0,j1,j2] = three([j,j,j+1]);
end
v0=map(dimy*i0+j0+1,:);
v1=map(dimy*i1+j1+1,:);
v2=map(dimy*i2+j2+1,:);
s=[surface(X,Y,i1,j1,i2,j2),surface(i0,j0,X,Y,i2,j2),surface(i0,j0,i1,j1,X,Y)];
mapdroste(idx,:) = (s(1)*v0+s(2)*v1+s(3)*v2)/sum(s);
end
end
end

Une fois que la position X+iY du pixel de l'image d'origine à été trouvée, la détermination de la couleur se passe de la meme manière que pour la régularisation de l'image c'est-à-dire par interpolation.

Voici ce que produit cette évaluation :

cx=249;cy=183;
R=65;r=32;
[imcrop,mapcrop]=crop(im,map,cx-R,cx+R,cy-R,cy+R);# !! : le centre n'est plus cx+icy [imdroste,mapdroste]=droste(imcrop,mapcrop,r,R,R,R);



et voici ce qu'il faut calculer pour générer plus de régularité (ici 4x4 soit 16 fois plus long) :

cx=249;cy=183;
R=65;r=32;
[imcrop,mapcrop]=crop(im,map,cx-R,cx+R,cy-R,cy+R);
coefreg=4;
[imreg,mapreg]=regularize2(imcrop,mapcrop,coefreg,coefreg);
[imdroste,mapdroste]=droste(imreg,mapreg,coefreg*r,coefreg*R,coefreg*R,coefreg*R);

Aucun commentaire:

Enregistrer un commentaire