diff --git a/SAFT/algo.py b/SAFT/algo.py new file mode 100644 index 0000000..a5b5443 --- /dev/null +++ b/SAFT/algo.py @@ -0,0 +1,40 @@ +import numpy as np +from math import sqrt, pow + +def saft_algorithm(image, h, wid, hig, win, A, B): + """ + Implémentation de l'algorithme SAFT pour corriger les images. + + :param image: np.array, l'image à traiter sous forme de tableau 2D numpy. + :param h: int, hauteur des données sum_prod. + :param wid: int, largeur de l'image. + :param hig: int, hauteur de l'image. + :param win: int, taille de la fenêtre de moyenne. + :param A: float, coefficient de correction. + :param B: float, coefficient de correction. + :return: np.array, l'image corrigée. + """ + # Initialisation du vecteur sum_prod + sum_prod = np.zeros(h, dtype=np.int32) + k = win // 2 + + # Parcourir les colonnes principales + for j in range(k, wid - k): + # Parcourir les lignes adjacentes à la colonne en cours + for j1 in range(j - k, j + k): + distx = abs(j - j1) + + # Parcourir les lignes de pixels + for i1 in range(hig): + dif_f = sqrt(pow(i1 * A, 2) + pow(distx * B, 2)) - (i1 * A) + dif_i = int(dif_f / A) + + if 0 <= i1 - dif_i < hig: + sum_prod[i1] = (image[j1, i1 - dif_i] - 128 * (image[j, i1] - 128) + sum_prod[i1]) + + # Normalisation des résultats et mise à jour de l'image + for ix in range(hig): + sum_prod[ix] = int(sum_prod[ix] / win) + image[j, ix] = np.clip(sum_prod[ix] + 128, 0, 255).astype(np.uint8) + + return image