http://benallal.free.fr/ti/pdf/IFT2730_10_2003.pdf
L' interpolation bilinéaire y est clairement expliquée, c' est la formulation la plus lisible que j' ai pu trouver.
Concretement, elle permet de calculer la valeur d' un pixel dans un rectangle en fonction de la valeur des pixels des quatre sommets de ce rectangle.
voici la formulation, recopiée :
Soit un rectangle dont le sommet supérieur gauche à pour coordonnée x,y =0,0
le sommet inférieur droit à pour coordonnées x,y=1,1
le point de coordonée x,y aura pour valeur:
f(x,0) = f(0,0)+x[f(1,0)-f(0,0)]
f(x,1) = f(0,1)+x[f(1,1)-f(0,1)]
f(x,y) = f(x,0) + y[f(x,1) - f(x,0)]
On appliquera cette fonction a chacune des composantes RVB du point
Implémentation pour Gonta:
Le sommet supérieur gauche à pour coordonnée xa,ya =0,0
Le le sommet inférieur droit à pour coordonnées xb=xs-1 et yb=ys-1 ( la taille de notre image ou selection.
Il faut prendre soin de ramener la distance xa->xb dans un espace de 0 à 1 et de positionner le pixel dans cette espace
Idem pour ya->yb
j' utilise 2 variables temporaires TX et TY
Elles représentent x et y dans un espace de 0 à 1
TX=x/xs;
TY=y/ys;
La formule ci dessus devient:
f(x,0) = f(0,0)+x[f(1,0)-f(0,0)] =>V1=R(xa,ya)+(R(xb,ya)-R(xa,ya))*TX;
f(x,1) = f(0,1)+x[f(1,1)-f(0,1)] =>V2=R(xa,yb)+(R(xb,yb)- R(xa,yb))*TX;
f(x,y) = f(x,0) + y[f(x,1) - f(x,0)] =>R=V1+(V2-V1)*TY;
Idem pour Vert et Bleu.
Le script final :
Fenêtre gauche
- Code: Tout sélectionner
coord=0;
cx=0;cy=0;
xa=0;
ya=0;
xb=xs-1;
yb=ys-1;
Fenêtre droite:
- Code: Tout sélectionner
TX=x/xs;
TY=y/ys;
V1=R(xa,ya)+(R(xb,ya)-R(xa,ya))*TX;
V2=R(xa,yb)+(R(xb,yb)- R(xa,yb))*TX;
R=V1+(V2-V1)*TY;
V1=G(xa,ya)+(G(xb,ya)-G(xa,ya))*TX;
V2=G(xa,yb)+(G(xb,yb)- G(xa,yb))*TX;
G=V1+(V2-V1)*TY;
V1=B(xa,ya)+(B(xb,ya)-B(xa,ya))*TX;
V2=B(xa,yb)+(B(xb,yb)- B(xa,yb))*TX;
B=V1+(V2-V1)*TY;
Une fois le script sauvé dans Gonta , on ouvre une image, et avec un pinceaux moyen nous peignons les quatre coins de l' image avec des couleurs différentes
Puis application du script
Et l' on obtient la même chose que si l' on avait fait un remplissage avec un dégradé "carré" dont les coins sont identiques à ceux de notre image !!!
C' est quand même plus explicite que les équations mathématiques compliquées que je ne sais pas déchiffrer
Tout celà ne sert pas à grand chose. à ce stade juste une curiosité ....
De mémoire l' interpolation bicubique est celle que j' ai utilisée pour le script Nuages ...
En poussant un peu je vous propose un second script qui découpe l' image en carreaux . La teinte de chaque pixel étant calculée à l' aide de l' interpolation bilinéaire décrite plus haut, en fonction de la couleur des sommet de chaque carreaux.
Les réglages:
Nombre de carreaux en x
Nombre de carreaux en y
Superposition avec l' original
Largeur de l' espace entre les carreaux
Couleur du ciment entre les carreaux
note: la transparence n' est pas affectée par le script.
Fenêtre gauche
- Code: Tout sélectionner
coord=0;
cx=0;cy=0;
?TAX,Nombre X,1,100,2;
?TAY,Nombre Y,1,100,2;
?sup,Superposition,0,100,100;
?la,Largeur ciment,0,10,3;
?bc,Couleur ciment,0,255,128;
sup=sup/100;
sup2=1-sup;
TAX=(xs-1)/TAX;
TAY=(ys-1)/TAY;
Fenêtre droite:
- Code: Tout sélectionner
xa=x-(x%TAX);
ya=y-(y%TAY);
xb=xa+TAX;
yb=ya+TAY;
if((x%TAX)<la || (y%TAY)<la){
R=bc;
G=R;
B=R;
exit(0);
}
else{
TX=(x%TAX)/TAX;
TY=(y%TAY)/TAY;
V1=R(xa,ya)+(R(xb,ya)-R(xa,ya))*TX;
V2=R(xa,yb)+(R(xb,yb)- R(xa,yb))*TX;
R=V1+(V2-V1)*TY;
R=(R*sup)+(cr*sup2);
V1=G(xa,ya)+(G(xb,ya)-G(xa,ya))*TX;
V2=G(xa,yb)+(G(xb,yb)- G(xa,yb))*TX;
G=V1+(V2-V1)*TY;
G=(G*sup)+(cg*sup2);
V1=B(xa,ya)+(B(xb,ya)-B(xa,ya))*TX;
V2=B(xa,yb)+(B(xb,yb)- B(xa,yb))*TX;
B=V1+(V2-V1)*TY;
B=(B*sup)+(cb*sup2);
}
Je vous laisse tester ce script
@+ Eric