Bildpixel-Manipulation in Python

Zusammenfassung zur Durchführung der Bildverarbeitung (Pixelmanipulation) in Python. Für Lernzwecke der Bildverarbeitung sind Leistung und Qualität zweitrangig, und Klarheit ist wichtig.

Umgebung

Die Umgebung ist Mac. In Bezug auf den akademischen Ansatz ist die Sprache Python und die Version ist 2.7.x.

Nutzungsumgebung

Installation

Python

Mac kommt von Anfang an mit Python.

python --version

Bitte versuche. Wenn nicht,

brew install python

Ich werde es betreten.

Es wird davon ausgegangen, dass das Gebräu enthalten ist. .. ..

Rohrinstallation

Installieren Sie pip, ein Python-Paketverwaltungstool, um die Installation der Bibliothek zu vereinfachen.

easy_install pip

Installation von Modulen (Bibliothek)

Dieses Mal werden wir Numpy und Pillow (PIL) verwenden. numpy enthält Werkzeuge, die für Berechnungen geeignet sind, und Pillow enthält Werkzeuge für die Bildverarbeitung.

pip install numpy
pip install pillow

Versuchen Sie, das Bild zu manipulieren

Vorerst werde ich das Bild laden und anzeigen.

from PIL import Image

im = Image.open("./achan.jpg ")
im.show()

Es wird nur angezeigt, also drehen wir es und zeigen es an.

py01

from PIL import Image

im = Image.open("./achan.jpg ")
im.rotate(30).show()

Ich denke, es wurde um 30 Grad gegen den Uhrzeigersinn um die Bildmitte gedreht.

py01

In der Praxis ist das in Ordnung, aber ich weiß nicht, was es intern tut. Daher möchte ich hier ein Programm schreiben, das jedes Pixel verarbeitet und dreht.

Versuchen Sie, Pixel zu manipulieren

Lassen Sie uns nun mit den einzelnen Pixeln arbeiten.

Versuchen Sie, negativ und positiv umzudrehen

Lassen Sie uns nun eine negativ-positive Inversionsverarbeitung durchführen, die eine typische und einfache Pixeloperationsverarbeitung ist.

#coding:utf-8
from PIL import Image

#Laden von Bildern
im = Image.open("./achan.jpg ")

#In RGB konvertieren
rgb_im = im.convert('RGB')

#Bildgröße abrufen
size = rgb_im.size

#Erstellen Sie ein neues leeres Bild mit der gleichen Größe wie die erfasste Größe
im2 = Image.new('RGBA',size)

#loop
#x
for x in range(size[0]):
    #y
    for y in range(size[1]):
        #Holen Sie sich Pixel
        r,g,b = rgb_im.getpixel((x,y))

        #Inversionsverarbeitung
        r = 255 - r
        g = 255 - g
        b = 255 - b

        #set pixel
        im2.putpixel((x,y),(r,g,b,0))

#show
im2.show()

Es wurde auf ein Negativ gedreht.

py01

Graustufen

Die Graustufen sehen grau aus, wenn r, g, b den gleichen Wert haben. Es ist jedoch von Fall zu Fall, ob nach einer solchen Regel derselbe Wert angegeben wird. Hier erhalten wir den Durchschnittswert von r, g, b und verwenden diesen Wert (im Folgenden wird nur die Pixeloperation extrahiert).

#loop
#x
for x in range(size[0]):
    #y
    for y in range(size[1]):
        #Holen Sie sich Pixel
        r,g,b = rgb_im.getpixel((x,y))

        #Mittelwertbildung
        g = (r + g + b)/3

        #set pixel
        im2.putpixel((x,y),(g,g,g,0))

#show
im2.show()

Es wurde vorerst grau.

py01

Versuche dich zu drehen

Es gibt verschiedene Möglichkeiten, ein Bild zu drehen, aber die primitivste ist die Verwendung einer Rotationsmatrix.

Rotationsmatrix

Die Rotationsmatrix wird durch die folgende Formel ausgedrückt. Wenn Sie θ den Winkel geben, den Sie im Bogenmaß drehen möchten, können Sie einen Sitz (x2, y2) um diesen Winkel drehen lassen.

\begin{equation}

\begin{pmatrix}
x_{2} \\
y_{2}
\end{pmatrix}

=

\begin{pmatrix}
\cos \theta & -\sin \theta \\
\sin \theta & \cos \theta
\end{pmatrix}

\begin{pmatrix}
x_{1} \\
y_{2}
\end{pmatrix}


\end{equation}

In Python kann mithilfe des Numpy-Moduls die obige Rotationsmatrix geändert werden.

m_matrix = np.matrix([
            [np.cos(rad),-1*np.sin(rad)],
            [np.sin(rad),np.cos(rad)]
        ])

Dies ist sehr praktisch, da es intuitiv ausgedrückt werden kann und die Summe und das Produkt erhalten werden können, indem es wie eine normale Operation mit vier Regeln beschrieben wird.

Ich verwende hier Matrix, aber wenn Sie keinen bestimmten Grund haben, scheint es besser, Array zu verwenden.

Code schreiben

Schreiben wir nun einen Code, der mithilfe einer Rotationsmatrix rotiert. Im folgenden Code wird oben links als Rotationsachse und nicht als Bildmitte verarbeitet. Da außerdem Putpixel verwendet werden, die nur int verarbeiten können, treten im Bild Unebenheiten auf (obwohl diese Methode hier der Klarheit halber verwendet wird).

#coding:UTF-8
from PIL import Image
import numpy as np

#Laden von Bildern
im = Image.open("./achan.jpg ")

#In RGB konvertieren
rgb_im = im.convert('RGB')

#Bildgröße abrufen
size = rgb_im.size

#Erstellen Sie ein neues leeres Bild mit der gleichen Größe wie die erfasste Größe
im2 = Image.new('RGBA',size)

#loop
#x
for x in range(size[0]):
	#y
	for y in range(size[1]):

		#Holen Sie sich Pixel
		r,g,b = rgb_im.getpixel((x,y))

		#wird bearbeitet

		#30 Grad
		rad = np.pi/6

		#Rotationsmatrix
		m_matrix = np.matrix([
			[np.cos(rad),-1*np.sin(rad)],
			[np.sin(rad),np.cos(rad)]
		])

		#Anwendbare Koordinaten (Originalkoordinaten)
		p_matrix = np.matrix([
				[x],
				[y]
			])

		#Matrixbetrieb
		p2_matrix = m_matrix * p_matrix

		#Holen Sie sich Arbeit nach dem Umzug(Es kann nur int gesetzt werden, also konvertieren Sie in int)
		x2 = int(p2_matrix[0,0])
		y2 = int(p2_matrix[1,0])

		#Wenn es innerhalb der Bildgröße liegt
		if 0 < x2 < size[0] and 0 < y2 < size[1]:
			#Geben Sie das ursprüngliche RGB für die Koordinaten nach dem Verschieben an
			im2.putpixel((x2,y2),(r,g,b,0))

#show
im2.show()

py01

Versuche zu drehen

Die Inversion zur x-Achse, y-Achse, beliebigen Achse usw. kann auch mit einer Matrix durchgeführt werden. Dies ist die erste Umstellung der Mathematik an der High School. Zum Beispiel ist die Inversion der y-Achse unten angegeben.

Inversionsmatrix (y-Achse)

\begin{equation}

\begin{pmatrix}
x_{2} \\
y_{2}
\end{pmatrix}

=

\begin{pmatrix}
-1 & 0 \\
0 & 1
\end{pmatrix}

\begin{pmatrix}
x_{1} \\
y_{2}
\end{pmatrix}


\end{equation}

Diese Matrix ist in Python

#Ziel der y-Achse
y_matrix = np.matrix([
    [-1,0],
    [0,1]
])

Kann ausgedrückt werden als.

Versuchen Sie, Code zu schreiben

Jetzt schreiben wir den Code. Wenn Sie die y-Achse normal drehen, verschieben sich alle Punkte in Minusrichtung und werden nicht gezeichnet. Verschieben Sie es daher parallel um die Breite (x-Achse) des Bildes.

#coding:UTF-8
from PIL import Image
import numpy as np

#Laden von Bildern
im = Image.open("./achan.jpg ")

#In RGB konvertieren
rgb_im = im.convert('RGB')

#Bildgröße abrufen
size = rgb_im.size

#Erstellen Sie ein neues leeres Bild mit der gleichen Größe wie die erfasste Größe
im2 = Image.new('RGBA',size)

#loop
#x
for x in range(size[0]):
    #y
    for y in range(size[1]):

        #Holen Sie sich Pixel
        r,g,b = rgb_im.getpixel((x,y))

        #wird bearbeitet

        #Ziel der y-Achse
        y_matrix = np.matrix([
        	[-1,0],
        	[0,1]
        ])

        #Anwendbare Koordinaten (Originalkoordinaten)
        p_matrix = np.matrix([
                [x],
                [y]
            ])

        #Matrixbetrieb
        p2_matrix = y_matrix * p_matrix

        #Holen Sie sich Arbeit nach dem Umzug(Es kann nur int gesetzt werden, also konvertieren Sie in int)
        x2 = int(p2_matrix[0,0]) + size[0] #Parallele Bewegung der x-Koordinate durch die horizontale Größe der Addition
        y2 = int(p2_matrix[1,0])

        #Wenn es innerhalb der Bildgröße liegt
        if 0 < x2 < size[0] and 0 < y2 < size[1]:
            #Geben Sie das ursprüngliche RGB für die Koordinaten nach dem Verschieben an
            im2.putpixel((x2,y2),(r,g,b,0))

#show
im2.show()

py01

Es wurde umgekehrt. Sogenannte Links-Rechts-Umkehrung. Es fühlt sich an, als wäre es um ein zusätzliches Pixel versetzt. .. .. Es ist mir hier egal.

Annäherungsverarbeitung

Ähnlich wie bei der Matrixberechnung werden wir die Nachbarschaftsverarbeitung versuchen, die für die Bildverarbeitung von wesentlicher Bedeutung ist. Die Näherungsverarbeitung ist nützlich für "Unschärfeverarbeitung" und "Konturextraktion".

Verwischen

Hier werden wir einen relativ einfachen "Unschärfeprozess" versuchen. Es gibt verschiedene Algorithmen, aber hier werden wir die einfachste Methode ausprobieren, um den Durchschnittswert der Umgebung von 8 zu ermitteln und einzustellen.

Acht Nachbarschaften sind acht Bereiche, die die Referenzkoordinaten umgeben.

py01

Holen Sie sich die r-, g- und b-Werte jeder ihrer Koordinaten und mitteln Sie sie.

Eine Einschränkung ist, dass x-1 nicht existiert oder x + 1 über die Koordinaten der Bildränder hinausgeht, so dass eine Verarbeitung erforderlich ist. Jetzt schreiben wir den Code.

#coding:utf-8
from PIL import Image

#Laden von Bildern
im = Image.open("./achan.jpg ")

#In RGB konvertieren
rgb_im = im.convert('RGB')

#Bildgröße abrufen
size = rgb_im.size

#Erstellen Sie ein neues leeres Bild mit der gleichen Größe wie die erfasste Größe
im2 = Image.new('RGBA',size)

#loop
#x
for x in range(size[0]):
    #y
    for y in range(size[1]):

        #Holen Sie sich Pixel von Zielkoordinaten
        r0,g0,b0 = rgb_im.getpixel((x,y))

        #Initialisierung (setzen Sie vorerst die aktuellen Koordinatenwerte auf alle benachbarten Werte)
        r1 = r2 = r3 = r4 = r5 = r6 = r7 = r8 = r0;
        g1 = g2 = g3 = g4 = g5 = g6 = g7 = g8 = g0;
        b1 = b2 = b3 = b4 = b5 = b6 = b7 = b8 = b0;

        #Ermitteln Sie den Wert der Nachbarschaftskoordinaten

        #1
        if x-1 > 0 and y+1 < size[1]:
        	r1,g1,b1 = rgb_im.getpixel((x-1,y+1))

        #2
        if y+1 < size[1]:
        	r2,g2,b2 = rgb_im.getpixel((x,y+1))

        #3
        if x+1 < size[0] and y+1 < size[1]:
        	r3,g3,b3 = rgb_im.getpixel((x+1,y+1))

        #4
        if x-1 > 0:
        	r4,g4,b4 = rgb_im.getpixel((x-1,y))

        #5
        if x+1 < size[0]:
        	r5,g5,b5 = rgb_im.getpixel((x+1,y))

        #6
        if x-1 > 0 and y-1 > 0:
        	r6,g6,b6 = rgb_im.getpixel((x-1,y-1))

        #7
        if y-1 > 0:
        	r7,g7,b7 = rgb_im.getpixel((x,y-1))

        #8
        if x+1 < size[0] and y-1 > 0:
        	r8,g8,b8 = rgb_im.getpixel((x+1,y-1))


        #Durchschnittliches RGB in der Nähe
        r = (r0 + r1 + r2 + r3 + r4 + r5 + r6 + r7 + r8)/9
        g = (g0 + g1 + g2 + g3 + g4 + g5 + g6 + g7 + g8)/9
        b = (b0 + b1 + b2 + b3 + b4 + b5 + b6 + b7 + b8)/9

        #Zeichnung
        im2.putpixel((x,y),(r,g,b,0))

#show
im2.show()

Es ist ein wenig verwirrend, aber es ist verschwommen. Verschiedene Unschärfen sind möglich, indem die Umgebung weiter vergrößert und der Algorithmus entwickelt wird.

py01

Es ist noch ein langer Weg, um es praktisch nutzbar zu machen, wie zum Beispiel die Pixelkorrektur, aber vorerst sind die grundlegenden Inhalte bis hierher.

Recommended Posts

Bildpixel-Manipulation in Python
Entfernen Sie DICOM-Bilder in Python
String-Manipulation in Python
Datumsmanipulation in Python
DICOM-Bilder mit Python Part 2 entfernen
Base64-Codierung von Bildern in Python 3
Objektäquivalenzbeurteilung in Python
Beschleunigen Sie das Laden von Python-Bildern
Datumsmanipulation von Strings in Python
Implementierung der schnellen Sortierung in Python
[Python] Manipulation von Elementen in der Liste (Array) [Hinzufügen / Löschen]
Zahlenerkennung in Bildern mit Python
Grundlegende Zusammenfassung der Datenoperationen in Python Pandas - Zweite Hälfte: Datenaggregation
Manipulation des Datei- / Ordnerpfads in Python
So sammeln Sie Bilder in Python
Zeitdelta in Python 2.7-Serie teilen
MySQL-automatische Escape-Funktion von Parametern in Python
Umgang mit JSON-Dateien in Python
Implementierung eines Lebensspiels in Python
Audio-Wellenform-Anzeige in Python
Extrahieren Sie mit Python Text aus Bildern
Das Gesetz der Zahlen in Python
Implementierung der ursprünglichen Sortierung in Python
Reversibles Verwürfeln von Ganzzahlen in Python
Arbeiten mit DICOM-Bildern in Python
Konvertierung der Zeichenfolge <-> Datum (Datum, Datum / Uhrzeit) in Python
Überprüfen Sie das Verhalten des Zerstörers in Python
Übung, dies in Python zu verwenden (schlecht)
Allgemeine Relativitätstheorie in Python: Einführung
Wenden Sie verschiedene Formen von Mosaiken auf Bilder an (Python, OpenCV).
Ausgabebaumstruktur von Dateien in Python
Zeigen Sie eine Liste der Alphabete in Python 3 an
Vergleich japanischer Konvertierungsmodule in Python3
Zusammenfassung verschiedener for-Anweisungen in Python
Das Ergebnis der Installation von Python auf Anaconda
Gang of Four (GoF) -Muster in Python
Laden Sie Bilder von der URL-Liste in Python herunter
Grundlagen zum Ausführen von NoxPlayer in Python
Massenersatz von Zeichenfolgen in Python-Arrays
Projekt Euler # 16 "Summe der Kräfte" in Python
Traffic Safety-Kun: Erkennung von Verkehrszeichen in Python
Zusammenfassung der integrierten Methoden usw. der Python-Liste
Nicht logische Operatorverwendung von oder in Python
Auf der Suche nach dem schnellsten FizzBuzz in Python
Praktisches Beispiel für hexagonale Architektur in Python
Projekt Euler # 17 "Anzahl der Zeichen" in Python
Doppelte Pendelbewegungsgleichung in Python
Lesen von Zeichen in Bildern mit Python OCR
Status jedes Python-Verarbeitungssystems im Jahr 2020
Projekt Euler # 1 "Vielfaches von 3 und 5" in Python
Quadtree in Python --2
CURL in Python
Metaprogrammierung mit Python
Python 3.3 mit Anaconda
Geokodierung in Python
SendKeys in Python
Manipulation von Python-Syntaxzeichenfolgen
Metaanalyse in Python
Unittest in Python