OpenCV Blob- oder Kreis-Erkennung
In diesem Tutorial wird das Erkennen von Blobs oder Kreisen in einem Bild mit der Klasse SimpleBlobDetector
von OpenCV in Python erläutert.
Verwenden die SimpleBlobDetector
-Klasse von OpenCV, um Blobs oder Kreise in einem Bild in Python zu erkennen
Wir können Blobs oder Kreise in einem Bild mit der Klasse SimpleBlobDetector
von OpenCV erkennen. Wir können einen Klecks oder einen Kreis anhand seiner Fläche, Rundheit, Konvexität und Trägheit erkennen.
Wenn wir Blobs oder Kreise erkennen möchten, die in einen bestimmten Bereich fallen, müssen wir das Argument filterByArea
auf true setzen. Dann können wir mit dem Parameter minArea
die minimale Fläche des Blobs und mit dem Parameter maxArea
die maximale Fläche des Blobs einstellen.
Blobs, die kleiner oder größer als der angegebene Bereich sind, werden nicht erkannt. Wir können die Methode Params()
der Klasse SimpleBlobDetector
verwenden, um die zu erkennende Form zu ändern.
Wir können die Funktion drawKeypoints()
von OpenCV verwenden, um die von der Funktion erkannten Blobs hervorzuheben.
Lassen Sie uns beispielsweise einige Blobs in einem bestimmten Bild in Abhängigkeit vom Blobbereich erkennen. Siehe Code unten.
import cv2
import numpy as np
image = cv2.imread("blob2.jpg", 0)
params = cv2.SimpleBlobDetector_Params()
params.filterByArea = True
params.minArea = 100
detector = cv2.SimpleBlobDetector_create(params)
keypoints = detector.detect(image)
blank = np.zeros((1, 1))
blobs = cv2.drawKeypoints(
image, keypoints, blank, (0, 0, 255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS
)
cv2.imshow("Blobs Using Area", blobs)
cv2.waitKey(0)
cv2.destroyAllWindows()
Ausgabe:
Stellen Sie filterByCircularity
auf Blobs oder Kreise in einem Bild in Python filtern
Wir können einen Blob auch anhand seiner Kreisförmigkeit erkennen, wodurch überprüft wird, wie sehr die Form kreisförmig ist. Kreisförmigkeit ist 1 für einen Kreis und 0,78 für eine Box.
Wenn wir nur kreisförmige Blobs erkennen wollen, müssen wir das Argument filterByCircularity
auf True setzen. Dann können wir mit minCircularity
und maxCircularity
den minimalen und maximalen Rundheitswert für die Form festlegen.
Blobs mit einer größeren oder kleineren Rundheit als angegeben werden nicht erkannt. Lassen Sie uns zum Beispiel die Zirkularität im obigen Beispiel festlegen. Siehe Code unten.
import cv2
import numpy as np
image = cv2.imread("blob2.jpg", 0)
params = cv2.SimpleBlobDetector_Params()
params.filterByArea = True
params.minArea = 100
params.filterByCircularity = True
params.minCircularity = 0.9
detector = cv2.SimpleBlobDetector_create(params)
keypoints = detector.detect(image)
blank = np.zeros((1, 1))
blobs = cv2.drawKeypoints(
image, keypoints, blank, (0, 0, 255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS
)
cv2.imshow("Using area,circularity", blobs)
cv2.waitKey(0)
cv2.destroyAllWindows()
Ausgabe:
Wie Sie sehen können, wurden in der obigen Ausgabe nur kreisförmige Blobs erkannt.
Setzen Sie filterByConvexity
auf Filter Blobs oder Circles in an Image in Python
Wir können Blobs auch anhand ihrer Konvexität filtern. Zuerst müssen wir das Argument filterByConvexity
auf true setzen, und dann können wir mit minConvexity
und maxConvexity
den minimalen und maximalen Wert der Konvexität festlegen.
Eine Ellipse ist auch ein Kreis, wird zusammen mit einem perfekten Kreis ebenfalls erkannt. Wir können das Argument filterInertia
verwenden, um die Blobs anhand der Trägheit von Formen zu filtern.
Bei einem perfekten Kreis beträgt die Trägheit 1 und bei einer Ellipse liegt sie zwischen 0 und 1. Wir können minInertiaRatio
und maxInertiaRatio
verwenden, um den minimalen und maximalen Wert der Trägheit festzulegen.
Wir können auch die Anzahl der Blobs auf dem Bild anzeigen, indem wir die Funktion putText()
von OpenCV verwenden.
Lassen Sie uns beispielsweise den Wert für Konvexität und Trägheit festlegen und die Anzahl der erkannten Blobs über dem angegebenen Bild anzeigen. Siehe Code unten.
import cv2
import numpy as np
image = cv2.imread("blob2.jpg", 0)
params = cv2.SimpleBlobDetector_Params()
params.filterByArea = True
params.minArea = 100
params.filterByCircularity = True
params.minCircularity = 0.9
params.filterByConvexity = True
params.minConvexity = 0.2
params.filterByInertia = True
params.minInertiaRatio = 0.01
detector = cv2.SimpleBlobDetector_create(params)
keypoints = detector.detect(image)
blank = np.zeros((1, 1))
blobs = cv2.drawKeypoints(
image, keypoints, blank, (0, 0, 255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS
)
number_of_blobs = len(keypoints)
text = "Circular Blobs: " + str(len(keypoints))
cv2.putText(blobs, text, (10, 100), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 0, 255), 2)
cv2.imshow("Original Image", image)
cv2.imshow("Circular Blobs Only", blobs)
cv2.waitKey(0)
cv2.destroyAllWindows()
Ausgabe:
Wir können auch die Position, die Schriftfamilie, die Schriftskalierung, die Farbe und die Linienstärke des Textes festlegen. Zum Vergleich haben wir auch das Originalbild auf der linken Seite gezeigt.
Wir können Blobs auch nach ihren Farben filtern, indem wir das Argument filterByColor
auf true setzen. Dann können wir minThreshold
und maxThreshold
verwenden, um diese minimalen und maximalen Schwellenwerte der Farbe festzulegen, die wir erkennen möchten.
Blobs mit Farbwerten kleiner oder größer als der angegebene Schwellenwert werden nicht erkannt. Wir können auch andere Formen erkennen, indem wir die Parameter der Klasse SimpleBlobDetector
ändern.
Zum Beispiel haben wir im obigen Beispiel den kreisförmigen Blob erkannt, aber wir können auch Blobs mit anderen Formen wie einen rechteckigen Blob erkennen.
Klicken Sie auf diesen Link, um weitere Details zu den Parametern der Klasse SimpleBlobDetector
zu erhalten.
Verwandter Artikel - Python OpenCV
- Bildmaskierung in OpenCV
- Kein Modul mit dem Namen CV2 in Mac in Python
- OpenCV ArUco-Marker
- OpenCV Canny in Python
- OpenCV-contrib-Modul in Python
- OpenCV-Paketkonfiguration