Requisito previo: ¿Cómo detectar formas en imágenes en Python usando OpenCV?
En este artículo, aprenderemos cómo encontrar centros de contornos usando OpenCV en python. Usaremos las funciones findContours() y moment().
Usaremos la siguiente imagen para la detección del punto central:
Implementación paso a paso
Paso 1: Importe el módulo requerido.
Python3
import cv2 as cv import numpy as np
Paso 2: Umbral de la imagen.
Antes de ir a la detección de contorno, tenemos que umbralizar la imagen de arriba, lo que podemos hacer usando el siguiente fragmento:
Python3
# change it with your absolute path for the image image = cv.imread("shape.png") gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY) blur = cv.GaussianBlur(gray, (5, 5), cv.BORDER_DEFAULT) ret, thresh = cv.threshold(blur, 200, 255, cv.THRESH_BINARY_INV)
Los parámetros de umbral y desenfoque se pueden cambiar y le recomendamos que intente ajustarlos para ver cuántos contornos se detectan con los parámetros dados.
Puede guardar la salida del umbral usando:
Python3
cv.imwrite("thresh.png",thresh)
Producción:
True
Así es como debería verse:
Encontraremos contornos de la imagen con umbral utilizando el método findContours() que devuelve dos valores, una lista de todos los contornos y sus jerarquías. Ahora bien, ¿qué son los contornos? En palabras simples, un contorno es una lista o árbol de listas de puntos. Estos puntos describen cómo un contorno, es decir, un vector que podría dibujarse como un contorno alrededor de las partes de la forma en función de una diferencia con respecto a un fondo. La jerarquía, por otro lado, muestra cómo las formas se relacionan entre sí, las capas como tales o si las formas están una encima de la otra. Esto se puede determinar mediante jerarquías.
Paso 3: Ahora, para encontrar los contornos y las jerarquías en la imagen con umbral, podemos usar el método findContours() como se muestra a continuación:
Python3
contours, hierarchies = cv.findContours( thresh, cv.RETR_LIST, cv.CHAIN_APPROX_SIMPLE)
Para simplificar y comprender cómo funcionan los contornos y verificar cuántos contornos podemos encontrar en una imagen con umbral, podemos dibujarlos en una array de imagen en blanco usando el siguiente fragmento:
Python3
blank = np.zeros(thresh.shape[:2], dtype='uint8') cv.drawContours(blank, contours, -1, (255, 0, 0), 1) cv.imwrite("Contours.png", blank)
Producción:
True
así es como debería verse la imagen:
Paso 4: Archiva todos los puntos centrales y dibújalos en la imagen.
Ahora, para encontrar los puntos centrales, usaremos el método moment(). Aquí lo usaremos para encontrar el momento de la imagen para un contorno particular. Un momento de imagen es un promedio ponderado particular de las intensidades de píxeles de la imagen, con la ayuda del cual podemos encontrar algunas propiedades específicas de una imagen, por ejemplo, radio, área, centroide, etc.
Para encontrar el centroide de la imagen, usamos la fórmula particular:
cx = (M10 / M00 )
cy = ( M01 / M00 )
donde cx y cy son las coordenadas x e y del punto central y M es el momento
El siguiente fragmento encuentra todos los puntos centrales y los dibuja en la imagen.
Python3
for i in contours: M = cv.moments(i) if M['m00'] != 0: cx = int(M['m10']/M['m00']) cy = int(M['m01']/M['m00']) cv.drawContours(image, [i], -1, (0, 255, 0), 2) cv.circle(image, (cx, cy), 7, (0, 0, 255), -1) cv.putText(image, "center", (cx - 20, cy - 20), cv.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 0), 2) print(f"x: {cx} y: {cy}")
Paso 5: Finalmente, podemos guardar la imagen usando:
Python3
cv.imwrite("image.png", image)
Producción:
True
Así quedaría la imagen final:
Publicación traducida automáticamente
Artículo escrito por fallenvalkyrie y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA