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; endX=r*exp(z2x)*cos(z2y)+cx;
Y=r*exp(z2x)*sin(z2y)+cy;
if X
>
0 && X<
=dimx && Y>
0 && Y<
=dimyidx=dimy*(x-1)+y;
[i,j]=tweak(floor(X),floor(Y),X,Y,1,1);
if i
>
dimx-2, i=dimx-2;endif j
>
dimy-2, j=dimy-2;endif i
<
1, i=1;endif j
<
1, j=1;endif 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