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:
Imagen de marcador:
Apertura por reconstrucción:
davy.ai
Hay un par de problemas con tu implementación:
cv2.imread
para leer la imagen, peroskimage.morphology
trabaja con imágenes en formato float en el rango [0, 1]. Se recomienda usarskimage.io.imread
en su lugar.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:
Ten en cuenta que usamos
method='dilation'
en lugar demethod='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 decv2.bitwise_not
para combinar el marcador y la imagen original, ya quenp.maximum
trabaja elemento por elemento y nos da el valor máximo en cada posición de los dos arreglos.