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.

Imshow difiere drásticamente de aplicar matplolib.cm a una imagen segmentada.

Hola y gracias por leer.

Lo que estoy tratando de hacer es crear una aplicación web que tome una imagen, la procese a través del modelo y devuelva una versión segmentada. Sin embargo, no puedo usar “imshow” en la aplicación web. Entonces intenté agregar un mapa de colores a través de “matplolib.cm.viridis”, pero devuelve una imagen mucho más oscura.

Aquí hay algo de código e imágenes de referencia:

pred = new_model.predict(np.expand_dims(img, 0))
pred_mask = np.argmax(pred, axis=-1)
pred_mask = pred_mask[0]

Esto me devuelve una imagen en escala de grises 2D, que cuando se coloca en “matplolib imshow” parece esto. (la última imagen a la derecha es la salida del modelo). Código e imagen a continuación.

fig, axs = plt.subplots(1, 3, figsize=(20, 10))
axs[0].imshow(m1)
axs[0].set_title('Imagen')
axs[1].imshow(test_label1)
axs[1].set_title('Verdad de terreno')
axs[2].imshow(new_pred)
axs[2].set_title('Predicción')

Imagen aquí

Sin embargo, al aplicar un mapa de colores a una imagen usando “matplolib.cm” (algo que debo hacer para que la aplicación funcione), obtengo esta imagen. Código e imagen presentados a continuación.

Agregando mapa de colores. (Viridis, según yo, es el predeterminado en “matplolib 3.5”)

from matplotlib import cm
pred_mask = cm.viridis(pred_mask / 255)*255
pred_mask = np.asarray(pred_mask, dtype='uint8')

Graficando imagen.

fig, axs = plt.subplots(1, 3, figsize=(20, 10))
axs[0].imshow(m1)
axs[0].set_title('Imagen')
axs[1].imshow(test_label1)
axs[1].set_title('Verdad de terreno')
axs[2].imshow(pred_mask)
axs[2].set_title('Predicción')

Imagen aquí

Pero como puedes ver, la imagen es mucho más oscura, sin siquiera una pizca de azul claro o amarillo, es decir, peor. ¿Cómo puedo hacer que se parezca más a la salida de “imshow”?

PD. Muchas gracias por leer y espero que alguien tenga una respuesta. Cualquier sugerencia sería muy apreciada.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema radica en el hecho de que aplicar un colormap usando matplotlib.cm.viridis está cambiando el brillo y contraste de la imagen en escala de grises original. Una solución podría ser ajustar el brillo y contraste de la imagen en color utilizando la biblioteca PIL antes de mostrarla. Aquí tienes un ejemplo de código:

    import PIL.Image as Image
    
    # convertir la imagen en escala de grises a RGB
    color_map = cm.viridis(pred_mask / 255)
    rgb_img = Image.fromarray((color_map[:, :, :3] * 255).astype(np.uint8))
    
    # ajustar brillo y contraste
    enhancer = ImageEnhance.Brightness(rgb_img)
    rgb_img = enhancer.enhance(1.5)  # ajustar factor de brillo según sea necesario
    enhancer = ImageEnhance.Contrast(rgb_img)
    rgb_img = enhancer.enhance(1.5)  # ajustar factor de contraste según sea necesario
    
    # mostrar la imagen
    plt.imshow(rgb_img)
    

    Ajusta los factores de brillo y contraste según sea necesario para obtener el resultado deseado. Otras soluciones podrían incluir el uso de distintos colormaps o la modificación del colormap en sí para adaptarlo a las necesidades específicas de la aplicación.

Comments are closed.