Prácticas de laboratorio Práctica 1: Tratamiento básico del color 1. INTRODUCCIÓN Los objetivos de esta práctica son dos. Por un lado, aprender el uso del entorno y las librerías, y por otro, desarrollar un conjunto sencillo de algoritmos en C para el tratamiento de imágenes a color RGB. Para ello, deberá realizar un conjunto de funciones capaces de ejecutar las operaciones que se indican a lo largo de la práctica.. 1.1 Operación ExtractBand Se trata de generar, a partir de la original, una imagen a color con la banda seleccionada (0-ROJO, 1-VERDE y 2-AZUL). Las función a programar es (véase el apartado titulado realización ejemplo) Fco Javier Molina Cantero Pag. 1 CARPETA: Pannels FICHERO: P1_Color.cpp VISIONDLL_API long fnButtonExtractBand(unsigned char **R, unsigned char **G, unsigned char **B, int Filas, int Cols, int band) { return 0; } 1.2 Operación GAproach. El objetivo es convertir una imagen a color a otra de nivel de gris creando una imagen monocromática con la banda de verde original. La función a programar es: CARPETA: Pannels FICHERO: P1_Color.cpp VISIONDLL_API long fnButtonGAproach( unsigned char **R, unsigned char **G, unsigned char **B, int Filas, int Cols) { return 0 } 1.3 Operación YAproach. Convierte una imagen a color RGB en una imagen de grises mediante el método de la luminancia (transformación de XYZ a RGBNTSC). Y = 0.299 ⋅ R + 0.587 ⋅ G + 0114 ⋅ B Compare el resultado que se obtiene al aplicar ambos algoritmos a las imágenes de test: Cuadro.jpg, Mezcla.bmp y Patron.bmp. Pag. 2 Las funciones que deberá programar son: CARPETA: Pannels FICHERO: P1_Color.cpp VISIONDLL_API long fnButtonYAproach( unsigned char **R, unsigned char **G, unsigned char **B, int Filas, int Cols) { return 0; } CARPETA: Library FICHERO: Color.cpp // El resultado se devuelve en la matriz Out void imageRGBtoY( unsigned char **R, unsigned char ** G, unsigned char **B, unsigned char ** Out, int Filas, int Cols) { } 1.4 Operación Extract Color. El objetivo es extraer de una imagen RGB todos aquellos pixels del color seleccionado. Los que no coincidan se dejarán en negro. Los colores posibles son los de la siguiente lista: 0 - ROJO, 1- NARANJA, 2 - AMARILLO, ... 11 - ROSA Deberá programar las siguientes funciones: Fco Javier Molina Cantero Pag. 3 CARPETA: Pannels FICHERO: P1_Color.cpp VISIONDLL_API long fnButtonExtractColor( unsigned char **R, unsigned char **G, unsigned char **B, int Filas, int Cols, int Color) { return 0; } CARPETA: Library FICHERO: Color.cpp // Convierte un pixel RGB a HLS // Los resultados se devuelven por referencia en las variables HLS void pixelRGBtoHLS(float red, float green, float blue, float *H, float *L, float *S) { } // Convierte un pixel RGB a HLS cuantizando H, L y S en el número de // niveles y colores que se indican. Los resultados se devuelven por referencia // en las variables HLS void pixelQuantRGBtoHLS( float red, float green, float blue, int *H, unsigned char hueLevels, int *L, unsigned char lightLevels, int *S, unsigned char satLevels) { } 1.5 Operación Quantizing. Partiendo de una imagen RGB de 24 bits, esta operación genera una imagen RGB con el número de colores, y los niveles de saturación y luminosidad indicados en el panel. P.e: Fichero: ColTest.bmp Pag. 4 Colores 12, Sat 6, Lum. 6 Además de las funciones desarrolladas en el apartado anterior, deberá programar las siguientes: CARPETA: Pannels FICHERO: P1_Color.cpp VISIONDLL_API long fnButtonQuantizing( unsigned char **R, unsigned char **G, unsigned char **B, int Filas, int Cols, int hueLevels, int lumLevels, int satLevels) { return 0; } CARPETA: Library FICHERO: Color.cpp // Convierte un pixel RGB a HLS // Los resultados se devuelven por referencia a través de las variables R,G,B void pixelHLStoRGB(float H, float L, float S, float *R, float *G, float *B) { } // Cuantiza una imagen completa RGB con el número de niveles HLS indicados // La imagen resultante se devuelve en la misma matriz de entrada void imageQuantRGB( unsigned char **R,unsigned char **G,unsigned char **B, int Filas, int Cols, int hueLevels, int lumLevels, int satLevels) { } Fco Javier Molina Cantero Pag. 5 2. IMÁGENES DE TEST Fichero: Mezcla.bmp Fichero: Cuadro.bmp Fichero: Patron.bmp Fichero: pyjama.bmp Fichero: Diagrama..bmp Fichero: Diagrama..bmp Fichero: ColTest.bmp Pag. 6 Fichero: ColorGrad.bmp 3. REALIZACIÓN EJEMPLO Botón ExtractBand. El objetivo es generar una imagen con la banda preseleccionada en la lista desplegable (rojo, verde o azúl). Los pasos a realizar son: poner a cero las bandas no seleccionadas de la imagen original y mostrar el resultado. No se hace necesario programar un algoritmo específico de tratamiento, por lo que este apartado se resolverá programando la función correspondiente a la pulsación del botón ExtractBand CARPETA: Pannels FICHERO: P1_Color.cpp VISIONDLL_API long fnButtonExtractBand( unsigned char **R, unsigned char **G, unsigned char **B, int Filas, int Cols, int band) { int i,j; // Índices para acceder a los elementos de las matrices unsigned char **aux1 = G, **aux2 = B; // Banda 0-Rojo selec. por defecto if(band == 1) { aux1 = R; aux2 = B; } else if(band == 2) { aux1 = R; aux2 = G; } for(i=0; i< Filas; i++) for(j=0; j < Cols; j++) aux1[i][j] = aux2[i][j] = 0; DisplayRGB(R,G,B,Filas,Cols,"hola"); return 0; } Fco Javier Molina Cantero Pag. 7