Wenn Sie das Pillow-Modul verwenden, um die Größe eines Bildes mit einem nächsten Nachbarn zu ändern Ich habe versucht zu überprüfen, von welchem Pixel der Wert erhalten wird (ob es der nächste Nachbar ist).
Mit jedem Algorithmus (nächster Nachbar, bilinear, bikubisch) Wie das Bild aussehen wird (ob es glatt ist usw.) Ich sehe oft Artikel, die über erwähnen Ich hatte nicht viele Informationen über den Wert jedes Pixels, also schrieb ich es.
Der Algorithmus selbst ist einfach. Die folgenden Links sind hilfreich. Ich werde die Details hier weglassen, aber Kurz gesagt, es ist ein Algorithmus, der den Pixelwert des nächstgelegenen Ortes so wie er ist bringt. https://algorithm.joho.info/image-processing/nearest-neighbor-linear-interpolation/
Ich habe ein Bildmuster zur Überprüfung angefertigt
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))
Die gespeicherten Werte sind wie folgt
[[ 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]]
Es fühlt sich an, als hätten die diagonalen Elemente andere Werte als 0.
Lassen Sie uns die Größe dieses Bildes mit der Größe des Kissens ändern (nächster Nachbar) Komprimieren Sie zunächst das Originalbild von 10 x 10 auf 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]]
Wie Sie anhand des Werts sehen können, Die nächste Nachbarschaft ist der Pixel "rückwärts" -Wert (20). Beispielsweise ist das Pixel [0, 0] nach dem Ändern der Größe Enthält den Wert von [1, 1] Pixel des Originalbilds. Auch die [1, 1] Pixel nach der Größenänderung sind Enthält den [3, 3] Pixelwert (60) des Originalbildes.
Es stimmt jedoch nicht mit der Formel überein, auf die ich mich bezog ...? Gemäß der Formel sollte es "vor" dem Pixel sein
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
Damit Beispielsweise ist das Pixel [0, 0] nach dem Ändern der Größe Der Wert (0) des [0, 0] -Pixels des Originalbilds sollte gespeichert werden
Es gab einen Artikel, der es aus irgendeinem Grund löste https://qiita.com/yoya/items/3b4a8080516259ece684 (Hat es eher Sinn gemacht, diesen Artikel zu schreiben ...) Ich sehe, der Pixelstart wurde auf 0,5 geändert ...
Dann
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
Und der Wert stimmte richtig überein.
Als nächstes komprimieren Sie das Originalbild von 10x10 auf 3x3.
[[ 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
Ja, der Wert war ohne Probleme korrekt.
Für den nächsten Nachbarn und Größe ändern Sie können das nächste Pixel aus der Formel berechnen. Beachten Sie, dass das Originalbild bei "0,5" beginnt.