es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

OpenCV: Creación de una máscara binaria a partir de la imagen

Tengo esta imagen y quiero crear una máscara binaria a partir de ella. El rectángulo principal (el más grande) debe ser blanco y otras partes de la imagen deben ser negras. Como esta:

Para resolver este problema, quiero encontrar un contorno del rectángulo principal. Mi plan es encontrar todos los contornos externos. Luego obtener el contorno con el área más alta. En primer lugar, intenté encontrar todos los contornos y graficarlos como una imagen binaria. Mi intento:

Pero incluso este código simple no encontró ningún contorno. ¿Qué pasa con eso? ¿Y cómo obtener el contorno con el área más alta? ¿Quizás debería aplicar el algoritmo Canny aquí? Por favor, ayúdame.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    La razón por la cual el código no encontró ningún contorno es porque la imagen no fue correctamente segmentada antes de pasarla a cv2.findContours(). Por lo tanto, los contornos no fueron detectados. Para solucionar este problema, podemos utilizar una función básica de segmentación como cv2.threshold(). Aquí está el código modificado:

    import numpy as np 
    import cv2
    import matplotlib.pyplot as plt
    from skimage import data, io
    
    im = cv2.imread('train_1.jpg', 0)
    _, thresh = cv2.threshold(im, 127, 255, cv2.THRESH_BINARY)
    contours, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
    out = np.zeros_like(thresh)
    cv2.drawContours(out, contours, -1, 255, 10)
    io.imshow(out)
    plt.show()
    

    Este código debería ser capaz de encontrar los contornos en la imagen. Para obtener el contorno con el área más grande, podemos ordenar los contornos en orden descendente de sus áreas utilizando la función cv2.contourArea() y seleccionar el primer contorno. Aquí está el código modificado:

    import numpy as np 
    import cv2
    import matplotlib.pyplot as plt
    from skimage import data, io
    
    im = cv2.imread('train_1.jpg', 0)
    _, thresh = cv2.threshold(im, 127, 255, cv2.THRESH_BINARY)
    contours, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
    
    # ordenar los contornos por área en orden descendente
    sorted_contours = sorted(contours, key=cv2.contourArea, reverse=True)
    
    # dibujar el contorno más grande
    out = np.zeros_like(thresh)
    cv2.drawContours(out, sorted_contours[0], -1, 255, 10)
    io.imshow(out)
    plt.show()
    

    Este código debería producir la máscara binaria deseada con el rectángulo principal en blanco y otras partes en negro. Aplicar el algoritmo Canny también puede ayudar a afinar aún más la segmentación, pero en este caso, la segmentación simple parece funcionar bien.

Comments are closed.