web-dev-qa-db-de.com

Wie verwende ich die verbundenen openCV-Komponenten mit Statistiken in Python?

Ich suche nach einem Beispiel für die Verwendung der OpenCV-Funktion ConnectedComponentsWithStats () in Python. Beachten Sie, dass dies nur mit OpenCV 3 oder höher möglich ist. Die offizielle Dokumentation zeigt nur die API für C++, obwohl die Funktion bei der Kompilierung für Python vorhanden ist. Ich konnte es nirgendwo online finden.

31
Zack Knopp

Die Funktion funktioniert wie folgt:

# Import the cv2 library
import cv2
# Read the image you want connected components of
src = cv2.imread('/directorypath/image.bmp')
# Threshold it so it becomes binary
ret, thresh = cv2.threshold(src,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
# You need to choose 4 or 8 for connectivity type
connectivity = 4  
# Perform the operation
output = cv2.connectedComponentsWithStats(thresh, connectivity, cv2.CV_32S)
# Get the results
# The first cell is the number of labels
num_labels = output[0]
# The second cell is the label matrix
labels = output[1]
# The third cell is the stat matrix
stats = output[2]
# The fourth cell is the centroid matrix
centroids = output[3]

Labels ist eine Matrix mit der Größe des Eingabebildes, wobei jedes Element einen Wert hat, der der Bezeichnung entspricht.

Stats ist eine Matrix der Statistiken, die die Funktion berechnet. Die Länge entspricht der Anzahl der Etiketten und die Breite der Anzahl der Statistiken. Es kann mit der OpenCV-Dokumentation dafür verwendet werden:

Die Statistikausgabe für jedes Etikett, einschließlich des Hintergrundetiketts, enthält Informationen zu den verfügbaren Statistiken. Der Zugriff auf die Statistiken erfolgt über stats [label, COLUMN], wobei die verfügbaren Spalten unten definiert sind.

  • cv2.CC_STAT_LEFT Die am weitesten links stehende (x) Koordinate, die den Einschlussanfang des Begrenzungsrahmens in horizontaler Richtung darstellt.
  • cv2.CC_STAT_TOP Die oberste (y) Koordinate, die der inklusive Beginn des Begrenzungsrahmens in vertikaler Richtung ist.
  • cv2.CC_STAT_WIDTH Die horizontale Größe des Begrenzungsrahmens
  • cv2.CC_STAT_HEIGHT Die vertikale Größe des Begrenzungsrahmens
  • cv2.CC_STAT_AREA Die Gesamtfläche (in Pixel) der verbundenen Komponente

Centroids ist eine Matrix mit den x- und y-Positionen jedes Schwerpunkts. Die Zeile in dieser Matrix entspricht der Beschriftungsnummer.

73
Zack Knopp

Hinzufügen zu Zack Knopp answer, Wenn Sie ein Graustufenbild verwenden, können Sie einfach Folgendes verwenden:

import cv2
import numpy as np

src = cv2.imread("path\\to\\image.png", 0)
binary_map = (src > 0).astype(np.uint8)
connectivity = 4 # or whatever you prefer

output = cv2.connectedComponentsWithStats(binary_map, connectivity, cv2.CV_32S)

Als ich versuchte, Zack Knopp antworte auf ein Graustufenbild, es hat nicht funktioniert und das war meine Lösung.

5
Barel Levy

Ich bin ein paar Mal hierher gekommen, um mich daran zu erinnern, wie es funktioniert und jedes Mal muss ich den obigen Code auf Folgendes reduzieren:

_, thresh = cv2.threshold(src,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
connectivity = 4  # You need to choose 4 or 8 for connectivity type
num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(thresh , connectivity , cv2.CV_32S)

Hoffentlich ist es für alle nützlich :)

2
Dan Erez