6. Eigener Filter über Python und Jupyternotebook

From Init-c Wiki

Zurück zur Projektübersicht: Projektarbeit, Digitale Fotofilter

Eigener Filter über Python und Jupyternotebook

Um einen eigenen Fotofilter zu programmieren habe ich mich an diesem Video Tutorial [1] mit dem Titel "Using Python to Create Image Filters (Python Project Tutorial)" von Avery Smith orientiert und über (HU) Jupyter Notebook mit Python gearbeitet. Ich habe jeden Schritt zum Nachlesen als Tutorial dokumentiert.


1. Zuerst musste imageio als Paket installiert werden.

!pip install imageio

import imagio as iio

S1.JPG


2. Danach musste das Bild, welches bearbeitet werden soll, in das Programm eingelesen werden. Das ausgewählte Bild habe ich vorher in das Notebook hochgeladen.

# read an image

img = iio.imread("IMG_Name.jpeg")

S2-2.JPG


3. Mit dem Command (img) erscheint eine Liste mit dreistelligen Zahlen, die die RGB Values und somit verschiedene Farben darstellen. Z.B. Stellen die Werte [82, 80, 85] stellen ein Dunkelgrau dar.

S3.JPG S4.JPG


4. Danach wird die Größe des Bildes überprüft.

img.shape

Das Beispielbild hat 2048 Zeilen, heißt es ist 2048 Pixel groß, und hat 1536 Spalten, bedeutet es ist 1536 Pixel weit. Zusätzlich hat jeder Pixel drei Werte.

S4-1.JPG


5. Die Bildgröße wird geglättet und in eine andere Größe konvertiert. Anstatt die Anordnung von Pixeln in normalen Bildern zu nehmen, werden nun alle Pixel untereinander vertikal aufgeführt, damit es einfacher für das Programm ist, mit den Nummern zu arbeiten.

x = img.flatten().reshape(2048*1536,3)

x

Es wird mit der Rechnung 2048x1536 durch 3 neu formatiert. Jede Zeile hier ist ein Pixel und die Anordnung der Werte in der Spalte sind R G B (Red, Green, Blue).

S4-2.JPG


6. Nun wird ein Algorithmus namens Kmeans Clustering genutzt. Der Algorithmus geht durch jede Zeile und jeden Pixel der Matrix und entscheidet welcher Pixel zu welchem Cluster gehört. Anhand der Werte werden sie somit einem Cluster angehörig macht. Es können verschieden viele Cluster (Farben) angegeben werden, zu denen die Pixel hinzugefügt werden sollen, aber in diesem Beispiel werden nur 4 Cluster genommen.

from sklearn.cluster import KMeans

kmeans = KMeans(n_clusters=4, random_state=0).fit(x)

S4-3.JPG


7. Fit(x) für die reduzierten Daten anpassen. kmeans.labels_

S5-1.JPG


8. Mit dem Command werden die Label für 0,1,2,3 erstellt, die für alle Werte gewählt wurden. Und die Werte werden als eine der vier von mir gewählten Farben (Blau, Grün, Rosa, Braun) dargestellt. [153, 204, 355] = Blau [123, 228, 123] = Grün [255, 153, 255] = Rosa [164, 91, 91] = Braun Die Farben werden in das Programm mit ihren Werten geschrieben:

colors = [[153, 204, 355],[123, 228, 123],[255, 153, 255],[164, 91, 91]]

S5-2.JPG


9. Daraufhin wird mit dem Numpy Packet gearbeitet, welches zuerst importiert wird.

import numpy as np

new_img = [colors[i] for i in kmeans.labels_]

new_image = np.reshape(new_img,img.shape)

S6-1.PNG

Mit Numpy wird eine For-Schleife erschaffen, die eine bestimmte Anzahl von Wiederholungen von einer Anweisung ausführt. Es wird dabei durch jedes Label gegangen. Für jeden Wert, 0,1,2,3 wird eine Farbe zugehörig gemacht. (new_img = [colors[i] for i in kmeans.labels_]) Das Bild wird wieder zu seiner originalen Größe und Form umgeformt und die vorherige Reduzierung wird aufgehoben. In die Matplotlib, einer Matrix, wird der Wert eingegeben. Und dann in imshow und um das das Bild zu speichern und anzuzeigen.


10. Das gefilterte Bild kann nun angezeigt und auf dem Computer gespeichert werden.

from matplotlib import pyplot as plt

plt.imshow(new_image, interpolation='nearest')

plt.savefig('Filtered.png')

plt.show()

S6-2.PNG

S7.JPG

© Nora Timmer