- 1. Bildtransformationen - Affine und nicht affine Transformation
- 2. Bildübersetzungen - Bild nach oben, unten, links und rechts verschieben
- 3. Rotation des Bildes - Drehen des Bildes
- 4. Skalieren, Ändern der Größe und Interpolation
- 5. Bildpyramiden - Eine andere Möglichkeit, die Größe zu ändern
- 6. Zuschneiden - Schneiden Sie den gewünschten Bildbereich aus
- 7. Arithmetische Operationen zum Aufhellen und Abdunkeln von Bildern
Im vorherigen Tutorial haben wir über OpenCV gelernt und einige grundlegende Bild getan Verarbeitung es wie Grauskalierung verwenden, Farbsättigung, Histogramm, Farbräume, RGB - Komponenten usw. Wie im vorherigen Tutorial gesagt, ist OpenCV Open Source Commuter Vision - Bibliothek, die hat C ++, Python und Java sind Schnittstellen und unterstützen Windows, Linux, Mac OS, iOS und Android. So kann es einfach in Raspberry Pi mit Python- und Linux-Umgebung installiert werden. Mit Raspberry Pi mit OpenCV und angeschlossener Kamera können viele Echtzeit-Bildverarbeitungsanwendungen wie Gesichtserkennung, Gesichtsverriegelung, Objektverfolgung, Erkennung von Autokennzeichen, Haussicherungssystem usw. erstellt werden.
In diesem Tutorial werden wir sehen, wie wir das Bild mit OpenCV bearbeiten. Hier lernen wir, die folgende Funktion mit OpenCV auf ein Bild anzuwenden:
- Bildtransformationen - Affine und nicht affine Transformation
- Bildübersetzungen - Bild nach oben, unten, links und rechts verschieben
- Rotation des Bildes - Drehen des Bildes
- Skalieren, Ändern der Größe und Interpolation
- Bildpyramiden - Eine andere Möglichkeit, die Größe zu ändern
- Zuschneiden - Ausschneiden des gewünschten Bildbereichs
- Arithmetische Operationen zum Aufhellen und Abdunkeln von Bildern
1. Bildtransformationen - Affine und nicht affine Transformation
Transformationen sind geometrische Verzerrungen, die auf ein Bild ausgeübt werden. Verzerrungen bedeuten hier sicherlich keine Fehler, sondern einen Korrekturtyp, um die perspektivischen Probleme zu korrigieren, die sich aus dem Punkt ergeben, an dem das Bild aufgenommen wurde. Es gibt zwei Arten von Bildtransformationen - Affin und Nicht-Affin
Es gibt drei Arten von affinen Transformationen: Skalierung, Rotation und Translation. Bei affinen Transformationen ist es wichtig, dass Linien vor und nach Bildtransformationen parallel sind.
Nicht-affine Transformationen oder projektive Transformationen bewahren nicht Parallelität, Länge oder Winkel, sondern die Kollinearität und Inzidenz. Kollinearität bedeutet, dass die beiden Punkte auf derselben geraden Linie liegen.
Nicht-affine Transformationen sind in der Bildverarbeitung sehr häufig und werden aus verschiedenen Kamerawinkeln erzeugt. Nicht affine oder projektive Transformationen werden auch als Homographie bezeichnet.
2. Bildübersetzungen - Bild nach oben, unten, links und rechts verschieben
Die Bildübersetzung bewegt das Bild nach oben, unten, links und rechts und sogar diagonal, wenn wir gleichzeitig die x- und y-Übersetzung implementieren.
Für die Durchführung von Bildübersetzungen verwenden wir jetzt die warpAffine-Funktion von opencv. Mit cv2.warpAffine werden diese Übersetzungen implementiert. Dafür benötigen wir jedoch eine Übersetzungsmatrix.
Übersetzungsmatrix, T = 1 0 Tx
0 1 ty
T X, T y sind die Richtungen, in die die Bildverschiebung stattfindet.
Wobei das T X entlang der X-Achse verschoben ist (horizontal)
T Y ist eine Verschiebung entlang der Y-Achse (vertikal)
# Dies ist eine affine Transformation, die einfach die Position eines Bildes verschiebt. # Wir verwenden cv2.warpAffine, um diese Transformationen zu implementieren. import cv2 import numpy as np image = cv2.imread ('input.jpg') # speichere die Höhe und Breite der Bildhöhe, width = image.shape print (image.shape) quater_height, quater_width = height / 4, width / 4 T = np.float32 (,]) img_translation = cv2.warpAffine (Bild, T, (Breite, Höhe)) print (T) cv2.imshow ('original_image', Bild) cv2.waitKey (0) cv2.imshow (' Übersetzung ', img_translation) cv2.waitKey (0) cv2.destroyAllWindows ()
Konsolenausgabe - (183, 275) - Höhe und Breite
- T-Matrix
]]
3. Rotation des Bildes - Drehen des Bildes
Durch Drehen des Bildes wird ein Bild um einen Punkt oder den Punkt in der Bildmitte gedreht, genau wie der Drehpunkt wie ein Drehpunkt wirkt.
Wie bei der Translation haben wir eine T-Matrix, wahrscheinlich haben wir bei einer Rotation eine M-Matrix
Rotationsmatrix, M-Matrix = Cosθ-Sinθ
Sinθ Cosθ
Wobei θ der Drehwinkel ist, gemessen gegen den Uhrzeigersinn.
Beachten Sie außerdem, dass Sie mit OpenCV mithilfe der Funktion cv2.getRotationMatrix2D (Rotationszentrum_x, Rotationszentrum_y, Drehwinkel, Skalierung) Bilder gleichzeitig verkaufen und drehen können.
Wir verwenden weiterhin die warpAffine-Funktion von opencv, um die Rotation des Bildes zu erhalten, aber anstelle der Translationsmatrix wie im vorherigen Fall verwenden wir hier die Rotationsmatrix.
import cv2 import numpy as np image = cv2.imread ('input.jpg') height, width = image.shape # Teilen Sie die Höhe und Breite um 2, um das Bild um die Mitte zu drehen. rotationsmatrix = cv2.getRotationMatrix2D ((width / 2), height / 2), 90,1) gedreht_image = cv2.warpAffine (Bild, Rotationsmatrix, (Breite, Höhe)) cv2.imshow ('Originalbild', Bild) cv2.waitKey (0) cv2.imshow ('gedrehtes Bild ', gedreht_Bild) cv2.waitKey (0) cv2.destroyAllWindows ()
Jetzt wird das Bild um 90 Grad gedreht und aufgrund der Leinwandgröße zugeschnitten, da die Leinwandgröße gleich bleibt, die Bildgröße jedoch aufgrund der Drehung nicht in die Leinwandgröße passt. Sie kann durch Einstellen des Skalierungsfaktors auf negativ angepasst werden, lässt jedoch einen schwarzen Hintergrund hinter dem Bild zu.
Sie können also die Höhe und Breite des Bildes einstellen, indem Sie es antizipieren oder erraten, oder es gibt eine andere Methode zum Drehen des Bildes, indem Sie es transponieren. Das Bild wird jedoch um ein Vielfaches von 90 Grad gegen den Uhrzeigersinn gedreht.
4. Skalieren, Ändern der Größe und Interpolation
Skalieren und Ändern der Größe sind affine Transformationen. Das Ändern der Bildgröße ist das, was wir schon seit einiger Zeit getan haben, und wir haben uns auch mit Interpolation befasst. Wenn Sie beispielsweise die Größe des Bilds auf eine größere Größe ändern, in der wir die Pixel erweitern, gibt es einige Lücken in der Pixel und hier kommt die Interpolation ins Spiel.
Dies kann auftreten, wenn die Bildgröße von kleiner auf größer erhöht oder die Bildgröße von größer auf kleiner verringert wird.
Technisch gesehen ist die Interpolation ein Verfahren zum Konstruieren neuer Datenpunkte (Pixel) innerhalb eines diskreten Satzes bekannter Datenpunkte.
Es gibt verschiedene Arten von Interpolationsmethoden in OpenCV wie
cv2.INTER_AREA - gut zum Verkleinern oder Verkleinern von Proben
cv2.INTER_NEAREST - am schnellsten
cv2.LINEAR - gut zum Zoomen oder Aufwärtsabtasten (Standard)
cv2.CUBIC - besser
cv2.INTER_LANCZOS4 - am besten
# Ändern der Größe ist sehr einfach, die cv2.resize Funktion verwenden, sind ihre Argumente # cv2.resize (Bild, dsize (Ausgabebildgröße), X_SCALE, Y_SCALE, Interpolation) import CV2 import numpy als np image = cv2.imread ("-Eingang. jpg ') cv2.imshow (' Original_image ', Bild) cv2.waitKey (0) # Lassen Sie das Bild 3/4 der Originalbildgröße entsprechen, dh auf 75% verkleinern. image_scaled = cv2.resize (Bild, Keine, fx = 0,75, fy = 0,75) # Da die lineare Interpolation die Standardmethode für Open CV ist, müssen wir sie nicht als Funktion implementieren. cv2.imshow ('scaling_linear interpolation', image_scaled) cv2.waitKey (0) # verdoppeln wir die Größe unseres Bildes img_double = cv2.resize (Bild, Keine, fx = 2, fy = 2, Interpolation = cv2.INTER_CUBIC) cv2.imshow ('scaing_cubicInterpolation', img_double) cv2.waitKey (0) # Nehmen wir die Größenänderung nach exakten Dimensionen vor image_resize = cv2.resize (image, (200.300), interpolation = cv2.INTER_AREA) cv2.imshow ('scaling_exact', image_resize) cv2.waitKey (0) cv2.destroyAllWindows ()
5. Bildpyramiden - Eine andere Möglichkeit, die Größe zu ändern
Das Pyramidenbild bezieht sich entweder auf das Hochskalieren (Vergrößern von Bildern) oder das Herunterskalieren (Verkleinern von Bildern).
Es ist einfach eine andere Art der Größenänderung, mit der wir Bilder einfach und schnell skalieren können, indem wir die Höhe und Breite des neuen Bildes um die Hälfte reduzieren.
Dies ist nützlich, wenn Sie Objektdetektoren erstellen, die die Bilder jedes Mal skalieren, wenn nach einem Objekt gesucht wird.
importiere cv2 image = cv2.imread ('input.jpg') kleiner = cv2.pyrDown (Bild) größer = cv2.pyrUp (kleiner) cv2.imshow ('original', Bild) cv2.waitKey (0) cv2.imshow ('kleiner', kleiner) cv2.waitKey (0) cv2.imshow ('größer', größer) cv2.waitKey (0) cv2.destroyAllWindows ()
Bei größeren Bildern werden Sie feststellen, dass es immer noch die gleiche Größe wie das Originalbild hat und ein wenig verschwommen ist, da es direkt von einem kleineren Bild in ein größeres Bild konvertiert wird. Wenn wir es jedoch interpolieren, wird die Bildqualität gegenüber der vorherigen verbessert, da durch Interpolation die Pixel geschätzt werden, während die Räume ausgefüllt werden, wenn das Bild vergrößert wird.
Wenn Sie jetzt denselben Code ausführen, jedoch mit kubischer Interpolation, erhalten Sie eine bessere Qualität für große Bilder. Die folgenden Bilder zeigen den Vergleich zwischen Originalbild, vergrößerter Version des Bildes, kleinerem Bild und kubisch interpolierter Version des kleineren Bildes.
cv2 importieren image = cv2.imread ('input.jpg') kleiner = cv2.pyrDown (Bild) größer = cv2.pyrUp (kleiner) cv2.imshow ('Original', Bild) cv2.waitKey (0) cv2.imshow ('kleiner', kleiner) cv2.waitKey (0) cv2.imshow ('größer', größer) cv2.waitKey (0) # Erhöhen der Qualität von konvertierten größeren Bildern aus kleineren Bildern mithilfe der kubischen Interpolation img_double = cv2.resize (kleiner, Keine, fx = 2, fy = 2, Interpolation = cv2.INTER_CUBIC) cv2.imshow ('scaing_cubicInterpolation', img_double) cv2.waitKey (0) cv2.destroyAllWindows ()
HINWEIS: Wenn Sie mehrere kleine Kopien von Bildern erstellen möchten, deren Größe immer kleiner wird, oder mehrere große Kopien von Bildern, deren Größe kontinuierlich zunimmt, können Sie for- Schleifen oder while- Schleifen verwenden, die innerhalb der pyrDown- oder pyrUp- Funktion bleiben .
6. Zuschneiden - Schneiden Sie den gewünschten Bildbereich aus
Das Zuschneiden von Bildern bezieht sich auf das Extrahieren eines Bildsegments.
OpenCV hat direkt keine Zuschneidefunktion, kann aber einfach mit dem folgenden Code durch Numpy ausgeführt werden
Beschnitten = Bild
Wir setzen das Bildarray und definieren mithilfe von Indizierungswerkzeugen oder -methoden in numpy Startzeile zu Endzeile und Startspalte zu Endspalte, getrennt durch ein Komma, das das Rechteck extrahiert, das wir zuschneiden möchten, um das Bild zu erhalten.
importiere cv2 importiere numpy als np image = cv2.imread ('input.jpg') height, width = image.shape # lass uns die Startpixelkoordinaten (oben links im Zuschneiderechteck) starten start_row, start_col = int (height *.25), int (width *.25) # Lassen Sie uns die Endpixelkoordinaten (unten rechts) erhalten. end_row, end_col = int (height *.75), int (width *.75) # Verwenden Sie einfach die Indizierung, um das gewünschte Rechteck auszuschneiden = Bild cv2.imshow ("Originalbild", Bild) cv2.waitKey (0) cv2.imshow ("zugeschnittenes Bild", zugeschnitten ) cv2.waitKey (0) cv2.destroyAllWindows ()
Beachten Sie, dass Sie Pixelwerte direkt anstelle von start_col oder start_row verwenden können. Sie werden nur angegeben, um dem Benutzer eine einfache Identifizierung zu ermöglichen.
7. Arithmetische Operationen zum Aufhellen und Abdunkeln von Bildern
Arithmetische Operationen in OpenCV sind im Wesentlichen das Hinzufügen oder Subtrahieren von Matrizen zum Bild. Das Hinzufügen oder Subtrahieren von Matrizen wirkt sich auf das Erhöhen oder Verringern der Helligkeit aus.
Um also Matrizen zu addieren oder zu subtrahieren, müssen wir sie erstellen und numpy hat eine Funktion namens np.ones , die Matrizen mit der gleichen Größe wie unser Bild ergibt.
import cv2 import numpy as np image = cv2.imread ('input.jpg') #Erstelle eine eigene Matrix und multipliziere sie dann mit einem Skalierer von 100 ' # np.ones ergibt eine Matrix mit der gleichen Dimension wie unser Bild mit allen Die Werte sind in diesem Fall 100 M = np.ones (image.shape, dtype = "uint8") * 100 # Wir verwenden dies, um diese Matrix M zu unserem Bild hinzuzufügen. # Beachten Sie die Zunahme der hinzugefügten Helligkeit = cv2.add (Bild, M) cv2.imshow ("Added", hinzugefügt) cv2.waitKey (0) #likewise können wir auch subtrahieren #notice die Abnahme der Helligkeit subtrahiert = cv2.subtract (Bild, M) cv2.imshow ("subtrahiert", subtrahiert) cv2.waitKey (0) cv2.destroyAllWindows ()
Auf diese Weise kann OpenCV verwendet werden, um viele verschiedene Bildverarbeitungsvorgänge auf Bilder anzuwenden. Wir werden im nächsten Tutorial mit anderen Bildbearbeitungsfunktionen fortfahren.