Saltar al contenido

¿Obtener área dentro de los contornos Opencv Python?

Contamos con tu apoyo para compartir nuestras crónicas referente a las ciencias de la computación.

Solución:

Lo que tienes es casi correcto. Si observa su imagen con umbral, la razón por la que no funciona es porque su objeto de zapato tiene huecos en la imagen Específicamente, lo que buscas es que esperes que el zapato tenga su perímetro para ser todos conectado. Si esto sucediera, entonces si extrae el contorno más externo (que es lo que está haciendo su código), solo debería tener un contorno que represente el perímetro exterior del objeto. Una vez que complete el contorno, su zapato debe ser completamente sólido.

Debido a que el perímetro de su zapato no está completo y roto, esto da como resultado regiones blancas desconectadas. ¿Deberías usar findContours para encontrar todos los contornos, solo encontrará los contornos de cada una de las formas blancas y no el perímetro más exterior. Como tal, si intentas usar findContoursle dará el mismo resultado que la imagen original, porque simplemente está encontrando el perímetro de cada región blanca dentro de la imagen, luego rellenando estas regiones con findContours.


Lo que debe hacer es asegurarse de que la imagen sea completamente cerrado. Lo que le recomendaría que hiciera es usar la morfología para cerrar juntas todas las regiones desconectadas, luego ejecute una findContours llamar a esta nueva imagen. En concreto, realizar un cierre morfológico binario. Lo que esto hace es que toma regiones blancas desconectadas que están juntas y asegura que estén conectadas. Utilizar un cierre morfológico, y quizás utilizar algo así como un elemento estructurante cuadrado de 7 x 7 para cerrar el zapato. Este elemento estructurante se puede pensar como la separación mínima entre regiones blancas para considerarlas como conectadas.

Como tal, haz algo como esto:

import numpy as np
import cv2 
image = cv2.imread('...') # Load your image in here
# Your code to threshold
image = cv2.adaptiveThreshold(image, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 45, 0)    

# Perform morphology
se = np.ones((7,7), dtype='uint8')
image_close = cv2.morphologyEx(image, cv2.MORPH_CLOSE, se)

# Your code now applied to the closed image
cnt = cv2.findContours(image_close, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)[0]
mask = np.zeros(image.shape[:2], np.uint8)
cv2.drawContours(mask, cnt, -1, 255, -1)

Este código esencialmente toma su imagen con umbral y aplica un cierre morfológico a esta imagen. Después, encontramos los contornos externos de esta imagen y los rellenamos con blanco. FWIW, descargué su imagen con umbral y probé esto por mi cuenta. Esto es lo que obtengo con tu imagen:

ingrese la descripción de la imagen aquí

Un enfoque simple sería cerrar los agujeros en el primer plano para formar un solo contorno con cv2.morphologyEx() y cv2.MORPH_CLOSE

ingrese la descripción de la imagen aquí

Ahora que el contorno externo está lleno, podemos encontrar el contorno exterior con cv2.findContours() y use cv2.fillPoly() para rellenar todos los píxeles con blanco

ingrese la descripción de la imagen aquí

import cv2

# Load in image, convert to grayscale, and threshold
image = cv2.imread('1.png')
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]

# Close contour
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7,7))
close = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel, iterations=1)

# Find outer contour and fill with white
cnts = cv2.findContours(close, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
cv2.fillPoly(close, cnts, [255,255,255])

cv2.imshow('close', close)
cv2.waitKey()

Aquí tienes las comentarios y puntuaciones

Si te apasiona la informática, puedes dejar un enunciado acerca de qué te ha gustado de este escrito.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

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