[PYTHON] Validez chaque valeur de pixel lors du redimensionnement d'une image avec Pillow avec le voisin le plus proche

Aperçu

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.

Voisin le plus proche (voisin le plus proche)

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/

Essayez de vérifier

Créer un échantillon d'image

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))

Figure_1.png

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.

Redimensionner l'échantillon d'image 10 × 10 ⇒ 5 × 5

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))

Figure_2.png

[[ 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.

Redimensionner l'échantillon d'image 10 × 10 ⇒ 3 × 3

Ensuite, compressez l'image originale de 10 x 10 en 3 x 3. Figure_3.png

[[ 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.

Résumé

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"

Recommended Posts

Validez chaque valeur de pixel lors du redimensionnement d'une image avec Pillow avec le voisin le plus proche
Créez une application de composition d'images avec Flask + Pillow
Traitement d'image avec PIL (Pillow)