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.
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.
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))
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)])
Wie ich oben geschrieben habe, erhalten Sie die Farbe jedes Pixels wie folgt
img_pixels[100][200]
# => array([255,255,255])
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))
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. Ich habe das Bild von Herrn Pakutaso (https://www.pakutaso.com/) verwendet, eine kostenlose Bildseite.
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.
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.
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.
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.
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