Zusammenfassung zur Durchführung der Bildverarbeitung (Pixelmanipulation) in Python. Für Lernzwecke der Bildverarbeitung sind Leistung und Qualität zweitrangig, und Klarheit ist wichtig.
Die Umgebung ist Mac. In Bezug auf den akademischen Ansatz ist die Sprache Python und die Version ist 2.7.x.
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. .. ..
Installieren Sie pip, ein Python-Paketverwaltungstool, um die Installation der Bibliothek zu vereinfachen.
easy_install pip
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
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.
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.
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.
Lassen Sie uns nun mit den einzelnen Pixeln arbeiten.
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.
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.
Es gibt verschiedene Möglichkeiten, ein Bild zu drehen, aber die primitivste ist die Verwendung einer 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.
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()
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.
\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.
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()
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.
Ä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".
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.
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.
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.