filtros de aclaramiento

9
BENEMÉRITA UNIVERSIDAD AUTÓNOMA DE PUEBLA “Facultad de Ciencias de la Computación” Procesamiento Digital de Imagenes Tarea No.5 FILTROS DE ACLARADO Víctor Manuel Morales de Jesús Otoño 2012

Upload: vic-mor

Post on 05-Aug-2015

60 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Filtros de Aclaramiento

BENEMÉRITA UNIVERSIDAD

AUTÓNOMA DE PUEBLA

“Facultad de Ciencias de la Computación”

Procesamiento Digital de Imagenes

Tarea No.5

FILTROS DE ACLARADO

Víctor Manuel Morales de Jesús

Otoño 2012

Page 2: Filtros de Aclaramiento

DESARROLLO

Se realizó la implementación de corrección de gamma los filtros de aclaramientos

logarítmico y senoidal . A continuación se explicara detalladamente el desarrollo de cada

método.

a) Corrección Gamma

Para implementar este método, se utilizó la siguiente formula:

Donde ingresando el valor gamma podremos alterar la iluminación de la imagen

asignando un nuevo valor a cada pixel de la imagen resultante. El código que realiza esta

tarea es el método siguiente:

public BufferedImage gamma(double gamm){ double gamma=gamm; datos.clear(); conjuntoDatos.removeAllSeries(); imagenModificada = new BufferedImage(imagenOriginal.getWidth(), imagenOriginal.getHeight(),

BufferedImage.TYPE_INT_RGB); for (int i = 0; i < imagenModificada.getWidth(); i++){ for (int j = 0 ; j < imagenModificada.getHeight() ; j++){ int color=imagenOriginal.getRGB(i,j); Color color_obtenido = new Color(color); int col_rojo= color_obtenido.getRed(); int rojoGamma =(int)( 255.0*Math.pow(col_rojo/255.0,gamma)); int col_verde= color_obtenido.getGreen(); int verdeGamma =(int)( 255.0*Math.pow(col_verde/255.0,gamma));

int col_azul= color_obtenido.getBlue(); int azulGamma =(int)( 255.0*Math.pow(col_azul/255.0,gamma)); int colorRGB=(rojoGamma << 16) | (verdeGamma << 8) | azulGamma; imagenModificada.setRGB(i, j, colorRGB);

datos.add(col_rojo,rojoGamma); } } return imagenModificada; //retorno la imagen para pintarla }

En las líneas marcadas de color amarillo se realiza la implementación de la formula para

obtener el nuevo color de la imagen resultante, en la Figura 1 se muestra una imagen a la

cual se le aplicó la corrección gamma y a continuación en se muestran los resultados

obtenidos con diferentes valores de gamma así como la gráfica de la función para cada

caso.

Page 3: Filtros de Aclaramiento

Valor de gamma establecido a 0.5

Se puede observar claramente que existe un aclaramiento en la imagen, la cual ahora se

aproxima a los tonos más claros.

Figura 1. Imagen a la que se le aplicara la corrección gamma

Page 4: Filtros de Aclaramiento

Valor de gamma establecido a 1

En la imagen superior podemos observar que con un valor de gama igual a 1, la imagen

resultante es exactamente igual a la imagen fuente, esto debido a que aplicando la

formula, la variacion del color del pixel resultante no se ve afectado, eso lo podemos

observar en la grafica de la funcion, donde obtenemos la funcion identidad.

Valor de gamma establecido a 2.5

Page 5: Filtros de Aclaramiento

En la imagen se puede observar que con un valor de gamma mayor a 1 la imagen tiende a

oscurecerse y por lo consiguiente la gráfica de la función muestra la tendencia de los

colores de la imagen hacia los tonos oscuros.

En el programa se ha decidido poder elegir un valor gamma máximo de 5, esto debido a

que con valores superiores la imagen prácticamente quedaría en negro como lo muestra

la siguiente figura.

b) Función Logarítmica

Para realizar el aclarado de la imagen utilizando la función logarítmica utilizamos la

siguiente formula:

.

En este caso necesitamos un valor de alfa, el cual pasaremos desde un JComboBox, el

código que realiza el aclarado logarítmico es el siguiente:

Page 6: Filtros de Aclaramiento

public BufferedImage aclaradoLogaritmo (double alf){ double alfa=alf; int maxr=0, maxg=0, maxb=0; double tempr,tempg,tempb, ar, ag, ab; datos.clear(); conjuntoDatos.removeAllSeries(); imagenModificada = new BufferedImage(imagenOriginal.getWidth(), imagenOriginal.getHeight(),

BufferedImage.TYPE_INT_RGB); for (int i = 0; i < imagenModificada.getWidth(); i++){ for (int j = 0 ; j < imagenModificada.getHeight() ; j++){ int color=imagenOriginal.getRGB(i,j); Color color_obtenido = new Color(color); int col_rojo= color_obtenido.getRed(); if(col_rojo>maxr) maxr=col_rojo; int col_verde= color_obtenido.getGreen(); if(col_verde>maxg) maxg=col_verde; int col_azul= color_obtenido.getBlue(); if(col_azul>maxb) maxb=col_azul; } } for(int i = 0;i <imagenModificada.getWidth();i++) for(int j=0; j<imagenModificada.getHeight();j++){ ar = (double) (maxr/Math.log((alfa*maxr) +1)); ag = (double) (maxg/Math.log((alfa*maxg) +1)); ab = (double) (maxb/Math.log((alfa*maxb) +1)); int color=imagenOriginal.getRGB(i,j); Color color_obtenido = new Color(color); int color_rojo= color_obtenido.getRed(); int color_verde= color_obtenido.getGreen(); int color_azul= color_obtenido.getBlue(); tempr = (double) ( ar * ( Math.log( (alfa * color_rojo) + 1 ) ) ); tempg = (double) ( ag * ( Math.log( (alfa * color_verde) + 1 ) ) ); tempb = (double) ( ab * ( Math.log( (alfa * color_azul) + 1 ) ) ); if(tempr<0) color_rojo=0; else if(tempr>255) color_rojo=255; else color_rojo = (int)tempr; if(tempg<0) color_verde=0; else if(tempg>255) color_verde=255; else color_verde = (int)tempg; if(tempb<0) color_azul=0; else if(tempb>255) color_azul=255; else color_azul= (int)tempb; int colorRGB=(color_rojo << 16) | (color_verde << 8) | color_azul; imagenModificada.setRGB(i, j, colorRGB); datos.add(color_rojo,); } return imagenModificada; }

En las líneas marcadas de amarillo se encuentran las operaciones establecidas en la

fórmula para obtener el aclarado de la imagen aplicando la función logarítmica, los if’s los

empleo únicamente para verificar que los valores obtenidos de las operaciones se

encuentren en un rango de 0 a 255, ya que si excediera de esos rangos existirían

problemas al pintar el pixel de la imagen.

En las imágenes siguientes se muestran distintas pruebas realizadas con diferentes valores

para el valor de alfa, mostrando distintos niveles de aclaramiento según el valor de alfa.

Page 7: Filtros de Aclaramiento

Valor Alfa establecido a .20

En la imagen superior se muestra el resultado de aplicar el filtro logaritmico con un valor alfa igual

a 20, se puede observar que el resultado es bueno, ya que presenta una aclarado uniforme de la

imagen.

Valor Alfa establecido a 1

En la imagen superior se muestra el resultado de aplicar el filtro logaritmico con un valor alfa igual

a 1, que es el mayor valor alfa que puede establecerse, se puede observar claramente la diferencia

con la imagen anterior.

Page 8: Filtros de Aclaramiento

b) Función Seno

Para implementar el aclarado por medio de la función Seno, partimos de la formula

siguiente:

El código que realiza el filtro utilizando la función seno es el siguiente:

public BufferedImage aclaradoSeno(){ datos.clear(); conjuntoDatos.removeAllSeries(); int maxr=0, maxg=0, maxb=0; double tempr,tempg,tempb, ar, ag, ab; imagenModificada = new BufferedImage(imagenOriginal.getWidth(), imagenOriginal.getHeight(),

BufferedImage.TYPE_INT_RGB); for (int i = 0; i < imagenModificada.getWidth(); i++){ for (int j = 0 ; j < imagenModificada.getHeight() ; j++){ int color=imagenOriginal.getRGB(i,j); Color color_obtenido = new Color(color); int col_rojo= color_obtenido.getRed(); if(col_rojo>maxr) maxr=col_rojo; int col_verde= color_obtenido.getGreen(); if(col_verde>maxg) maxg=col_verde; int col_azul= color_obtenido.getBlue(); if(col_azul>maxb) maxb=col_azul; } } for(int i = 0;i <imagenModificada.getWidth();i++) for(int j=0; j<imagenModificada.getHeight();j++){ int color=imagenOriginal.getRGB(i,j); Color color_obtenido = new Color(color);

int col_rojo= color_obtenido.getRed(); int col_verde= color_obtenido.getGreen(); int col_azul= color_obtenido.getBlue(); ar = Math.PI * col_rojo/(2*maxr); ag = Math.PI * col_verde/(2*maxg); ab = Math.PI * col_azul/(2*maxb); tempr = (double)(maxr * Math.sin(ar)); tempg = (double)(maxg * Math.sin(ag)); tempb = (double)(maxb * Math.sin(ab)); if(tempr<0) col_rojo=0; else if(tempr>255) col_rojo=255; else col_rojo = (int)tempr; if(tempg<0) col_verde=0; else if(tempg>255) col_verde=255; else col_verde = (int)tempg; if(tempb<0) col_azul=0; else if(tempb>255) col_azul=255; else col_azul= (int)tempb; int colorRGB=(col_rojo << 16) | (col_verde << 8) | col_azul; imagenModificada.setRGB(i, j, colorRGB); } return imagenModificada; }

Page 9: Filtros de Aclaramiento

En el texto marcado se muestra la implementación de la fórmula para obtener el filtro,

donde se realizan las operaciones.

El resultado de aplicar el filtro de la función seno es el que se muestra en la siguiente

imagen:

CONCLUSIONES

Podemos concluir aunque existen distintos tipos de filtros de aclarado de imágenes

como lo son Corrección Gamma, Filtro de Función Logaritmo, Filtro de Función Seno,

cada uno de estos filtros permiten obtener resultados muy específicos, aunque a simple

vista el resultado es aparenta ser muy similar, cada filtro brinda la posibilidad de obtener

el aclarado de una imagen según se requiera.

Una ventaja de los filtros elaborados es que son muy simples de implementar y de igual

forma no son costosos en recursos para su implementación.

Por ultimo puedo concluir que debido a la posibilidad de poder usar los distintos filtros, es

posible un mejor procesamiento de las imágenes digitales, ya que cada uno de ellos puede

obtener mejores resultados en imágenes con características distintas.