manejo de imagenes. AWS

Página 2 de 35. Los colores barren todo el espectro, pero en forma circular partiendo del Rojo (0º) y finali- zando en la gama de los Magenta (360º). Sin embargo en nuestro archivo BMP continuamos teniendo ternas de valores RGB. No preocuparse: existe lo que se denomina "Fórmulas de Travis" para obtener H, S y B.
2MB Größe 32 Downloads 10 vistas
Carrera de Programador Universitario & Licenciatura en Informática TALLER DE LENGUAJES I 2014 - Dictado: Ing. Juan M. Conti FACET de la Universidad Nacional de Tucumán. -----------------------------------------------------------------------------------------------------------------------

MANEJO DE IMAGENES. Para continuar avanzando sobre manipulación de imágenes a través de archivos binarios BMP, resulta conveniente visualizar el modelo de color HSB, que se halla basado en la percepción del ojo humano. Este establece tres parámetros: Tono Saturación Brillo

(Hue) (Saturation) (Bright)

Su representación espacial sería la siguiente:

El Tono ser refiere al color en sí: Rojo, Verde, Marrón, Anaranjado, etc. La Saturación tiene que ver con la pureza del color: a menor contenido de grises, mayor pureza o intensidad del color. El Brillo es la luminosidad relativa del color. En este diagrama, a diferencia del cubo de colores, el Eje central representa los grises, teniendo Brillo 0 % (Negro) en la parte inferior, y Brillo máximo (100 %) en la parte superior (Blanco).

Clase Teórica Nro 8

Página 1 de 35

Carrera de Programador Universitario & Licenciatura en Informática TALLER DE LENGUAJES I 2014 - Dictado: Ing. Juan M. Conti FACET de la Universidad Nacional de Tucumán. ----------------------------------------------------------------------------------------------------------------------Los colores barren todo el espectro, pero en forma circular partiendo del Rojo (0º) y finalizando en la gama de los Magenta (360º). Sin embargo en nuestro archivo BMP continuamos teniendo ternas de valores RGB. No preocuparse: existe lo que se denomina "Fórmulas de Travis" para obtener H, S y B. Para convertir de RGB a HSB debemos primero hallar el máx y el mín de cada terna de colores. De esta manera la Saturación y la Luminosidad o Brillo, vienen dadas por: S = ( Máx – Mín ) / Máx L = Máx / 255 El Color es un poco más complicado. Vamos a utilizar un método un tanto conceptual más que matemático. Supongamos que la terna viene dada por: R = 200 G =150 B = 233 correspondiente a una gama del Lila. Podemos considerar la siguiente situación: 233 200 83

150

50

R

G

B

R

G

B

Es decir, hemos asumido un nivel medio de Gris =150 + un componente de Tono. Esto quiere decir que en realidad el par Rojo - Azul generan el color (abajo: recuadro superior). Si a este Lila oscuro lo contaminamos con un Gris de valor 150 (mitad derecha del recuadro inferior), reproducimos el color original.

Concluyendo: la terna original (R=233, G=200 y B=150) podemos considerarla como un Lila intenso de valor (R=50 y B=83) con un nivel medio de Gris de 150.

Clase Teórica Nro 8

Página 2 de 35

Carrera de Programador Universitario & Licenciatura en Informática TALLER DE LENGUAJES I 2014 - Dictado: Ing. Juan M. Conti FACET de la Universidad Nacional de Tucumán. ----------------------------------------------------------------------------------------------------------------------Aclarado esto, continuamos con nuestro análisis:

360

300

240

180

120

0

60

Nuestro color se halla en el tramo 240 - 360. Si R y B fuese iguales, no habría dudas: el color sería 300º. Pero como B es mayor que R, en realidad se halla a la derecha de 300. Debemos averiguar cuánto. Para ello hagamos la siguiente proporcionalidad relativa: (B - R)/B = (83 - 50)/83 = 0,397 como esto es una fracción de 60º, tendríamos: 0,397 . 60 = 24º o sea que el ángulo buscado sería: 300 - 24 = 276º. El cód completo para hallar HSB es:

if((R==G) && (G==B)) { H=0; S=0; L=G/255*100; } else { Max=R; Min=R; if(G>Max) Max=G; if(B>Max) Max=B; if(GBc) H=round((double)300+(double)(Rc-Bc)/(double)Rc*60); else H=round((double)300-(double)(Bc-Rc)/(double)Bc*60); } else { if(Rc>Gc) H=round((double)60-(double)(Rc-Gc)/(double)Rc*60); else H=round((double)60+(double)(Gc-Rc)/(double)Gc*60); } } if(H==360) H=0;

Clase Teórica Nro 8

Página 3 de 35

Carrera de Programador Universitario & Licenciatura en Informática TALLER DE LENGUAJES I 2014 - Dictado: Ing. Juan M. Conti FACET de la Universidad Nacional de Tucumán. ----------------------------------------------------------------------------------------------------------------------Ahora bien, ¿para qué deseamos hallar estos valores? En realidad el que más nos interesa es el Brillo o Luminosidad, puesto que con él podemos generar el histograma de Luminosidad que nos arroja muy buena información sobre el tipo de imagen que estamos analizando y también evaluar un parámetro importante en imágenes: el contraste. Para este último emplearemos la fórmula o constante de Michelson: CM = (Lmax - Lmin) / (Lmax + Lmin) Si: Lmax = 100 (Blanco) Lmin=0 (Negro) CM = 100 / 100 = 1 tenemos el mayor contraste posible y esto se da en blanco sobre fondo negro. Si en cambio tenemos: Lmax = Lmin --> CM = 0 y se carece de contraste (por ej algo blanco sobre fondo blanco).

En el extremo izquierdo tenemos el máximo contraste, en tanto que en el extremo opuesto tenemos mínimo. El aumento de contraste aumenta el "peso visual" de una imagen, como así también la nitidez o diferenciación de detalles dentro de la misma. Vamos a centrar nuestro estudio precisamente en el tema Contraste. Si tomamos por ejemplo el siguiente fotograma acompañado de su distribución de brillos:

Clase Teórica Nro 8

Página 4 de 35

Carrera de Programador Universitario & Licenciatura en Informática TALLER DE LENGUAJES I 2014 - Dictado: Ing. Juan M. Conti FACET de la Universidad Nacional de Tucumán. ----------------------------------------------------------------------------------------------------------------------Para entender mejor este gráfico tenemos que considerar lo siguiente: La profundidad del color era la cantidad de tonos diferentes que podíamos dar a cada color primario de cada pixel. Cada pixel está formado por una terna RGB. Si decimos que disponemos de 256 tonos de Rojos, una unidad de memoria de 1 byte será suficiente, lo mismo para los Verdes y los Azules. Decimos entonces que tenemos una profundidad de color de 24 bits (8 bits por canal). Cada pixel ocupa 3 bytes de memoria. Un histograma, en nuestro caso particular, es un gráfico donde en el eje horizontal se representa los niveles de color (entre 0 y 255), y en el eje vertical el número de veces que ese valor se repitió en toda la imagen (no se trata de una distribución geográfica, sino estadística). En los gráficos de la izquierda se han representado la cantidad de veces que cada color se repitió en toda la imagen para cada nivel de los mismos. Aparecen dos bandas laterales donde no existen componentes de color. Ello se da en los tonos muy oscuros y en los tonos muy claros. Sólo aparecen magnitudes en la zona de valores intermedios. No es de extrañar: si observamos la imagen de la rosa, notaremos que está completamente agrisada, o sea con muy escaso contraste. El histograma de Luminosidad sale de considerar el máximo valor de cada terna para un mismo nivel y dividirlo luego en 255. Ese sería el gráfico a la par de la rosa. 0

100

255

En cambio en los histogramas RGB, simplemente se suman las frecuencias de cada color para cada nivel considerado. Su forma es muy parecida a la de Luminosidad.

Si nuestra intención es graficar estos histogramas, tendremos que recorrer la zona de datos en el archivo BMP y sumar la ocurrencia de cada nivel. Nada mejor que pasar a los hechos. Trabajaremos con nuestro consabido archivo Locomotora 03.BMP de la cual contaremos en un vector la ocurrencia de cada nivel.

Clase Teórica Nro 8

Página 5 de 35

Carrera de Programador Universitario & Licenciatura en Informática TALLER DE LENGUAJES I 2014 - Dictado: Ing. Juan M. Conti FACET de la Universidad Nacional de Tucumán. ----------------------------------------------------------------------------------------------------------------------/* --- TALLER DE LENGUAJES I Para histograma RGB.cpp

2014 -

Este programa almacena en un vector de enteros la cantidad de veces que cada nivel se repitió en toda la imagen: Locomotora 03.BMP y luego almacena dicho vector en un archivo de texto para graficar desde EXCEL el diagrama RGB de la imagen.

---------------------------------------------------------------------------------------------------------- */

#include #include #include typedef unsigned char byte; typedef short int ent; typedef struct { byte B; byte G; byte R; } TPixel; int FileExiste ( char * ); void *RM ( int ); // --------------------------------------------------------------------------------------void main() { FILE *FuenteBMP; FILE *DestinoTabla; char NombFuenteBMP [128] = "D:\\DISCO F\\Leng214\\Archivos BMP\\Locomotora 03.BMP"; char NombDestinoTabla[128] = "D:\\DISCO F\\Leng214\\Tabla histograma RBG.txt"; char Cabec[64]; int Niv[256]; // ... para acumular frecuencias por nivel. int *InicioDatos; int *TamArchivo; int *TamCabecera; int *TamImagen; int *AnchoPx; int *AltoPx; TPixel *pFila; int i, j; int Mult4 = 0;

clrscr( ); if(FileExiste(NombFuenteBMP)) FuenteBMP=fopen(NombFuenteBMP,"rb"); else { cprintf("NO EXISTE ARCHIVO FUENTE"); getch( ); return; }

Clase Teórica Nro 8

Página 6 de 35

Carrera de Programador Universitario & Licenciatura en Informática TALLER DE LENGUAJES I 2014 - Dictado: Ing. Juan M. Conti FACET de la Universidad Nacional de Tucumán. ----------------------------------------------------------------------------------------------------------------------if((DestinoTabla=fopen(NombDestinoTabla,"wt"))==NULL){ cprintf("NO PUDO CREAR ARCHIVO DESTINO"); getch(); fclose(FuenteBMP); return; } fread(Cabec,1,54,FuenteBMP); InicioDatos AnchoPx AltoPx TamImagen TamArchivo TamCabecera

= (int *)&Cabec[10]; = (int *)&Cabec[18]; = (int *)&Cabec[22]; = (int *)&Cabec[34]; = (int *)&Cabec[2]; = (int *)&Cabec[14];

for(i=0;i