2016-03-07 14 views

risposta

38

La funzione funziona come segue:

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

etichette è una matrice la dimensione dell'immagine di input dove ogni elemento ha un valore pari al etichetta.

Statistiche è una matrice delle statistiche che la funzione calcola. Ha una lunghezza pari al numero di etichette e una larghezza pari al numero di statistiche. Può essere utilizzato con la documentazione OpenCV per esso:

Statistiche di uscita per ogni etichetta, tra cui l'etichetta di fondo, vedi sotto per statistiche disponibili. Le statistiche sono accessibili tramite stats [label, COLUMN] dove le colonne disponibili sono definite di seguito.

  • cv2.CC_STAT_LEFT Il più a sinistra (x) coordina, che è l'inizio comprensivo del riquadro in direzione orizzontale.
  • cv2.CC_STAT_TOP La coordinata più in alto (y) che rappresenta l'inizio inclusivo del riquadro di delimitazione nella direzione verticale.
  • cv2.CC_STAT_WIDTH La dimensione orizzontale del riquadro di delimitazione
  • cv2.CC_STAT_HEIGHT La dimensione verticale del riquadro di delimitazione
  • cv2.CC_STAT_AREA L'area totale (in pixel) del componente collegato

centroidi è una matrice con x e Y posizione di ogni centroide. La riga in questa matrice corrisponde al numero dell'etichetta.

+0

Devo dire che per qualche ragione, ho dovuto usare cv2.THRESH_BINARY invece di cv2.THRESH_BINARY + cv2.THRESH_OTSU, quindi ho dovuto trasmettere src a integer e thresh a float perché funzioni. Non so perché, ma non ha funzionato diversamente. –

+0

Non capisco perché crei la matrice delle etichette quando è comunque parte dell'output? – ypnos

+1

@ypnos Non è necessario per i componenti collegati con le statistiche, ma per componenti collegati senza statistiche. Penso che quella parte sia stata lasciata da me, facendo il contrario. L'ho risolto ora. Saluti! –

0

Aggiungendo a Zack Knopp risposta, Se si utilizza una scala di grigio è possibile utilizzare semplicemente:

import cv2 
import numpy as np 

src = cv2.imread("path\\to\\image.png", 0) 
binary_map = (src > 0).astype(np.uint8) 
output = cv2.connectedComponentsWithStats(binary_map, connectivity, cv2.CV_32S) 

Quando ho provato ad utilizzare Zack Knopp risposta su un'immagine in scala di grigi non ha funzionato e questo era la mia soluzione.