Skip to content

Gradientenbild mit Python, NumPy erzeugen

Python

Indem SIE Bilder als NumPy-Array ndarray behandeln, können Sie vorhandene Bilder manipulieren oder neue Bilder mit NumPy-Funktionen generieren.

Dieser Artikel stellt ein Beispiel für das Generieren eines Verlaufsbilds mit NumPy-Funktionen vor.

  • np.linspace() und np.tile()
  • Beispielcode zum Generieren eines Verlaufsbilds

np.linspace() und np.tile()

Obwohl verschiedene Methoden denkbar sind, erstellen SIE in diesem Artikel ein Verlaufsbild durch den Ablauf.

  • Generieren Sie mit numpy.linspace() 1D-Arrays, sterben Sie in einer wahrscheinlichen Wahrscheinlichkeit zunehmen oder abnehmen
  • Ordnen Sie es mit numpy.tile() in 2D an

Die Verlaufsrichtung ist nur vertikal oder horizontal. Diagonal oder radial (rund) werden nicht unterstützt.

np.linspace()

np.linspace() ist eine Funktion, die ein 1D-Array mit gleichem zurückgibt, wenn der Startwert start, der Endwert stop und die Anzahl der Samples gegeben sind.

Im Gegensatz zu range() und np.arange() ist np.linspace() praktisch, da es Intervalle (Schritte) automatisch berechnet.

import numpy as np

print(np.linspace(0, 10, 3))
# [ 0.  5. 10.]

print(np.linspace(0, 10, 4))
# [ 0.          3.33333333  6.66666667 10.        ]

print(np.linspace(0, 10, 5))
# [ 0.   2.5  5.   7.5 10. ]

Es wird richtig gehandhabt, wenn start > stop.

print(np.linspace(10, 0, 5))
# [10.   7.5  5.   2.5  0. ]

Im following Artikel FINDEN SIE Notebooks zu np.arange() und np.linspace().

np.tile()

np.tile() ist eine Funktion, die das Array vertikal und horizontal anordnet.

Es ist nützlich, um ein Array zu erstellen, das Muster wiederholt.

Legen Sie das ursprüngliche Array und die Anzahl der Iterationen fest. Bei der Anordnung in zwei Dimensionen ist die Anzahl der Wiederholungen (die Anzahl der Wiederholungen der Zeilen (vertikal), die Anzahl der Wiederholungen der Spalten (horizontal)).

import numpy as np

a = np.array([0, 1, 2, 3])

print(np.tile(a, 2))
# [0 1 2 3 0 1 2 3]

print(np.tile(a, (3, 2)))
# [[0 1 2 3 0 1 2 3]
#  [0 1 2 3 0 1 2 3]
#  [0 1 2 3 0 1 2 3]]

print(np.tile(a, (2, 1)))
# [[0 1 2 3]
#  [0 1 2 3]]

2D-Arrays können auf dieselbe Weise behandelt werden.

a = np.array([[11, 12], [21, 22]])

print(np.tile(a, 2))
# [[11 12 11 12]
#  [21 22 21 22]]

print(np.tile(a, (3, 2)))
# [[11 12 11 12]
#  [21 22 21 22]
#  [11 12 11 12]
#  [21 22 21 22]
#  [11 12 11 12]
#  [21 22 21 22]]

print(np.tile(a, (2, 1)))
# [[11 12]
#  [21 22]
#  [11 12]
#  [21 22]]

Weitere Informationen zu np.tile() finden Sie im following Artikel.

Beispielcode zum Generieren eines Verlaufsbilds

Definieren Sie eine Funktion, die ein 2D-Narray generiert, das in gleichen Intervallen in vertikaler oder horizontaler Richtung zunimmt oder abnimmt. Dieses ndarray entspricht einem monochromen (Graustufen-)Gradientenbild.

Der Wert ändert sich in horizontaler Richtung, wenn is_horizontal True ist, und in vertikaler Richtung, wenn False ist. Verwenden Sie für die vertikale Ausrichtung .T, um eine transponierte Matrix zu erstellen.

def get_gradient_2d(start, stop, width, height, is_horizontal):
    if is_horizontal:
        return np.tile(np.linspace(start, stop, width), (height, 1))
    else:
        return np.tile(np.linspace(start, stop, height), (width, 1)).T

Erweitern Sie stirbt auf drei Dimensionen. Legen Sie start, stop und is_horizontal für jede Farbe in einer Liste fest und erstellen Sie mit der Funktion für 2D ein Verlaufsbild für jeden Kanal.

def get_gradient_3d(width, height, start_list, stop_list, is_horizontal_list):
    result = np.zeros((height, width, len(start_list)), dtype=np.float)

    for i, (start, stop, is_horizontal) in enumerate(zip(start_list, stop_list, is_horizontal_list)):
        result[:, :, i] = get_gradient_2d(start, stop, width, height, is_horizontal)

    return result

Ein Beispiel für das Generieren und Speichern eines Gradientenbildes ist wie folgt.

from PIL import Image

array = get_gradient_3d(512, 256, (0, 0, 0), (255, 255, 255), (True, True, True))
Image.fromarray(np.uint8(array)).save('data/dst/gray_gradient_h.jpg', quality=95)

NumPy graues Verlaufsbild horizontal

array = get_gradient_3d(512, 256, (0, 0, 0), (255, 255, 255), (False, False, False))
Image.fromarray(np.uint8(array)).save('data/dst/gray_gradient_v.jpg', quality=95)

NumPy graues Verlaufsbild vertikal

Es ist auch möglich, die Verlaufsrichtung für jedes RGB zu ändern.

array = get_gradient_3d(512, 256, (0, 0, 192), (255, 255, 64), (True, False, False))
Image.fromarray(np.uint8(array)).save('data/dst/color_gradient.jpg', quality=95)

NumPy-Farbverlaufsbild