Erste Python-Bildverarbeitung

Einführung

Schön, Sie kennenzulernen, dies ist Qiitas erster Beitrag.

Normalerweise arbeite ich hauptsächlich an Ruby, aber vor kurzem habe ich angefangen, Python als Hobby zu studieren und festgestellt, dass es überraschend einfach ist, Bilder zu verarbeiten. Deshalb habe ich über einfache Bildverarbeitung geschrieben. Ich habe diesen Artikel und seine Fortsetzung zu meinem Blog (http://www.uosansatox.biz/) geschrieben.

Ich lerne immer noch über Python. Wenn Sie dies also nicht für Python schreiben, es langsam ist oder der Code schmutzig ist, lassen Sie es mich bitte in den Kommentaren wissen.

Außerdem verwendet der folgende Code die Python-Bibliothek, numpy, pillow. In der Umgebung des Autors wird Anaconda3 unter Windows 10 verwendet, sodass es nicht erforderlich war, es separat zu installieren. Bitte installieren Sie es bei Bedarf, wenn Sie es ausführen.

Übersicht über die Bildverarbeitung

Die Bildverarbeitung wird erreicht, indem einfach die Farbe jedes Pixels von Ende zu Ende des Bildes geändert wird. Lesen Sie daher zuerst die Bilddatei und konvertieren Sie sie zur einfachen Bedienung in ein dreidimensionales Array, dessen Größe Bildhöhe x Bildbreite x 3 ist. Auf diese Weise wird beispielsweise die Farbe des 100. Pixels von links und des 200. Pixels von oben im Bild angezeigt Es wird als img_pixels [100] [200] verfügbar sein. Der erfasste Wert ist ein Array `[r, g, b]` mit 3 Elementen. Zunächst werde ich die minimale Verwendung von Kissen (PIL) und die übliche Verarbeitung bei der Bildverarbeitung erläutern.

Bild laden, neu erstellen

Importieren Sie die erforderlichen Bibliotheken am Zeilenanfang. Die zur Verdeutlichung verwendeten Bilder befinden sich im selben Ordner wie die py-Datei.

edit_img.py


from PIL import Image
import numpy as np

#Laden des Originalbildes
img = Image.open('original.jpg')
#Holen Sie sich die Breite und Höhe des Originalbildes
width, height = img.size
#Erstellen Sie ein Bildobjekt, das dieselbe Größe wie das Originalbild hat
img2 = Image.new('RGB', (width, height))

Anordnung der Bilddateien

Konvertiert das gelesene Originalbild in ein Array.

img_pixels = []
for y in range(height):
  for x in range(width):
    # getpixel((x,y))X. von links,Holen Sie sich die Farbe des y-ten Pixels von oben und img_Zu Pixeln hinzufügen
    img_pixels.append(img.getpixel((x,y)))
#Konvertieren Sie in ein numpy-Array, um es später einfacher berechnen zu können
img_pixels = np.array(img_pixels)

Übrigens können Sie auch wie folgt in eine Zeile schreiben.

python


img_pixels = np.array([[img.getpixel((i,j)) for j in range(height)] for i in range(width)])

Ermitteln Sie den Wert jedes Pixels

Wie ich oben geschrieben habe, erhalten Sie die Farbe jedes Pixels wie folgt

img_pixels[100][200]
# => array([255,255,255])

Wertesatz in Pixel

So stellen Sie die Farbe wie folgt auf das 100. Pixel von links und das 200. Pixel von oben auf das verarbeitete Bildobjekt img2 ein Verwenden Sie die Putpixel-Methode. Im folgenden Beispiel ist es auf blau eingestellt. Um es auf rot zu setzen, setzen Sie die letzten drei Argumente auf 255,0,0.

img2.putpixel((100, 200), (0, 0, 255))

Anzeigen und speichern

Verwenden Sie die show-Methode, um die bearbeitete Bildinstanz anzuzeigen.

img2.show()

Verwenden Sie zum Speichern die Speichermethode.

img2.save('edited_img.jpg')

Lassen Sie uns das Bild tatsächlich mit der obigen Methode verarbeiten. Die folgenden Originalbilder werden für die Bildverarbeitung verwendet. original.jpg Ich habe das Bild von Herrn Pakutaso (https://www.pakutaso.com/) verwendet, eine kostenlose Bildseite.

Unschärfeverarbeitung

Implementiert Unschärfen, die das gesamte Bild etwas verschwommen erscheinen lassen. Der Nachteil ist, dass das Bild um die Größe des Filters kleiner wird. Erstellen Sie ein Bild, das so aussieht, als wäre es unscharf, indem Sie nach der Verarbeitung die durchschnittliche Farbe mit den umgebenden Farben in das Bild schreiben. Eigentlich wollte ich den Durchschnitt mit den Farben oben, unten, links und rechts vom Ausgangspunkt aus betrachten, aber der Einfachheit halber nehme ich den Durchschnitt mit den Farben unten rechts.

bokashi.py


from PIL import Image
import numpy as np

img = Image.open('original.jpg')
width, height = img.size
filter_size = 20
img2 = Image.new('RGB', (width - filter_size, height - filter_size))
img_pixels = np.array([[img.getpixel((x,y)) for x in range(width)] for y in range(height)])

filter_size = 20

for y in range(height - filter_size):
  for x in range(width - filter_size):
    #Position(x,y)Schneiden Sie ein Bild mit einer kleinen vertikalen und horizontalen Filtergröße aus dem Originalbild ab
    partial_img = img_pixels[y:y + filter_size, x:x + filter_size]
    #Richten Sie die Werte jedes Pixels in einem kleinen Bild aus
    color_array = partial_img.reshape(filter_size ** 2, 3)
    #Jeder R.,G,B Ermitteln Sie jeweils den Durchschnitt und die Position des verarbeiteten Bildes(x,y)Stellen Sie den Pixelwert von ein
    mean_r, mean_g, mean_b = color_array.mean(axis = 0)
    img2.putpixel((x,y), (int(mean_r), int(mean_g), int(mean_b)))

img2.show()
img2.save('bokashi.jpg')

Das Folgende ist das Ausgabebild. bokashi.jpg

Mosaik-

Erzeugt ein Bild mit einem Mosaik über das gesamte Bild. Erstellt ein (einfarbiges) Bild mit der dunkelsten Farbe und der gleichen Größe wie das Teilbild unter den Teilbildern für die vertikalen und horizontalen Filtergrößen. Erstellen Sie ein Mosaikbild, indem Sie das erstellte einfarbige Bild nacheinander in das verarbeitete Bild einfügen.

mozaiku.py


from PIL import Image
import numpy as np

img = Image.open('original.jpg')
width, height = img.size
filter_size = 10
img2 = Image.new('RGB', (width, height))
img_pixels = np.array([[img.getpixel((x,y)) for x in range(width)] for y in range(height)])

# 
def draw_partial_img(img2, start_x, start_y, partial_size_x, partial_size_y, pixel_color):
  for y in range(start_y, start_y + partial_size_y):
    for x in range(start_x, start_x + partial_size_x):
      img2.putpixel((x, y), pixel_color)

for y in range(0, height, filter_size):
  for x in range(0, width, filter_size):
    #Schneiden Sie einen Teil des Bildes wie Unschärfe aus
    partial_img = img_pixels[y:y + filter_size, x:x + filter_size]
    #In eine Reihe von Farben konvertieren
    color_array = partial_img.reshape(partial_img.shape[0] * partial_img.shape[1], 3)
    #R für jedes Pixel+ g +Holen Sie sich die Nummer der Sache b nimmt den Maximalwert
    #Die dunkelste Farbnummer im ausgeschnittenen Bild
    max_index = np.argmax(color_array.sum(axis=1))
    max_r, max_g, max_b = color_array[max_index]
    # (x,y)Einfarbig mit vertikaler und horizontaler Filtergröße ab(Über Farben)Setzen Sie das Bild von auf img2
    draw_partial_img(img2, x, y, partial_img.shape[1], partial_img.shape[0], (max_r, max_g, max_b))

img2.show()
img2.save('mozaiku.jpg')

Das Folgende ist das Ausgabeergebnis. Es ist unangenehm, weil es eine Vierfachschleife gibt, aber ein Bild dieser Größe wurde in wenigen Sekunden angezeigt. mozaiku.jpg

Farbinversion

Erzeugt ein negativ gefärbtes invertiertes Bild.

hanten.py


from PIL import Image
import numpy as np

img = Image.open('original.jpg')
width, height = img.size
img2 = Image.new('RGB', (width, height))
img_pixels = np.array([[img.getpixel((x,y)) for x in range(width)] for y in range(height)])

#Farben umkehren
reverse_color_pixels = 255 - img_pixels
for y in range(height):
  for x in range(width):
    #Erstellen Sie ein Bild mit invertierten Farben
    r,g,b = reverse_color_pixels[y][x]
    img2.putpixel((x,y), (r,g,b))

img2.show()
img2.save('hanten.jpg')

Unten ist das generierte Bild. Es ist beängstigend, wahrscheinlich weil das Originalbild schön ist, aber es ist schön, selbst wenn es umgedreht ist. hanten.jpg

Zusammenfassung

Eigentlich ist eine Methode vorbereitet, um die Farbe in Kissen umzukehren, aber dieses Mal habe ich versucht, die Bildverarbeitung mit Hilfe von Numpy für die Python-Praxis zu implementieren.

Es war ein unvernünftiger Satz, aber danke, dass Sie bis zum Ende gelesen haben.

Es gibt etwas, das ich etwas mehr tun möchte, also kann ich es noch einmal hinzufügen.

Nachtrag

Ich habe eine Fortsetzung dieses Artikels auf der unten verlinkten Seite geschrieben. Wenn Sie mehr tun möchten, besuchen Sie uns bitte. Farbreduktionsverarbeitung nach k Durchschnittsmethode Erzeugung eines gemalten Bildes Erstellen Sie ein Bild im Miniaturstil Unscharfe Maskierung Vitalisierung und 3 Schwellenwerte Beschleunigen des sich wiederholenden Teils Expansion und Kontraktion

Recommended Posts

Erste Python-Bildverarbeitung
Python-Bildverarbeitung
Bildverarbeitung mit Python
Bildverarbeitung mit Python (Teil 2)
Bildverarbeitung mit Python (Teil 1)
Bildverarbeitung mit Python (3)
Bildverarbeitung mit Python (Pillow)
Bildverarbeitungssammlung in Python
[Python] Bildverarbeitung mit Scicit-Image
Persönliche Notizen für die Python-Bildverarbeitung
Die Bildverarbeitung mit Python 100 klopft an die Binärisierung Nr. 3
100 Bildverarbeitung mit Python Knock # 2 Graustufen
[Bildverarbeitung] Posterisierung
Erster Python
Erster Python 3 ~ Erster Vergleich ~
Python-Dateiverarbeitung
Erster Python
Erste Python ~ Codierung 2 ~
Erster Bildklassifikator
Erste Python [O'REILLY]
Bildverarbeitung 100 Schläge ①
Bildverarbeitung mit Python 100 Knock # 10 Medianfilter
Bildverarbeitung durch Python 100 Knock # 1 Kanalersatz
100 Bildverarbeitung mit Python Knock # 8 Max Pooling
Graustufen durch Matrix-Reinventor der Python-Bildverarbeitung-
Bildverarbeitung mit Python & OpenCV [Tonkurve]
Bildverarbeitung mit Python 100 Knock # 12 Bewegungsfilter
Bildverarbeitung mit Python 100 Knock # 6 Farbreduktionsverarbeitung
Zeichnen mit Matrix-Reinventor von Python Image Processing-
Verarbeiten Sie Bilder in Python ganz einfach mit Pillow
Die Bildverarbeitung mit Python 100 führt zu einem durchschnittlichen Pooling von # 7
Leichte Bildverarbeitung mit Python x OpenCV
Faltungsfilterung durch Matrix-Reinventor der Python-Bildverarbeitung-
Bildverarbeitung mit Python 100 Knock # 9 Gauß-Filter
Bildverarbeitung mit MyHDL
Python: Verarbeitung natürlicher Sprache
Kommunikationsverarbeitung durch Python
Multithread-Verarbeitung in Python
PyQ ~ Python Erster Schritt ~
Lesen Sie die digitale Bildverarbeitung
[Python] Die erste SVM von Python / Scikit-learn
Textverarbeitung mit Python
Bildformat in Python
Verarbeitung in Python beenden
Bildverarbeitung von Grund auf mit Python (4) Konturextraktion
Bildverarbeitung? Die Geschichte, Python für zu starten
Bildverarbeitung mit Python Environment Setup für Windows
Erstes Python-Memo
Bildverarbeitung mit Python 100 Knock # 11 Glättungsfilter (Durchschnittsfilter)
[Python] Kapitel 01-01 Über Python (Erster Python)
Abbildung zur Verarbeitung von Python-Zeichenfolgen
Verschiedene Verarbeitung von Python
Bildverarbeitung mit PIL
Bildverarbeitung durch Matrix Basics & Contents-Reinventor der Python-Bildverarbeitung-
opencv-python Einführung in die Bildverarbeitung
python3 Messen Sie die Verarbeitungsgeschwindigkeit.
Bildverarbeitung mit PIL (Pillow)
"Apple-Verarbeitung" mit OpenCV3 + Python3
Bildbearbeitung mit Python OpenCV
Akustische Signalverarbeitung mit Python (2)