web-dev-qa-db-fra.com

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 cela n'est disponible qu'avec OpenCV version 3 ou ultérieure. 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 le trouver nulle part en ligne.

31
Zack Knopp

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]

Labels est une matrice de la taille de l'image d'entrée où chaque élément a une valeur égale à son label.

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

Résultats statistiques pour chaque étiquette, y compris l'étiquette d'arrière-plan, voir ci-dessous pour les statistiques disponibles. Les statistiques sont accessibles via stats [étiquette, COLUMN] où les colonnes disponibles sont définies ci-dessous.

  • cv2.CC_STAT_LEFT La coordonnée la plus à gauche (x) correspondant au début inclusif du cadre de sélection dans la direction horizontale.
  • cv2.CC_STAT_TOP La coordonnée la plus haute (y) qui correspond au début inclusif du cadre de sélection dans la direction verticale.
  • cv2.CC_STAT_WIDTH La taille horizontale du cadre de sélection
  • cv2.CC_STAT_HEIGHT La taille verticale du cadre de sélection
  • cv2.CC_STAT_AREA La surface totale (en pixels) du composant connecté

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

73
Zack Knopp

Ajout à Zack Knopp _ réponse, si vous utilisez une image en niveaux de gris, 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é d'utiliser Zack Knopp réponse sur une image en niveaux de gris cela ne fonctionnait pas et c'était ma solution.

5
Barel Levy

Je suis venu ici plusieurs fois pour me rappeler comment cela fonctionne et chaque fois que je dois réduire le code ci-dessus à:

_, 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)

J'espère que c'est utile pour tout le monde :)

2
Dan Erez