[PYTHON] Überprüfen Sie jeden Pixelwert, wenn Sie die Größe eines Bildes mit Pillow mit dem nächsten Nachbarn ändern

Überblick

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.

Nächster Nachbar (Nächster Nachbar)

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/

Versuchen Sie es zu überprüfen

Erstellen eines Bildbeispiels

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

Figure_1.png

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.

Ändern Sie die Größe des Bildmusters 10 × 10 ⇒ 5 × 5

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

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

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.

Ändern Sie die Größe des Bildmusters 10 × 10 ⇒ 3 × 3

Als nächstes komprimieren Sie das Originalbild von 10x10 auf 3x3. 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

Ja, der Wert war ohne Probleme korrekt.

Zusammenfassung

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.

Recommended Posts

Überprüfen Sie jeden Pixelwert, wenn Sie die Größe eines Bildes mit Pillow mit dem nächsten Nachbarn ändern
Erstellen Sie eine Bildkompositions-App mit Flask + Pillow
Bildverarbeitung mit PIL (Pillow)