Un archivo de imagen está compuesto dependiendo de las dimensiones de este archivo, en cientos y miles de pixeles, un pixel es un punto de color que varían en su tonalidad de un pixel a otro, creando así la imagen digital.
Si se realiza un zoom a una imagen cualquiera, puede verse como este esta pixelado
Un pixel está compuesto por los colores básicos RGB en sus siglas en ingles (Red, Green, Blue) en español, ROJO, VERDE, AZUL, estos tres colores básicos combinados en diferentes valores (0 a 255) forman una amplia gama de tonalidades los cuales combinados forman la imagen. Entonces una imagen no es más que una matriz de dos dimensiones de tamaño mXn donde cada elemento de la matriz M(i,j) es un pixel.
JAVA2D
Como cada pixel contiene valores RGB, Java2d nos permite manipular estos valores cargando una imagen en memoria, utilizando la clase BufferedImage, para poder manipular los archivos de imagen, esta clase cuenta con varios métodos. Entre ellos tenemos:
- imagen.getRGB(x,y);
- imagen.setRGB(x,y,Color_RGB);
El primero no permite obtener el valor RGB de un pixel, dadas sus coordenadas (X,Y) dentro de la matriz.
El segundo método, nos permite asignar un nuevo valor RGB a un pixel, dados sus coordenadas RGB dentro de la mtriz.
Entonces, para poder cambiar los colores de una imagen, solamente debemos obtener sus valores RGB y reemplazarlos por unos nuevos, esto se logra recorriendo toda la matriz pixel por pixel y cambiando sus valores RGB.
Este proceso no es complicado, además no es muy interesante, en cambio si es más interesante, seleccionar un solo color y con este color como referencia, reemplazar todos los pixeles que se encuentren con valores iguales o similares por otro color. Más o menos lo que se realiza con el programa Photoshop, utilizando la varita mágica se selecciona un rango de pixeles y con la herramienta bote de pintura, se reemplaza por otro color.
En la imagen podemos ver todo ese proceso, además, photoshop dado un parámetro de “
Tolerancia” (0-255) selecciona no solo el pixel del color donde se hizo un clic, sino todas las tonalidades de ese color, osea, según el parámetro de tolerancia, a mayor tolerancia mayor será el área seleccionada.
¿Cómo logramos esto en Java2d?
Se cargara una imagen en memoria utilizando la clase BufferedImage.
De esta imagen se extrae un pixel al azar con valores RGB (187,13, 14) en una posición (x,y)
Esta imagen forma una matriz mxn donde cada celda es un pixel
[rgb] [rgb] [rgb] [rgb] [rgb] [rgb]
[rgb] [rgb] [rgb] [rgb] [rgb] [rgb]
[rgb] [rgb] [rgb] [rgb] [rgb] [rgb]
[rgb] [rgb] [rgb] [rgb] [rgb] [rgb]
Para cambiar un color de toda la matriz (imagen), se debe recorrer esta mediante ciclos buscando los pixeles que sean iguales al color buscado, y reemplazarlo por otro color. El seudocódigo que hace esto es:
Este seudocódigo, tiene un problema, y es que aunque el ojo humano no pueda percibirlo, un color que para nosotros puede ser igual, este está compuesto por varias tonalidades, asi es que cuando seleccionamos un color RGB (187,13, 14), la comparación se realiza solo para este color.
Esto hace que el área afectada por el cambio de color sea relativamente pequeña y dependa de la uniformidad de colores de la imagen.
Para solucionar este problema, se introduce un nuevo término, “Tolerancia” y su valor va de 0 a 255, este valor nos ayuda a determinar un rango de matices que se aproximen a nuestro color RGB
Para determinar qué valores ingresan en el rango de “tolerancia”, se utiliza la “distancia euclidiana” cuya fórmula es:
Este valor (d) es la distancia que existe entre dos puntos en el espacio, mientras más corta sea el valor de (d), más pequeña es la distancia entre dos puntos, esto también se aplica a los colores.
Mientras más pequeña sea el valor de (d) los colores son más similares entre si, modificamos el seudocódigo y queda de la siguiente forma:
Abrimos photoshop y utilizamos la herramienta “varita mágica” para seleccionar un color, podemos ver como con distintos valores de tolerancia, seleccionamos más y más aéreas de la imagen.
Aplicando nuestro seudocódigo en java y ya con la aplicación lista, procedemos a seleccionar un color de la imagen y la reemplazamos por otra, los resultados son similares.
Es lógico que Photoshop utiliza algoritmos mucho más complejos e inteligentes para aplicar sus filtros, por ejemplo, photoshop selecciona solos los colores similares que estén cerca del punto donde se hizo un clic, en cambio, el código que nosotros aplicamos es simple y selecciona todos las tonalidades del color elegido estén donde estén, esto se aprecia mejor en la tercera imagen de ayanami donde aplicamos tolerancia 100, se puede ver como se selecciono el fondo de la imagen, pero también parte del ojo y del cuello que también son de color rojo, se seleccionaron también.
Enlace de descarga del Proyecto
[actualizado]
9 comentarios:
mouse por favor actualiza el link de descarga please
enlace de descarga actualizado para el 3 de octubre de 2011
Gracias desde Panamá somos como 30 somos estudiante en ing en sistema y nos a ayudamo mucho sigue asi ademas tengo un codigo q compartir sobre java chat con soket y video conferencia con jfm mi correo sebast019@hotmail.com para que lo vea y lo publique mandeme un mensaje para conversar tengo un par de codigo interesantes para compartir.
Puedes actualizar el link de descarga por favor
Por favor acctualiza el link
puedes actualizar el link marca como no valida la descarga
el link esta caido
Podrías reactivar el link de descarga porfavor!! lo necesito para un proyecto
Publicar un comentario