Lors de l'utilisation du module Oreiller pour redimensionner une image avec un voisin le plus proche J'ai essayé de vérifier à partir de quel pixel la valeur est obtenue (s'il s'agit du voisin le plus proche).
Avec chaque algorithme (plus proche voisin, bilinéaire, bicubique) À quoi ressemblera l'image (si elle sera lisse, etc.) Je vois souvent des articles qui mentionnent Je n'avais pas beaucoup d'informations sur la valeur de chaque pixel, alors je l'ai écrite.
L'algorithme lui-même est simple. Les liens ci-dessous seront utiles. Je vais omettre les détails ici, mais En bref, c'est un algorithme qui apporte la valeur de pixel de l'emplacement le plus proche tel quel. https://algorithm.joho.info/image-processing/nearest-neighbor-linear-interpolation/
J'ai créé un échantillon d'image pour vérification
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
A = np.eye(10, dtype=int)
B = np.arange(10, dtype=int) * 20
C = Image.fromarray(B * A)
plt.figure()
plt.imshow(C)
print(np.array(C))
Les valeurs stockées sont les suivantes
[[ 0 0 0 0 0 0 0 0 0 0]
[ 0 20 0 0 0 0 0 0 0 0]
[ 0 0 40 0 0 0 0 0 0 0]
[ 0 0 0 60 0 0 0 0 0 0]
[ 0 0 0 0 80 0 0 0 0 0]
[ 0 0 0 0 0 100 0 0 0 0]
[ 0 0 0 0 0 0 120 0 0 0]
[ 0 0 0 0 0 0 0 140 0 0]
[ 0 0 0 0 0 0 0 0 160 0]
[ 0 0 0 0 0 0 0 0 0 180]]
On a l'impression que les éléments diagonaux ont des valeurs non nulles.
Redimensionnons cette image avec le redimensionnement de Pillow (voisin le plus proche) Tout d'abord, compressez l'image originale de 10 x 10 en 5 x 5
C_nn5 = C.resize([5, 5], resample=Image.NEAREST)
plt.figure()
plt.imshow(C_nn5)
print(np.array(C_nn5))
[[ 20 0 0 0 0]
[ 0 60 0 0 0]
[ 0 0 100 0 0]
[ 0 0 0 140 0]
[ 0 0 0 0 180]]
Ici, comme vous pouvez le voir en regardant la valeur, Le voisinage le plus proche est la valeur "arrière" du pixel (20). Par exemple, le pixel [0, 0] après le redimensionnement est Contient la valeur de [1, 1] pixels de l'image d'origine. De plus, les pixels [1, 1] après le redimensionnement sont Contient la valeur de pixel 3, 3 de l'image d'origine.
Cependant, cela ne correspond pas à la formule à laquelle j'ai fait référence ...? Selon la formule, il doit être "devant" le pixel
I'(0, 0) = I([0/0.5], [0/0.5]) = I(0, 0) = 0
I'(1, 1) = I([1/0.5], [1/0.5]) = I(2, 2) = 40
Alors Par exemple, le pixel [0, 0] après le redimensionnement est La valeur (0) du pixel [0, 0] de l'image d'origine doit être stockée
Il y avait un article qui l'a résolu pour une raison quelconque https://qiita.com/yoya/items/3b4a8080516259ece684 (Est-ce plutôt logique d'écrire cet article ...) Je vois, le début du pixel a été changé à 0,5 ...
Puis
I'(0, 0) = I([0.5/0.5], [0.5/0.5]) = I(1, 1) = 20
I'(1, 1) = I([1.5/0.5], [1.5/0.5]) = I(3, 3) = 60
Et la valeur correspondait correctement.
Ensuite, compressez l'image originale de 10 x 10 en 3 x 3.
[[ 20 0 0]
[ 0 100 0]
[ 0 0 160]]
I'(0, 0) = I([0.5/0.3], [0.5/0.3]) = I(2, 2) = 20
I'(1, 1) = I([1.5/0.3], [1.5/0.3]) = I(5, 5) = 100
I'(2, 2) = I([2.5/0.3], [2.5/0.3]) = I(8, 8) = 160
Oui, la valeur était correcte sans aucun problème.
Pour le voisin le plus proche et redimensionner Vous pouvez calculer le pixel le plus proche à partir de la formule, Notez que l'image d'origine commence à "0,5"