Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Gráficos (https://www.clubdelphi.com/foros/forumdisplay.php?f=8)
-   -   ¿Cómo verificar que 2 imagenes son iguales o distintas? (https://www.clubdelphi.com/foros/showthread.php?t=89102)

deliriun 26-09-2015 16:54:36

¿Cómo verificar que 2 imagenes son iguales o distintas?
 
Buen día
Me gustaría saber un metodo para comparar 2 imagenes y saber si son iguales o distintas.
He visto unos ejemplos pero no me funcionan, espero me puedan ayudar.

Gracias de antemano.

Casimiro Notevi 26-09-2015 17:26:24

¿Qué ejemplos y por qué no funcionan?

deliriun 26-09-2015 19:14:11

Estoy usando::

Código:

if Image1.Picture.Bitmap.Canvas.Pixels[0,0] = Image2.Picture.Bitmap.Canvas.Pixels[0,0] then
      begin
      showMessage('Iguales');


 End;

Pero siempre me sale el mensaje, sean iguales o no.

deliriun 26-09-2015 19:17:37

También estoy usando un Timer

Código:

procedure TForm5.Button1Click(Sender: TObject);
begin
if Image1.Picture.Bitmap.Canvas.Pixels[0,0] = Image2.Picture.Bitmap.Canvas.Pixels[0,0] then
      begin
      showMessage('Iguales');


 End;
end;

procedure TForm5.Timer1Timer(Sender: TObject);
begin
Image1.Picture.LoadFromFile('E:\Test.bmp');
end;

Y estoy editando Test.bmp constantemente pero siempre me sale el mensaje

tmsanchez 26-09-2015 19:22:00

Intenta lo que mencionan aquí:

http://stackoverflow.com/questions/1...s-are-the-same

Saludos.

Casimiro Notevi 26-09-2015 19:22:39

Je, je, je... ya sé de dónde has tomado ese código :)
Pero si lo lees bien, habrás visto que pone:
Debería bastar con dos For anidados, uno para recorrer filas y otro columnas:

Tú estás comparando el primer pixel, tienes que recorrer toda la imagen para ir comparándola con la otra.

Casimiro Notevi 26-09-2015 19:23:48

Cita:

Empezado por tmsanchez (Mensaje 497204)
Intenta lo que mencionan aquí:
http://stackoverflow.com/questions/1...s-are-the-same
Saludos.

Esa forma es más eficiente que el doble bucle :)

cloayza 27-09-2015 02:54:16

Y porque no obtener el hash md5 o sha de ambas y comparar estos para saber si son distintos o iguales...?

Delphius 27-09-2015 21:08:47

Cita:

Empezado por cloayza (Mensaje 497212)
Y porque no obtener el hash md5 o sha de ambas y comparar estos para saber si son distintos o iguales...?

Aunque en principio es buena idea, es un esfuerzo adicional para la máquina. Calcular un hash o md5 requiere de muchísimas más operaciones. Le lleva más tiempo. Es más apropiado hacer un CompareMem sobre cada fila de pixels.

La otra alternativa es volcar a Streams ambos e invocar a CompareMem a ambos Streams pero esto también tiene su costo ya que estás duplicando la memoria utilizada, ¡Estás generando copias de los bitmpas originales!.
En el enlace que ha puesto en StackOverflow se discutieron estas 2 alternativas.

Saludos,

MAXIUM 28-09-2015 05:28:10

Cita:

Empezado por deliriun (Mensaje 497192)
Buen día
Me gustaría saber un metodo para comparar 2 imagenes y saber si son iguales o distintas.
He visto unos ejemplos pero no me funcionan, espero me puedan ayudar.

Gracias de antemano.

Esta es tu solución http://www.3delite.hu/Object%20Pasca...onLibrary.html :)

Neftali [Germán.Estévez] 28-09-2015 10:40:30

Una pregunta que tal vez parezca tonta...
¿Un único pixel diferente en las imágenes, debería devolver que son diferentes? O dicho de otra manera, ¿La comparación debe omitir pequeños cambios?

Si la respuesta es que deben ser "exactas", creo que comparar pixel a pixel te será más lento que calcular un CRC o HASH del fichero y compararlos.
Si la respuesta es que no (por ejemplo en aplicaciones de detección de movimiento) los métodos de comparación siguen otras técnicas un poco diferentes.

Delphius 28-09-2015 20:20:34

Cita:

Empezado por Neftali (Mensaje 497244)
Una pregunta que tal vez parezca tonta...
¿Un único pixel diferente en las imágenes, debería devolver que son diferentes? O dicho de otra manera, ¿La comparación debe omitir pequeños cambios?

Si la respuesta es que deben ser "exactas", creo que comparar pixel a pixel te será más lento que calcular un CRC o HASH del fichero y compararlos.
Si la respuesta es que no (por ejemplo en aplicaciones de detección de movimiento) los métodos de comparación siguen otras técnicas un poco diferentes.

Si se trata de una comparación exacta leer pixel a pixel es lento, por ello para acelerar el proceso se puede hacer mediante Scanline() y aprovechar CompareMem() y esto requiere explorar solo fila a fila. En el hilo de StackOverflow se da también esta propuesta y me parece bastante ingeniosa.
Calcular Hash o MD5 por ejemplo requiere de muchas más operaciones. Son operaciones consideradas "duras". Si ya de por si para calcular el hash o md5 se necesita leer el contenido binario, directamente que se lea la imagen y se haga el trabajo de comparar. Creo que no vale la pena emplear hash u otros, es más directo y menos lioso realizar una comparación.


Si la comparación permite ciertos cambios o aproximación entre ambas, o como en el caso de detección de movimientos, allí las cosas si se complican y hay que optar por otras soluciones como dices. El componente que ofrece la página que a puesto MAXIMUM creo que hace estos tipos de cosas.


La franja horaria es GMT +2. Ahora son las 14:32:20.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi