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.
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.
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.