fraktales.net - PhotoProcessor

home> Algorithme
upscale2x L'objectif est d'obtenir une image quatre fois plus grande en doublant longueur et largeur.
Le pixel représenté en gris sera interpolé par les quatre représentés en noir.
diagonalpixel La première étape de l'algorithme consiste à réaliser une première interpolation.
Le but étant de déterminer la valeur du pixel central.
Sa valeur dépend du contraste dans la zone considérée ici 4 x 4 pixels.
La quantité de contrastes est elle aussi stockée.
On calcule un gradient sur chacune des deux diagonales.
Ce pixel ne sera pas présent dans l'image finale mais il servira de pivot pour produire les quatre pixels.
gradient4x4 On effectue la somme des différences absolues des intensités des pixels.
La différence est faite par groupe de deux pixels.
La somme de ces différentiels est la valeur du gradient sur la diagonale.
Le gradient est constituée des neuf différentiels.
Après observation le gradient produit des résultats parfois instables.
Il en résulte des effets indésirables sur le rendu de l'image produite.
gradient6x6 Intuitivement élargir la zone devrait permettre d'améliorer la stabilité du résultat.
Les brusques sauts de valeur avaient aussi pour origine que chaque différentiel avait le même poids.
Deux corrections ont été apportées dans le calcul.
Effectuer le calcul sur une zone de 6 x 6 pixels => 25 différentiels au lieu de 9.
Et l'association de pondération sur les différentiels.
Les neuf valeurs au centre représentent environ les 75% de la valeur globale.
Les poids sont issus du triangle de Pascal.
La répartition des valeurs est grossièrement une Gaussienne.
Et la somme des valeurs est égale, ici, à 256 (2^8) ce qui permet la division à base de shift.
first_step On effectue deux interpolations cubiques (une par diagonale).
On récupère la somme pondérée des deux gradients (une par diagonale).
Soient d1 et d2 les résultats des interpolations.
Soient u et v les sommes obtenues (u et v sont des valeurs positives).
La valeur du pivot est calculée comme suit :
w1 = 1 / 1 + u5
w2 = 1 / 1 + v5 (u ou v pouvant être nulle : ajouter 1 permet d'écarter le cas de la division par zéro)
Valeur du pivot = d1 * w1 / (w1 + w2) + d2 * w2 / (w1 + w2)
schema_final La seconde étape de l'algorithme produit les quatre pixels interpolés.
L'interpolation fait intervenir deux points d'origine et deux pivots.
Ces points étant alignés l'opération consiste à réaliser une interpolation cubique.
Le schéma illustre la création du point dans le coin haut gauche, le procédé est répété pour les trois autres points.
pattern_compare GIF alternant le rendu, l'un avec un gradient 4x4 et l'autre avec un gradient 6x6.
La fonction d'agrandissement est conçue pour les images de type photos.
Toutefois, cette image illustre bien les différences obtenues.
schema_3_1 Image d'origine.
schema_3_2 Interpolation bicubique.
schema_final Résultat obtenu avec mon algo.