Foros del Web » Programación para mayores de 30 ;) » Java »

[SOLUCIONADO] Reconstruir imagen

Estas en el tema de Reconstruir imagen en el foro de Java en Foros del Web. Muy buenas a todos, estoy desarollando un codigo cuya idea es la de generar una imagen con "ruido" (por llamarlo de alguna forma) y despues ...
  #1 (permalink)  
Antiguo 03/08/2015, 06:59
 
Fecha de Ingreso: diciembre-2012
Mensajes: 15
Antigüedad: 11 años, 4 meses
Puntos: 0
Reconstruir imagen

Muy buenas a todos, estoy desarollando un codigo cuya idea es la de generar una imagen con "ruido" (por llamarlo de alguna forma) y despues a partir de esa imagen con ruido y otro archivo obtener la imagen original.
Basicamente lo que hago es a partir de la imagen original, generar una segunda imagen en la cual de manera aleatoria intercambio los pixeles, por cada pixel intercambiado guardo en un archivo la posicion de los pixeles intercambiados, por ejemplo, si empiezo con el pixel 0,0 de la imagen original, y genero dos numeros aleatorios, supongamos que me da 100,100, lo que hago es intercambiar el pixel que esta en la posicion 0,0 por el que esta en la posicion 100,100. Como es logico, estos cambios lo hago en la segunda imagen, ya que la primera no la modifico para nada, de modo que en esta segunda imagen, copio en la posicion 0,0 el pixel que esta en la posicion 100,100, y luego copio el pixel que esta en la posicion 100,100 en la posicion 0,0, espero haberme explicado, por si no esta muy claro, copio el codigo para que se vea mejor el proceso

//Recorro la imagen pixel a pixel
for(int i=0; i<ancho; i++){
for(int j=0; j<alto; j++){
//Obtengo las posiciones aleatorias x e y
int posX = r.nextInt(ancho);
int posY = r.nextInt(alto);
//copio el pixel aleatorio en la pos del pixel a tratar
imagen_2.setRGB(i, j, imagen.getRGB(posX, posY));
imagen_2.setRGB(posX, posY, imagen.getRGB(i, j));
//relleno el fichero
String s = i+" "+j+" "+posX+" "+posY;
fs.escribirFichero(s);
}
}

Este proceso funciona bien, ya que la segunda imagen que genera a partir de este metodo parece el tipico ruido de la tele que es lo que pretendo.
El problema me surge a la hora de reconstruir la imagen.
Lo que hago es recorrer el archivo que me almacena las "permutaciones" a la inversa, es decir, del final al principio, recuperando los valores de los pixeles intercambiados. Esta parte la he comprobado y lo hace bien, me recupera de forma correcta los valores, asi que descarto que el fallo que tengo sea ese
Una vez tengo los valores de la permutacion, creo una tercera imagen en la que "deshago" el cambio a partir de la segunda(la del ruido añadido) pero no logro nunca recuperar la imagen original.
No se a que se debe el fallo, por mas que lo intente.
He intentado buscar por google haber si encontraba algo, pero nada de nada
El codigo en concreto que utilizo para reconstruir la imagen es el siguiente:

for(int i=(split.length-1); i>=0; i=i-4){
//Obtengo los valores
int x_orig = Integer.parseInt(split[i-3]);
int y_orig = Integer.parseInt(split[i-2]);
int x_modf = Integer.parseInt(split[i-1]);
int y_modf = Integer.parseInt(split[i-0]);
//Coloco los pixeles en su sitio
imagen_3.setRGB(x_orig, y_orig, imagen_2.getRGB(x_modf, y_modf));
imagen_3.setRGB(x_modf, y_modf, imagen_2.getRGB(x_orig, y_orig));
}
En donde la variable "split" es un vector de String, sobre el que tengo almacenado todos las permutaciones recuperadas del archivo

Por si surgiera la duda sobre como se organiza el archivo decir que por ejemplo para la permutacion que puse arriba, la [0,0]->[100,100] lo que guardo en el archivo es la siguiente "frase" 0 0 100 100 y asi para cada una de las permutaciones

Alguien sabe como solucionar este problema? He pensado que tal vez mi problema no sea de codigo, aunque quien sabe, tal vez podria ser un problema al hora de plantear la logica del mismo

Espero que puedan ayudar, sin mas muchas gracias
  #2 (permalink)  
Antiguo 03/08/2015, 09:31
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: Reconstruir imagen

Buenas,

Es normal que no te funcione. En el fichero estas guardando las posiciones de los pixeles que has modificado, pero no el valor RGB que tenian antes. Por eso luego no tienes informacion suficiente para reconstruir.

Un saludo
__________________
If to err is human, then programmers are the most human of us
  #3 (permalink)  
Antiguo 03/08/2015, 12:20
 
Fecha de Ingreso: diciembre-2012
Mensajes: 15
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: Reconstruir imagen

Que va, el fallo no es ese, estoy completamente seguro de ello, nose si tal vez no me has entendido bien, la idea de reconstruir la imagen no es solamente a partir del archivo que guarda las permutaciones, si quisiera reconstruir la imagen a partir unicamente del archivo si llevas razon, tendria que guardar tambien el color, pero yo lo que tengo en mente es reconstruir la imagen, a partir de la imagen con "ruido" y a partir del archivo de permutaciones, es decir, el color del pixel lo tengo en la imagen, no en el archivo.
Si te fijas bien en el codigo, llamo a la funcion setRGB de la clase BufferedImage, para ello me hace falta la posicion x e y del pixel a tratar y el color RGB del mismo, asi que cuando paso de la imagen original a la imagen con ruido, a esta ultima le estoy pasando el color del pixel, tan solo he modificado su posicion; y lo mismo pasa cuando intento recuperar la imagen original a partir de la de ruido, hago la misma operacion pasandole el color.
El fallo debe de estar en otro lado.
Te agradezco mucho tu respuesta. Un saludo
  #4 (permalink)  
Antiguo 03/08/2015, 15:16
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: Reconstruir imagen

Ya, pero fíjate estás haciendo para cada pixel que recorres:

Código Java:
Ver original
  1. int posX = r.nextInt(ancho);
  2. int posY = r.nextInt(alto);

Por lo que en muchos casos estás selecionando para reemplazar un pixel que has cambiado ya.


Un saludo
__________________
If to err is human, then programmers are the most human of us
  #5 (permalink)  
Antiguo 04/08/2015, 05:46
 
Fecha de Ingreso: diciembre-2012
Mensajes: 15
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: Reconstruir imagen

En efecto, tienes razon, eso si que ocurre, es decir, la probabilidad de reemplazar un pixel ya reemplazado segun se avanza en el recorrido de la imagen va en aumento, no sabria calcular una expresion matematica para calcular esta probabilidad, pero no hay que pensar mucho para darse cuenta de que esto sucede.
Una posible forma de solucionar el problema original que planteaba tal vez sea evitar que esto suceda, aunque tambien, por otro lado, no creo que el problema en la reconstruccion de la imagen parta de esta premisa, pondre un ejemplo para explicarme mejor:
-Supongase que la imagen que tengo es de 200x200 pixeles, y que yo voy a reordenar solo 3 pixeles. Las permutaciones que hago serian:
* pixel[0,0] -> lo cambio a posicion [100,100],
* pixel[100,100] -> lo cambio a posicion [0,0]
(ambos quedan permutados), asi que en el fichero escribo lo siguiente 0 0 100 100
Ahora vuelvo a cambiar el pixel [100,100], es decir, cambio un pixel ya cambiado de la siguiente manera:
* pixel[100,100] -> lo cambio a posicion [200,200],
* pixel[200,200] -> lo cambio a posicion [100,100]
(ambos quedan permutados), asi que en el fichero escribo lo siguiente 100 100 200 200

Hasta aqui, si analizamos la imagen:
- el pixel que originalmente estaba en la posicion [0,0] pasa a estar en la posicion [200,200]
- el pixel que originalmente estaba en la posicion [100,100] pasa a estar en la posicion [0,0]
- y el pixel que originalmente estaba en la posicion [200,200] pasa a estar en la posicion [100,100]

Y el fichero finalmente tiene las siguientes entradas:
0 0 100 100
100 100 200 200

Si yo ahora recorro a la inversa en fichero, la primera entrada que obtengo seria:
100 100 200 200
Asi que realizo ese cambio, el pixel de la posicion 200 200 lo cambio por el de la posicion 100 100 y viceversa, el de la posicion 100 100 lo pongo en 200 200
Ahora tengo que:
- el pixel que estaba originalmente en la posicion [0,0]; que es el que acabo en la posicion 200 200, pasa a estar en la posicion [100,100] y en la posicion [200,200] se coloca el pixel que va en su lugar, el 200 200 que habia acabo en la posicion [100,100] en la ultima permutacion
asi que ahora tengo:
posicion original [0,0] -> pixel que contiene [100,100]
posicion original [100,100] -> pixel que contiene [0,0]
posicion original [200,200] -> pixel que contiene [200,200]
Por lo que el ultimo pixel cambiado esta en su lugar, todo correcto

Prosigo, la siguiente entrada que leo del fichero seria
0 0 100 100
vuelvo a realizar el cambio. Resumiendo, una vez realizado el cambio me queda:
posicion original [0,0] -> pixel que contiene [0,0]
posicion original [100,100] -> pixel que contiene [100,100]
posicion original [200,200] -> pixel que contiene [200,200]

Asi que como podemos ver con esta mini-traza, a pesar de que un pixel cambie varias veces su posicion, a la hora de reconstruir la imagen, lo hace bien.
Nose si a la hora de hacer un cambio en todos los pixeles, surge algun error que no me percato, pero la logica me dice que este cambio multiple puede ser resuelto. Hacer una traza para una imagen de 200x200 pixeles seria una locura seguirla, por eso las trazas que he hecho por ahora para analizar su comportamiento son breves

Creo que el problema debe de estar localizado en otro lugar, aunque intentare modificar el algoritmo para que no se permute un pixel ya cambiado haber si esto lo resuelve.

P.D.: Siento la parrafada que he soltado, pero me gusta ser lo mas minucioso posible, mas que nada para que puedan enterderme. Espero haberme explicado bien. Un saludo.
  #6 (permalink)  
Antiguo 04/08/2015, 05:57
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: Reconstruir imagen

Buenas,

No hay problema, entiendo todo lo que comentas. Entonces confirmas que leyendo el fichero a la inversa tampoco te reconstruye la imagen?
Las trazas que has hecho para pocos pixeles son correctas y no has visto nada raro?

Un saludo
__________________
If to err is human, then programmers are the most human of us
  #7 (permalink)  
Antiguo 05/08/2015, 06:45
 
Fecha de Ingreso: diciembre-2012
Mensajes: 15
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: Reconstruir imagen

Exacto, te lo confirmo, leyendo el fichero a la inversa no logra reconstruirme la imagen.
Te pongo en enlace a unas capturas de pantalla que he hecho para que veas como es el procesado de imagenes:

Imagen de 480x360


Imagen de 30x30


En respuesta a la pregunta que me haces sobre si he visto algo raro, la verdad que no, de hay que este "desesperado" porque por mucho que reviso y reviso el codigo no encuentro ningun fallo, no logro entender porque esto no funciona, ya que mi logica me dice que el algoritmo planteado es valido y deberia de funcionar

Tienes alguna idea sobre todo esto? Si lo fueras a hacer tu, como lo plantearias?
Gracias por toda la ayuda que me estas ofreciendo.
  #8 (permalink)  
Antiguo 05/08/2015, 07:49
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: Reconstruir imagen

Buenas,

Es normal lo que te pasa ya que estas perdiendo informacion.

Código Java:
Ver original
  1. imagen_2.setRGB(i, j, imagen.getRGB(posX, posY));
  2. imagen_2.setRGB(posX, posY, imagen.getRGB(i, j));

Cuando sustituyes el RBG recoges el valor del pixel de una imagen 'limpia' (imagen).Esto no es correcto, ya que debes trabajar siempre con el valor 'verdadero'.


Imaginate una imagen de cuatro pixeles con colores 1,2,3,4

Recorres cada pixel y obtienes un aleatorio
Paso 1 -> posicion 1 0 -> aleatorio 3 0 -> resultado 3,2,1,4
Paso 2 -> posicion 2 0 -> aleatorio 3 0 -> resultado 3,3,2,4
Paso 3 -> posicion 3 0 -> aleatorio 4 0 -> resultado 3,3,4,3
Paso 4 -> posicion 4 0 -> aleatorio 1 0 -> resultado 4,3,4,1


El resultado es 4,3,4,1. Has perdido definitivamente el valor 2!!!, por lo que no puedes reconstruir la imagen correctamente.

Cuando hagas las permutaciones tienes que hacerlas sobre los valores existentes en imagen2.

Un saludo
__________________
If to err is human, then programmers are the most human of us
  #9 (permalink)  
Antiguo 05/08/2015, 13:36
 
Fecha de Ingreso: diciembre-2012
Mensajes: 15
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: Reconstruir imagen

Eres un pu** genio, el problema era ese, nose como no llegue a darme cuenta. Tienes razon, a la hora de reconstruir la imagen debo de acerlo sobre si misma, en vez de sobre una "imagen en blanco". Yo sabia que el fallo no era en la logica del algoritmo en si, sino que era alguna estupidez que se me habia pasado por alto.
No sabes cuanto te lo agradezco. Un saludo. Mil gracias.

Etiquetas: string, valor
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:45.