Umbralado de una Imagen con RangeSlider

PythonPythonBeginner
Practicar Ahora

This tutorial is from open-source community. Access the source code

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

Esta práctica demostrará cómo utilizar el widget RangeSlider en Matplotlib para controlar el umbralado de una imagen. El propósito del umbralado es convertir una imagen en escala de grises en una imagen binaria, donde los píxeles son o negros o blancos. Esto es útil para la segmentación de imágenes, donde queremos extraer ciertas características de la imagen.

Consejos sobre la VM

Una vez finalizada la inicialización de la VM, haga clic en la esquina superior izquierda para cambiar a la pestaña Cuaderno y acceder a Jupyter Notebook para practicar.

A veces, es posible que tenga que esperar unos segundos a que Jupyter Notebook termine de cargarse. La validación de las operaciones no se puede automatizar debido a las limitaciones de Jupyter Notebook.

Si tiene problemas durante el aprendizaje, no dude en preguntar a Labby. Deje su retroalimentación después de la sesión y le resolveremos el problema inmediatamente.

Generar una imagen falsa

Primero, generaremos una imagen falsa en escala de grises utilizando el módulo random de NumPy. Estableceremos la semilla para garantizar que los resultados sean reproducibles.

np.random.seed(19680801)
N = 128
img = np.random.randn(N, N)

Mostrar la imagen y su histograma

A continuación, mostraremos la imagen utilizando la función imshow de Matplotlib y su histograma utilizando hist. Crearemos una figura con dos subtramas, una para la imagen y otra para el histograma.

fig, axs = plt.subplots(1, 2, figsize=(10, 5))
fig.subplots_adjust(bottom=0.25)

im = axs[0].imshow(img)
axs[1].hist(img.flatten(), bins='auto')
axs[1].set_title('Histogram of pixel intensities')

Crear el RangeSlider

Ahora crearemos el widget RangeSlider, que nos permitirá ajustar el umbral de la imagen. Crearemos un nuevo eje para el deslizador y lo agregaremos a la figura.

slider_ax = fig.add_axes([0.20, 0.1, 0.60, 0.03])
slider = RangeSlider(slider_ax, "Threshold", img.min(), img.max())

Agregar líneas verticales al histograma

Para facilitar la visualización del efecto del umbralado, agregaremos líneas verticales al histograma para indicar los valores actuales del umbral. Crearemos dos líneas para los valores inferior y superior del umbral, respectivamente.

lower_limit_line = axs[1].axvline(slider.val[0], color='k')
upper_limit_line = axs[1].axvline(slider.val[1], color='k')

Crear una función de devolución de llamada para el deslizador

Crearemos una función de devolución de llamada que se llamará cada vez que el usuario cambie los valores del umbral utilizando el deslizador. La función actualizará la paleta de colores de la imagen y las posiciones de las líneas verticales en el histograma.

def update(val):
    ## El val pasado a una devolución de llamada por el RangeSlider será
    ## una tupla de (min, max)

    ## Actualizar la paleta de colores de la imagen
    im.norm.vmin = val[0]
    im.norm.vmax = val[1]

    ## Actualizar la posición de las líneas verticales
    lower_limit_line.set_xdata([val[0], val[0]])
    upper_limit_line.set_xdata([val[1], val[1]])

    ## Volver a dibujar la figura para asegurarse de que se actualice
    fig.canvas.draw_idle()


slider.on_changed(update)

Mostrar la figura

Finalmente, mostraremos la figura con la imagen y el deslizador.

plt.show()

Resumen

En este laboratorio, hemos demostrado cómo utilizar el widget RangeSlider en Matplotlib para controlar el umbralado de una imagen. Hemos mostrado cómo crear una imagen en escala de grises falsa, mostrarla y su histograma, crear un deslizador para ajustar los valores del umbral y actualizar la imagen y el histograma en función de los valores del deslizador. Esta técnica se puede utilizar para la segmentación de imágenes y otras aplicaciones en las que necesitamos extraer ciertas características de una imagen.