Bonjour,
J'essaye de m'intéresser à l'amélioration de la qualité d'image. Je souhaiterais augmenter la résolution / qualité d'une image en utilisant la méthode d'interpolation de Lanczos pour une image en 2D.
Seulement, lorsque j'exécute mon programme, mon image n'est pas de meilleure qualité. Elle est plus petite ?, je ne comprends pas pourquoi.
Pour la partie théorie, j'ai utilisé :
-https://en.wikipedia.org/wiki/Lanczos_resampling
-https://stackoverflow.com/questions/...rpolation-in-c
-https://www.youtube.com/watch?v=ijmd6XyG2HA
L'image initiale ( sentinel2.jpg) et l'image après traitement (Figure 2024-07-08 115751.png)
Je vous remercie pour votre aide !
Ps: j'utilise numba d'anaconda pour accélérer le programme.
Code:from PIL import Image import numpy as np import matplotlib.pyplot as plt from numba import njit from math import floor # Chargement de l'image et conversion en tableau numpy img = np.array(Image.open(r"D:\Nouveau dossier\.Icloud\iCloudDrive\Pour le fun\Qualité image\Python\sentinel2.jpg")) # Fonction Lanczos @njit def L(x, a): if x == 0: return 1 elif -a <= x < a: return a * np.sin(np.pi * x) * np.sin(np.pi * x / a) / ((np.pi * x) ** 2) else: return 0 # Interpolation Lanczos 2D @njit def lanczos_interpolation(img, a, m): nX, nY, _ = img.shape nX_f = nX * m nY_f = nY * m img_hdr = np.zeros((nX_f, nY_f, 3), dtype=np.uint8) for rgb in range(3): for x_f in range(nX_f): for y_f in range(nY_f): s = 0 x = x_f / m y = y_f / m for i in range(floor(x)-a +1, floor(x)+a+2): for j in range(floor(y)-a +1 , floor(y)+a+2): if 0 <= i < nX and 0 <= j < nY: s += img[i, j, rgb] * L(x-i, a) * L(y-j, a) img_hdr[x_f, y_f, rgb] = s return img_hdr # Appeler la fonction d'interpolation img_interpolated = lanczos_interpolation(img, a = 3, m = 3) # Afficher l'image interpolée plt.imshow(img_interpolated) plt.axis('off') plt.show()
-----