¿Cómo usar los componentes conectados de openCV con estadísticas en python?

Estoy buscando un ejemplo de cómo usar la función ConnectedComponentsWithStats () de OpenCV en python, tenga en cuenta que esto solo está disponible con OpenCV 3 o más reciente. La documentación oficial solo muestra la API para C ++, aunque la función existe cuando se comstack para python. No pude encontrarlo en ningún lugar en línea.

La función funciona de la siguiente manera:

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

Etiquetas es una matriz del tamaño de la imagen de entrada donde cada elemento tiene un valor igual a su etiqueta.

Estadísticas es una matriz de las estadísticas que la función calcula. Tiene una longitud igual al número de tags y un ancho igual al número de estadísticas. Puede usarse con la documentación de OpenCV para ello:

La salida de estadísticas para cada etiqueta, incluida la etiqueta de fondo, vea a continuación las estadísticas disponibles. Se accede a las estadísticas a través de las estadísticas [etiqueta, COLUMNA] donde las columnas disponibles se definen a continuación.

  • cv2.CC_STAT_LEFT La coordenada más a la izquierda (x) que es el inicio inclusivo del cuadro delimitador en la dirección horizontal.
  • cv2.CC_STAT_TOP La coordenada superior (y) que es el inicio inclusivo del cuadro delimitador en la dirección vertical.
  • cv2.CC_STAT_WIDTH El tamaño horizontal del cuadro delimitador
  • cv2.CC_STAT_HEIGHT El tamaño vertical del cuadro delimitador
  • cv2.CC_STAT_AREA El área total (en píxeles) del componente conectado

Centroides es una matriz con las ubicaciones x e y de cada centroide. La fila en esta matriz corresponde al número de etiqueta.

Agregando a la respuesta de Zack Knopp , si está usando una imagen en escala de grises, simplemente puede usar:

 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) 

Cuando intenté usar la respuesta de Zack Knopp en una imagen en escala de grises, no funcionó y esa fue mi solución.

He venido aquí varias veces para recordar cómo funciona y cada vez que tengo que reducir el código anterior para:

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

Con suerte, es útil para todos 🙂