Sto cercando un esempio di come utilizzare la funzione ConnectedComponentsWithStats() di OpenCV in python, si noti che questo è disponibile solo con OpenCV 3 o versioni successive. La documentazione ufficiale mostra solo l'API per C++, anche se la funzione esiste quando compilata per python. Non riuscivo a trovarlo ovunque online.Come utilizzare i componenti connessi di openCV con le statistiche in python?
risposta
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.
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.
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. –
Non capisco perché crei la matrice delle etichette quando è comunque parte dell'output? – ypnos
@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! –