martes, 27 de mayo de 2014

Binarización de una imagen - C#

¿Qué es la binarización de una imagen? La binarización consiste en una reducción de información en la que los únicos valores posibles son verdadero y falso (1 y 0). En caso de una imagen digital los valores verdadero y falso se corresponden a dos colores: blanco y negro.

¿Para qué sirve la binarización? La binarización es utilizada en el análisis de imágenes, mediante esta técnica se pueden separar objetos o regiones, que nos pueden interesar, del resto de la imagen. Es decir, que se puede separar el fondo de la imagen de la imagen de los objetos que deseamos analizar.

¿En qué consiste el proceso de binarización? En el proceso de binarización de una imagen se utiliza normalmente un umbral de la escala de grises  para conocer qué es blanco y qué es negro. Las imágenes por lo general no se encuentran en una escala de grises, por lo que se debe calcular la tonalidad de gris durante el proceso. También se pueden especificar umbrales en base a otra tonalidades, si estamos buscando objetos de colores específicos.

Para esta entrada, el método calculará la tonalidad de gris de cada pixel de la imagen de entrada, si la tonalidad de gris supera el umbral ese pixel será verdadero, es decir, un pixel blanco en la imagen destino, en caso contrario, el pixel será negro en la imagen destino. Para calcular la tonalidad de gris se realizará una media ponderada de los valores RGB, la media viene ponderada por la percepción humana de los colores debido a que somos más sensibles al verde y menos al azul (30% Rojo, 59% Verde, 11% Azul).

 public Bitmap BinaryImage(Bitmap source, int umb)
        {
            // Bitmap con la imagen binaria
            Bitmap target = new Bitmap(source.Width, source.Height, source.PixelFormat);
            // Recorrer pixel de la imagen
            for (int i = 0; i < source.Width; i++)
            {
                for (int e = 0; e < source.Height; e++)
                {
                    // Color del pixel
                    Color col = source.GetPixel(i, e);
                    // Escala de grises
                    byte gray = (byte)(col.R * 0.3f + col.G * 0.59f + col.B * 0.11f);
                    // Blanco o negro
                    byte value = 0;
                    if (gray > umb)
                    {
                        value = 255;
                    }
                    // Asginar nuevo color
                    Color newColor = System.Drawing.Color.FromArgb(value, value, value);
                    target.SetPixel(i, e, newColor);

                }
            }

            return target;
        }


Se puede ver el resultado con esta imagen de ejemplo y los diferentes umbrales:


Con un umbral de 10:



Con un umbral de 50:


Con un umbral de 100:



Con un umbral de 200:


NOTA: Como se ha comentado esta binarización viene dada por una escala de grises que basa la iluminació en función de la percepción humana de los colores. Se pueden realizar otras binarizaciones que en función de la imagen puedan tener un mayor o menor éxito.

2 comentarios:

  1. Hola, buen día, estoy haciendo una investigación para la facu. Soy diseñador gráfico. Quisiera saber ¿Cómo selecciona el programa el nivel de umbral para hacer el proceso de binarización? Ya que los resultados pueden ser muy variados según se tome un nivel de 50 o un nivel de 100. El nivel es fijo o el programa va probando distintos niveles hasta encontrar una marca. Gracias y saludos

    ResponderEliminar
    Respuestas
    1. Hola, este es un ejemplo de cómo implementar la función de binarización, recibiendo la imagen y el umbral como parámetros. Para este ejemplo he ido dando umbrales diferentes pero fijos para mostrar las diferencias entre umbrales. Hace tiempo que tengo este tema apartado, pero es posible realizar procesos previos para la selección de umbrales, por ejemplo sistemas de aprendizaje automático que en base a ciertos factoras elijan el umbral. En los algoritmos de OCR (Optical Character Recognition) se realiza una binarización durante el proceso, creo que si investigas un poco sobre OCR podrás obtener más información. Siento no haber podido ayudarte más. Un saludo.

      Eliminar