La umbralizacion (o ‘thresholding‘) es una técnica usada en el procesamiento de imágenes digitales, mediante el cual se convierte una imagen (generalmente en escala de grises) de una matriz de pixeles con valores de intensidad comprendidos entre 0 y 256, a una imagen binaria (es decir, una imagen en la que los valores de intensidad sean únicamente 0 o 1. Por ejemplo, asignando el valor 0 a aquellos pixeles cuyo valor de intensidad quede por debajo del umbral establecido y 1 a aquellos que lo igualen o superen). Se trata de una técnica usada con frecuencia en procesos de segmentación de imágenes y de reconocimiento o detección de determinados elementos en las mismas, usándose para ello, un umbral que variará en función a la naturaleza misma de la imagen y del tipo de elemento que queramos aislar o separar de la misma.
A continuación se muestra un ejemplo en el que tenemos a la izquierda una imagen en escala de grises (en donde los valores de intensidad de cada pixel, varía entre 0 y 256) y a la derecha se muestra una imagen a la que se ha aplicado un umbral, resultando una imagen binaria en la que la variación de intensidades vienen representados únicamente por los valores 0 y 1:

PRIMEROS PASOS CON ‘scikit-image’:
Antes de continuar, vamos a ver algunas operaciones que podemos realizar con ‘scikit-image‘ y que nos van a ser de gran utilidad para nuestros ejercicios sobre aplicación de umbrales y segmentación. Sin olvidarnos de antes, instalar ‘scikit-image‘ en nuestro equipo:

Una vez instalada la librería, podremos empezar a experimentar con nuestras imágenes. Aunque para este tutorial, vamos a hacer uso de una serie de imágenes de ejemplo que vienen con la propia librería y a las que podemos acceder con el módulo ‘data‘:

A continuación, para mostrar la imagen obtenida, usaremos la librería ‘matplotlib‘ dentro de una función a la que llamaremos ‘show_image()‘ y que utilizaremos en lo sucesivo, mara mostrar las imágenes en nuestros ejemplos. Una vez definida, la usaremos para mostrar nuestra primera imagen de ejemplo:

OUTPUT:

Tal y como hemos señalado antes, el uso de umbrales se aplica generalmente sobre imágenes en escala de grises. Por ello, contamos en ‘scikit-image‘ con un módulo ‘color‘, que nos permitirá convertir una imagen a color, a otra a escala de grises:

OUTPUT:

‘THRESHOLDING’ CON ‘scikit-image’:
Una vez vistas las anteriores posibilidades que ofrece ‘scikit-image‘ es hora de realizar nuestra primera separación entre los elementos en primer plano y el fondo de nuestra imagen. Para este caso, utilizaremos otra imagen disponible en el módulo ‘data‘ que después mostramos utilizando nuestra función ‘show_image()‘:

OUTPUT:

A continuación, vamos a aplicar un umbral a la imagen, para luego, generar nuestra imagen binaria con la que pretendemos destacar los elementos en primer plano sobre el fondo. Para ello ‘scikit-image‘ nos proporciona una función ‘threshold_otsu‘ que nos devolverá el umbral óptimo para nuestro propósito, el cual, almacenaremos en la variable ‘thresh‘:

Vemos como la función aplicada sobre nuestra imagen nos devuelve un valor de 102. Esto significa que para separar del modo más apropiado posible, el fondo de los elementos en primer plano, se aplicará el umbral de modo que aquellos pixeles cuyo valor de intensidad quede por encima de dicho valor (o sea igual) se le dará un valor de 1 (blanco) en la imagen binaria resultante, y aquellos que queden por debajo de dicha cifra, se les aplicará el valor de 0 (negro). Pasemos pues a aplicar nuestro umbral sobre la imagen y mostrar el resultado:

OUTPUT:

Cojamos ahora otra imagen de nuestro muestrario y usemos nuevamente nuestra función ‘show_image()‘ para mostrarla en pantalla:

OUTPUT:

Acto seguido llevaremos a cabo todas las operaciones vistas en el caso anterior utilizando los mismos métodos y funciones. Proceso con el que finalmente obtendremos este resultado:

Se ve como en este caso obtenemos un resultado más pobre que el del caso anterior. La razón de esto radica en que el uso de la función ‘threshold_otsu‘ conviene realizarla sobre imágenes en las que exista una adecuada distinción o diferenciación entre los elementos en primer plano y el fondo. Caso que no se da en este segundo ejemplo al no ser lo suficientemente homogénea la intensidad del fondo. Para este tipo de caso, usaremos ‘threshold_local‘ al definir el umbral óptimo, definiendo para ello la variable ‘block_size‘ con la que especificaremos el número de pixeles contiguos a cada pixel de la imagen, que van a ser utilizados para el calculo de dicho umbral para el conjunto:

OUTPUT:

RECAPITULANDO:
En este artículo hemos visto en que consiste la aplicación de umbrales sobre imágenes y su utilidad para procesos de segmentación y detección de elementos en las mismas. También hemos visto (muy someramente) algunas funciones que ofrece la librería ‘scikit-image‘ para convertir imágenes en color a escala de grises, aplicar umbrales y obtención de umbral óptimo. Finalmente, hemos destacado la importancia de usar la función adecuada (‘threshold_otsu‘ o ‘threshold_local‘) para generar nuestra imagen binaria. Sin duda, se han quedado muchas cosas en el tintero, pero que iremos viendo en futuros artículos.
Saludos.



























































































