Curiosité: l' interpolation ...

Où on parle des différentes versions de Pixia, de script Gonta...

Modérateur: gg

Curiosité: l' interpolation ...

Messagede Eric le Jeu Sep 18, 2008 21:13

En cherchant comment à comprendre le fonctionnement d' une fonction (iget) de FilterMeister utilisant une interpolation bilinéaire je suis tombé la dessus:
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
Avatar de l’utilisateur
Eric
 
Messages: 761
Inscription: Ven Aoû 25, 2006 10:49
Localisation: France (80)

Retourner vers Développement de Pixia

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité

cron