Encuentra círculos y elipses en una imagen usando OpenCV | Python

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 = 4*pi*Area/(perimeter)^2. 

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *