OpenCV Blob- oder Kreis-Erkennung

Ammar Ali 12 April 2022
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:

Blob mit Bereich

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:

Blob unter Verwendung von Fläche und Kreisförmigkeit

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:

Blob mit allen Filtern

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.

Autor: Ammar Ali
Ammar Ali avatar Ammar Ali avatar

Hello! I am Ammar Ali, a programmer here to learn from experience, people, and docs, and create interesting and useful programming content. I mostly create content about Python, Matlab, and Microcontrollers like Arduino and PIC.

LinkedIn Facebook

Verwandter Artikel - Python OpenCV

Verwandter Artikel - OpenCV Image