Bildfarberkennung mit OpenCV in Python
Die OpenCV-Bibliothek wurde erstellt, um bei Computer Vision-Aufgaben zu helfen, und ist mit verschiedenen Programmiersprachen kompatibel. Die Bibliothek verfügt über Implementierungen verschiedener hilfreicher Algorithmen und Techniken zur Bildverarbeitung.
Dieses Tutorial zeigt, wie Sie die Farberkennung in einem Bild mit der OpenCV-Bibliothek von Python durchführen.
Es gibt verschiedene Anwendungen für die Farberkennung. Wir können es verwenden, um Objekte im wirklichen Leben zu unterscheiden. Dies kann auch als Bildsegmentierungstechnik betrachtet werden, da wir versuchen, jedes Pixel basierend auf ähnlichen Merkmalen zu kennzeichnen.
Wir erkennen die Farbe anhand des HSV-Farbraums, der für Hue Saturation Value steht. Dies ist ein zylindrischer Farbraum, der beim Arbeiten mit Farbinformationen sehr nützlich ist.
Farbton bestimmt die Farbinformationen, Sättigung stellt die Intensität der Farbe dar und Wert bestimmt die Helligkeit basierend darauf, wie stark die Farbe mit Schwarz gemischt wird.
Bildfarberkennung mit der OpenCV-Bibliothek in Python
Wir werden verschiedene Funktionen aus der OpenCV-Bibliothek zur Farberkennung verwenden. Lassen Sie uns sie unten besprechen.
Wir werden eine bestimmte Farbe in einem bestimmten Bild erkennen und Grenzen um die erkannten Segmente hinzufügen.
Wir müssen das gewünschte Bild aus dem BGR-Farbraum in HSV umwandeln. Um solche Konvertierungen in Bildern durchzuführen, können wir die Funktion cvtColor()
aus der OpenCV-Bibliothek verwenden.
Wir brauchen die Grenzen für die gegebene Farbe und geben eine binäre Maske der Stellen zurück, an denen die Farbe im Bild vorhanden ist. Die Funktion inRange()
von OpenCV nimmt ein gegebenes Bild und gibt die binäre Maske zurück, in der die Farbe derzeit auf den angegebenen oberen und unteren Grenzen basiert.
Diese Maske ist die Teilmenge des Bildes, in der die Farbe erkannt wird.
Wir können dann morphologische Operationen auf diese binäre Maske anwenden, um unerwünschtes Rauschen zu filtern. Dazu verwenden wir die Funktion morphologyex()
aus der OpenCV-Bibliothek.
Es führt eine Erosion nach der Dilatation durch, um kleine Löcher im Objekt zu schließen.
Wir müssen dem Bild auch Grenzen hinzufügen, indem wir diese erstellte Binärmaske verwenden.
bitwise_and()
wird verwendet, um die Teile des Bildes zu segmentieren, die zu einer gegebenen Maske passen. Die Maske wird über den Parameter mask
bereitgestellt.
Es vergleicht jedes Pixel aus dem Quellbild und stimmt mit dem entsprechenden in der angegebenen Maske überein.
Um die Grenzen zu diesem segmentierten Bild hinzuzufügen, verwenden wir die beiden Methoden findContours()
und drawContours()
. Diese Kontur kann man sich als eine Kurve vorstellen, die Punkte entlang einer Grenze für ein segmentiertes Bild verbindet.
Die erste Funktion gibt eine Liste aller Konturen für das angegebene Bild zurück. Wir werden die Funktion drawcontours()
verwenden, um die Konturen zu zeichnen.
Lassen Sie uns nun den Code zur Farberkennung implementieren und die grüne Farbe im folgenden Bild finden.
Code:
import cv2
import numpy as np
img = cv2.imread("img3.jpeg")
hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
bound_lower = np.array([25, 20, 20])
bound_upper = np.array([100, 255, 255])
mask_green = cv2.inRange(hsv_img, bound_lower, bound_upper)
kernel = np.ones((7, 7), np.uint8)
mask_green = cv2.morphologyEx(mask_green, cv2.MORPH_CLOSE, kernel)
mask_green = cv2.morphologyEx(mask_green, cv2.MORPH_OPEN, kernel)
seg_img = cv2.bitwise_and(img, img, mask=mask_green)
contours, hier = cv2.findContours(
mask_green.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE
)
output = cv2.drawContours(seg_img, contours, -1, (0, 0, 255), 3)
cv2.imshow("Result", output)
cv2.waitKey(0)
cv2.destroyAllWindows()
Ausgabe:
Lassen Sie uns nun über den implementierten Code informiert werden.
Die Funktion imread()
liest das Bild. Wir haben den Farbraum dieses Bildes mit der Funktion cvtColor()
von BGR nach HSV konvertiert; Beachten Sie den Parameter cv2.COLOR_BGR2HSV
innerhalb der Funktion.
Wir haben dann die oberen und unteren Grenzwerte angegeben, um die grüne Farbe im Bild zu erkennen, und die binäre Maske mit der Funktion inRange()
erstellt.
Aus dieser Maske wird das Rauschen mit der Funktion morphologyEx()
zweimal entfernt.
Mit dem Parameter cv2.MORPH_CLOSE
haben wir erstmals das weisse Rauschen aus dem schwarzen Anteil herausgefiltert. Und zum zweiten Mal haben wir den cv2.MORPH_CLOSE
verwendet, um schwarzes Rauschen aus dem weißen Teil herauszufiltern.
Dann haben wir die Grenzen auf dem segmentierten Teil gezogen. Wir haben den segmentierten Teil und seine Konturen mit der Methode findContours()
bestimmt und die Grenze mit der Methode drawContours()
gezeichnet.
Fazit
In diesem Tutorial wurde erläutert, wie Sie eine Farberkennung mit OpenCV in Python durchführen. Wir haben mit einem Bild gearbeitet und die Teile erkannt, die der grünen Farbe entsprachen.
Damit sind mehrere Schritte verbunden. Wir müssen das Bild in den korrekten HSV-Farbraum konvertieren und die Maske für die erforderliche Farbe erstellen.
Dann müssen wir das Rauschen aus dieser Maske herausfiltern. Diese Maske wird dann mit dem Originalbild verwendet, um den erkannten Teil zu segmentieren, und wir ziehen Grenzen darüber.
Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.
LinkedIn