Para identificar círculos, elipses o, en general, cualquier forma en la que los píxeles estén conectados, usamos la función SimpleBlobDetector() de OpenCV. En términos no técnicos, se entiende por blob una gota espesa de líquido. Aquí, vamos a llamar a todas las formas una mancha. Nuestra tarea es detectar y reconocer si la mancha es un círculo o no.
OpenCV proporciona una forma conveniente de detectar blobs y filtrarlos en función de diferentes características. Hay varios parámetros diferentes que controlan el proceso de identificación y los resultados. Los parámetros importantes utilizados para este proyecto son:
- Filtrar por área: esto es para evitar cualquier identificación de pequeños puntos presentes en la imagen que pueden detectarse erróneamente como un círculo.
- Filtrar por circularidad: esto nos ayuda a identificar formas que se parecen más a un círculo.
Circularity = .
Un círculo verdadero tiene una circularidad de 1, un cuadrado tiene una circularidad cercana al 78%.
- Filtrar por Convexidad – La concavidad en general, destruye la circularidad. Más es la convexidad, cuanto más cerca está de un círculo cerrado.
- Filtrar por inercia: los objetos similares a un círculo tienen una inercia mayor. Por ejemplo, para un círculo, este valor es 1, para una elipse está entre 0 y 1, y para una línea es 0. Para filtrar por relación de inercia, establezca filterByInertia = 1 y establezca 0 <= minInertiaRatio <= 1 y maxInertiaRatio (<=1 ) de forma adecuada.
A continuación se muestra el código para identificar los círculos:
Python3
import cv2 import numpy as np # Load image image = cv2.imread('C://gfg//images//blobs.jpg', 0) # Set our filtering parameters # Initialize parameter setting using cv2.SimpleBlobDetector params = cv2.SimpleBlobDetector_Params() # Set Area filtering parameters params.filterByArea = True params.minArea = 100 # Set Circularity filtering parameters params.filterByCircularity = True params.minCircularity = 0.9 # Set Convexity filtering parameters params.filterByConvexity = True params.minConvexity = 0.2 # Set inertia filtering parameters params.filterByInertia = True params.minInertiaRatio = 0.01 # Create a detector with the parameters detector = cv2.SimpleBlobDetector_create(params) # Detect blobs keypoints = detector.detect(image) # Draw blobs on our image as red circles blank = np.zeros((1, 1)) blobs = cv2.drawKeypoints(image, keypoints, blank, (0, 0, 255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) number_of_blobs = len(keypoints) text = "Number of Circular Blobs: " + str(len(keypoints)) cv2.putText(blobs, text, (20, 550), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 100, 255), 2) # Show blobs cv2.imshow("Filtering Circular Blobs Only", blobs) cv2.waitKey(0) cv2.destroyAllWindows()
Producción:
Publicación traducida automáticamente
Artículo escrito por Sourabh_Sinha y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA