Publicado el Deja un comentario

¿Cómo binarizar una imagen en Simple ITK con Python?

¿En qué consiste binarizar una imagen?

La binarización de las imágenes consiste en buscar un valor umbral de nivel de gris para distinguir entre aquello que no sea relevante en la imagen y aquello que sí lo sea. Por ejemplo, en la siguiente imagen tenemos una hoja sobre un fondo blanco y deseamos quedarnos únicamente con los píxeles que se corresponden con la hoja. Para ello, podemos hacer una sencilla binarización.

¿Por qué se llama binarización? Sencillamente, porque convierte la imagen de salida en una imagen binaria, es decir, con únicamente dos niveles de gris. Esto no tiene porque ser exclusivamente así, ya que se podría buscar, por ejemplo, detectar dos objetos considerablemente diferentes en la imagen y distinguirlos del fondo. En ese caso, podría ser necesario utilizar varios umbrales. Es por ello que, en general, a este tipo de procedimiento se le suele llamar umbralización.

Este es un caso exitoso de umbralización de una imagen para segmentar el objeto. Sin embargo, no te creas que esto ocurre siempre así. Por lo general, los problemas de segmentación no son para nada sencillos, ya que no hay ningún método que funcione para todas las imágenes. Un ejemplo de segmentación con resultados no tan buenos, se puede ver con la imagen de la hoja que tienes a continuación.

Y, para este método, la binarización está funcionando bastante bien. Es cierto que estas imágenes están muy bien hechas… y es por ello que no son representativas de lo que suele ocurrir en la realidad, donde la calidad suele ser más pobre y resolver una segmentación resulta mucho más complejo.

A nivel de histograma, el procedimiento que se está aplicando es muy sencillo de entender. Simplemente, a los valores que caen a la derecha del umbral les damos un valor y, a los que caen al otro lado, les damos otro valor diferente.

Ejemplo de umbralización de una imagen RGB en el canal azul. Como valor umbral, se utiliza el 35.

Como puedes observar, la selección del umbral es completamente manual, ya que estamos en el caso de binarización más simple. Este umbral debe obtenerse a base de prueba y error.

Pero no es la única forma de obtener una imagen binaria. Existen otros procedimientos que permiten obtener el umbral de forma automática, como es el caso del algoritmo de Otsu. Por lo general, todos estos métodos van a estar implementados en cualquier librería de imagen que utilices.

¿Cómo realizar la umbralización de una imgen en la práctica?

En este caso, vamos a utilizar la librería Simple ITK para llevar a cabo diversos procedimientos de binarización de las imágenes.

Binarización simple con Simple ITK en Python

En este caso, utilizaremos el método de binarización simple para umbralizar la imagen. Por tanto, debemos especificar explícitamente los valores de umbral deseados. En este caso, se toma una imagen en color RGB de la cual solo se coge el canal azul (que en OpenCV es BGR, con lo que se coge el primer canal, es decir, el «0»).

Este sería el resultado con el código propuesto arriba.

Binarización con el algoritmo de Otsu en SimpleITK

Con el algoritmo de Otsu, no es necesario selccionar de forma manual el valor de umbral deseado. El procedimiento a seguir en la implementación es muy similar, ya que sencillamente se debe cambiar la función de binarización simple con la correspondiente al algoritmo de Otsu.

Al ejecutar este código, se obtiene una salida con una apariencia como la que se muestra a continuación.

Además, el código «print(otsu_filter.GetThreshold())» permite obtener el valor de umbral que ha encontrado el algoritmo. En este caso, nos ha devuelto «134».

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *