Comment utiliser les composants connectés d'openCV avec les statistiques en python?

je cherche un exemple d'utilisation de la fonction ConnectedComponentsWithStats() D'OpenCV en python, notez que ceci n'est disponible qu'avec OpenCV 3 ou plus récent. La documentation officielle ne montre que l'API pour C++, même si la fonction existe lorsqu'elle est compilée pour python. Je ne pouvais pas le trouver n'importe où en ligne.

18
demandé sur Zack Knopp 2016-03-08 00:16:44

2 réponses

La fonction fonctionne comme suit:

# 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]

Étiquettes est une matrice de la taille de l'image d'entrée, où chaque élément a une valeur égale à son étiquette.

Statistiques est une matrice des statistiques que la fonction calcule. Il a une longueur égale au nombre d'étiquettes et d'une largeur égale au nombre de stats. Il peut être utilisé avec la documentation OpenCV pour it:

production de statistiques pour chaque étiquette, y compris la étiquette de fond, voir ci-dessous pour les statistiques disponibles. Les statistiques sont accessibles via stats[label, COLUMN] lorsque les colonnes disponibles sont définies ci-dessous.

  • cv2.CC_STAT_LEFT la coordonnée la plus à gauche (x) qui est le début inclusif de la boîte de limite dans la direction horizontale.
  • cv2.CC_STAT_TOP la coordonnée supérieure (y) qui est le début inclusif de la boîte de limite dans la verticale direction.
  • cv2.CC_STAT_WIDTH la taille horizontale de la boîte limite
  • cv2.CC_STAT_HEIGHT la taille verticale de la boîte de limite
  • cv2.CC_STAT_AREA la surface totale (en pixels) du composant connecté

Centroïdes est une matrice avec les positions x et y de chaque centroïde. La ligne de cette matrice correspond au numéro de l'étiquette.

54
répondu Zack Knopp 2016-07-04 17:14:59

ajouter à Zack Knopp répondre, Si vous utilisez une image en niveaux de gris que vous pouvez simplement utiliser:

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)

quand j'ai essayé Zack Knopp réponse sur une image en niveaux de gris, il n'a pas de travail et que c'était ma solution.

2
répondu Barel Levy 2018-03-28 10:52:38