(unos cuantos en este último mes
)El tema es así:
Estoy haciendo 2 programas.. 1 que es el que indexa datos a la base de datos y el otro que es como el "buscador"
el 1º programa toma de la carpeta C:/IMAGENES una imagen (repetirá éste proceso con cada imagen) y a ella le toma una muestra de sus colores en diferentes sectores de la imagen.. o sea... en la 1º linea de pixeles, toma 10 pixeles supongamos (1 pixel cada el 10% de su tamaño..) y verticalmetne hace lo mismo... o sea.. crea como una "matriz" de pixeles..
algo así:

supongan que cada punto blanco es el pixel al que le he visto su color...
ahora tengo todooossssss los valores de sus colores en RGB
tengo 10 x 10 pixeles. o sea: 100 pixeles.. y cada pixel tiene los valores: XXX YYY ZZZ (por ser RGB) entonces tengo 100 x XXX YYY ZZZ
Ahora bien, yo quiero hacer un HASH de esos pixeles para que quede un numero mas chiquito para poder guardarlo en la base de datos
Yo pensé hacer lo siguiente:
Sumar XXX + YYY + ZZZ... hacer ésto con todos los pixeles para tener un valor mucho menor de 1 solo pixel.. e identificar al color del pixel con ese valor... PERO si tengo un pixel de color: 123 456 789 y otro 789 456 123, si sumamos esos numeros, va a dar el mismo valor.. y en realidad, no es el mismo color de pixel ¬¬ entonces queda descartada esa idea...
Luego pense obtener el hash MD5 del gran chorro de numeros (de los 900 numeros.. ya que es: 100 x xxxyyyzzz) xxxyyyzzzxxxyyyzzzxxxyyyzzz... y WALA... quedaría perfecto... me daría el identificador MD5 perfecto... y lo agregaría a la base de datos(pero OJO.. sigan leyendo)
Ahora pasamos al 2º programa...
En el 2º programa hay que ingresar una imagen.. y éste programa deberia mirar en la base de datos si existe esa imagen.. como haría eso?
Tomaría tambien cada el 10% a 1 pixel y generaría una matiz tambien con la misma cantidad de pixeles... tendria que generar el MD5 y WALA... ahora a buscar si existe un MD5 igual en la base de datos

Encontrará la imagen si es que existe, proque el MD5 será igual...
PERO..
Ahora hay un problema de CALIBRE.. o sea... Supongamos que hago una copia de una de las imagenes de C:/IMAGENES.. hago una copia EXACTA en el escritorio... calculo cual sería el 1º pixel al que le toma una muestra.. y lo pinto de negro...
De los 100 pixeles, coincidirá ahora en 99 pixeles.. ya que a uno lo cambie de color...
PERO.. la imagen es 99,999999999999% igual... cambia 1 solo pixel de color.. sin embargo, el MD5 será EXTREMADAMENTE NADA QUE VER... Cambiará demasiado.. y no dará la misma imagen...
Y yo quiero que si dé el mismo HASH... 
Como se podrá hacer eso??
Pensé en lo siguiente:
de los colores: xxx yyy zzz TRUNCAR o REDONDEAR los ultimos valores a "0" y truncar.. y que me quede el color así: XX YY ZZ
De esta manera si el valor del color cambia poco, y queda dentro del redondeo, los valores quedarán iguales.. quedará el mismo pixel.. el mismo color... y el HASH (ahora creado en base a xxyyzzxxyyzz...) será el mismo...
Pero volvamos a lo anterior: QUE PASA SI CAMBIA MUCHO un pixel de los que se le toma la muestra (como minimo, porque si cambian mas, dará PEOR) y su valor RGB queda fuera del redondeo y cambia el valor de la centana y/o decena del RGB? el HASH del MD5 volverá a ser demasiado DIFERENTE... y el buscador de imagenes de la base de datos no encontrará un HASH igual.. ya que éste fue muy cambiado...
Aca va una imagen de ejemplo:

En esa imagen, como veran, hice un pequeño punto rojo... mientras que todooooo lo demas en negro..
Cada pixel blanco no es en realdiad blanco, sino es un "INDICADOR" de que pixeles serán los que se les tomará la muestra... imagenen que solamente INDICAN.. o sea.. serán negros realmente...
No recuerdo que valor es en RGB el negro, pero supongamos que es 000 000 000
EN la 1º imagen (miren mas arriba), la imagen es toda negra.. y en donde estan los puntos blancos (que son negros realmente) hará el muestreo el 1º programa y tomará todooosss valores "000 000 000" elavorará un HASH y listo...
Pero con ésta 2º imagen.. como veran hay un pequeño circulo rojo, y ahí caerá un pixel que se le tomará la muestra... por lo tanto, uno de los 100 valores no será "000 000 000" como antes.. sino que será el color ROJO en RGB, y creo que es: "225 000 000"
Ahora en el 2º programa, cuando se le ingrese ésta 2º imagen, elavorará el HASH de ésta iamgen con ese punto rojo y será un HASH totalmeten diferente al de la 1º imagen.. siendo que las imagenes son muy parecidas... y YO QUIERO QUE LAS TOME COMO QUE SON IGUALES... o sea.. que cuando 5 o 6 pixeles tienen valores diferentes, cree un HASH igual al de la imagen original... se entiende???
Ésto serviría por ejemplo si alguien le pone una firma a la imagen.. el 2º programa ignoraría la firma, porque caería en 1 o 2 pixeles.. y elaboraría el HASH igual a la imagen esa sin la firma....
En fin...
El metodo de redondear lo implementaré si o si por varios factores:
1º: me ayudaría mucho cuando un pixel (o todos) cambia/n poco de color.. por ejemplo cuando se le modifica el brillo...
2º: me acelera la elavoracion del HASH (en caso que no use el MD5)
Hasta el metodo de redondeo puede ser por ejemplo, redondear a xxx yyy zzz a solo 6 numeros terminados en valores pares por ejemplo:
123 054 211 ---aplico redondeo normal--->>> 120 050 210 ---al truncar--->>> "12 05 21"
Siguiendo con el mismo ejemplo.. llega otra imagen en donde a los pixeles se los cambiaron un pocoooo los colores.. por el brillo.. y llega 1 de los tantos pixeles así:
122 053 210 ---aplico redondeo normal--->>> 120 050 210 ---al truncar--->>> "12 05 21"
Como veran.. el resultado es el mismo.. sinembargo los pixeles tenian valores parecidos... que en el color la diferencia casi no se nota.. pero dió el mismo valor y dará por ende, el mismo MD5
si llegaría el mismo pixel pero mas cambiado por ejemplo:
126 056 221 y aplico el redondo a que queden desenas PARES, quedaría --->>> 120 060 220 (ya que redondearía hacia el valor mas cercano PAR para la decena) Y ÉSTE MODO, SERÍA MUCHO MAS EFICIENTE QUE EL ANTERIOR... menos CALIBRADO.. ya que los valores realemtne cambiarían mas.. mucho mas.. porque los valores RGB tendrian que tener como 15 puntos de diferencia para que cambie el valor final del pixel... PERO, eso es lo que quiero.. ya que si le cambiamos mucho el brillo, tiene que seguir dando el mismo valor final...
TODO LINDO ASÍ...
Ahora volvamos a la ***** de si cambian totalmente unos pocos pixeles a los que se le tomaron muestra..
de la imagen original: 123 054 211 que quede: 225 255 255, el redondeo sería: 220 220 220
O sea.. NADA QUE VER.. el HASH MD5 cagaría TODO!!!..
Ahora miren porque el MD5 cagaría todo: (aunque ustedes son expertos en éstos y ya lo saben)
el valor 1122334455 en MD5 tiene el siguiente valor: 3TZ9v!͒@o���
el valor 1222334455 en MD5 tiene el siguiente valor: }�]�f��c���fo�u
el valor 1122334456 en MD5 tiene el siguiente valor: ��#�"8��B �e
Cambió 1 solo numero.. y el valor fue NADA QUE VER...
Para que quiero que de un mismo HASH? para que el 2º buscador genere el mismo HASH y encuentre la imagen en la base de datos.. obviamente... supongo que entienden eso..
Necesito un metodo HASH que devuelva un mismo valor para
111112222233333444445555566666777778888899999000001111122222333334444455555
y para:
000002222233333444445555566666777778888899999000001111122222333334444466666 (cambiaron los 5 primeros numeros solamente)
Alguien tiene idea de como?? de que HASH??
OBVIAMENTE QUE SI NO ENTENDIERON NADA, ME DICEN Y YO EDITO Y MEJORO CON SUPER MAS DETALLES LA EXPLICACION DE LA PARTE QUE NO ENTENDIERON










Autor




En línea


Pero bueno, este no es el tema 

