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.

Apertura morfológica por reconstrucción en Skimage, problema.

Quiero implementar la apertura morfológica por reconstrucción.

Aquí está el código que uso con este propósito, pero no produce el resultado esperado. Adjunto el código y las imágenes. Por favor, asesóreme sobre qué estoy haciendo mal y cómo puedo solucionarlo.

import numpy as np
from skimage import morphology
import cv2 as cv
img = cv.imread('images/Initial_Image.jpg', cv.IMREAD_GRAYSCALE)
se = np.ones((40,40), np.uint8)
marker = morphology.erosion(img, se)
mask = img
Opening_recon = cv.bitwise_not(morphology.reconstruction(cv.bitwise_not(marker), cv.bitwise_not(mask), method='erosion'))

'''
Output Results of each step
'''
cv.imwrite('images/01_Grayslace.jpg', img) #Paso 1 - Imagen en escala de grises
cv.imwrite('images/02_marker.jpg', marker) #Paso 2 - Imagen de marcador
cv.imwrite('images/03_Opening_recon.jpg', Opening_recon) #Paso 3 - Apertura por reconstrucción

Imagen incial a escala de grises:
Initial Image

Imagen de marcador:
Marker Image

Apertura por reconstrucción:
Opening By reconstruction

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Hay un par de problemas con tu implementación:

    1. Estás usando cv2.imread para leer la imagen, pero skimage.morphology trabaja con imágenes en formato float en el rango [0, 1]. Se recomienda usar skimage.io.imread en su lugar.
    2. Estás utilizando cv2.bitwise_not para invertir las imágenes. Sin embargo, en NumPy y scikit-image, los rangos de valores son [0, 255] y [0, 1] respectivamente. Para invertir correctamente las imágenes, simplemente resta la imagen al valor máximo.

    Aquí está el código modificado que debería funcionar para la apertura morfológica por reconstrucción:

    import numpy as np
    from skimage import io, morphology
    
    # Leer imagen
    img = io.imread('images/Initial_Image.jpg', as_gray=True)  # Usar skimage.io.imread
    
    # Definir elemento estructurante y marcador
    se = np.ones((40,40))
    marker = morphology.erosion(img, se)
    
    # Realizar apertura morfológica por reconstrucción
    Opening_recon = morphology.reconstruction(np.maximum(marker, img), marker, method='dilation')  # Usar np.maximum
    
    # Invertir imágenes y convertir a uint8
    img = (255*(1-img)).astype(np.uint8)
    marker = (255*(1-marker)).astype(np.uint8)
    Opening_recon = (255*(1-Opening_recon)).astype(np.uint8)
    
    # Guardar imágenes
    io.imsave('images/01_Grayscale.jpg', img)
    io.imsave('images/02_Marker.jpg', marker)
    io.imsave('images/03_Opening_recon.jpg', Opening_recon)
    
    # Mostrar imágenes (opcional)
    io.imshow(img)
    io.imshow(marker)
    io.imshow(Opening_recon)
    

    Ten en cuenta que usamos method='dilation' en lugar de method='erosion' al hacer la reconstrucción, ya que queremos realizar la apertura (erosión seguida de dilatación), no el cierre (dilatación seguida de erosión).

    También ten en cuenta que usamos np.maximum en lugar de cv2.bitwise_not para combinar el marcador y la imagen original, ya que np.maximum trabaja elemento por elemento y nos da el valor máximo en cada posición de los dos arreglos.

Comments are closed.