2011-12-19 54 views
13

Recientemente tuve la oportunidad de trabajar con Tecnologías de procesamiento de imágenes como parte de uno de mis proyectos y mi tarea era encontrar imágenes coincidentes de una tienda de imágenes cuando se proporciona una nueva imagen. Comencé mi proyecto con Google "Cómo comparar imágenes usando Java" y obtuve algunos buenos artículos sobre cómo encontrar la similitud de dos imágenes. Casi todos ellos se basaron en cuatro pasos básicos, que son:Cómo comparar imágenes de similitud usando java

1.Locating the Region of Interest (Where the Objects appear in the given image), 
2.Re-sizing the ROIs in to a common size, 
3.Substracting ROIs, 
4.Calculating the Black and White Ratio of the resultant image after subtraction. 

Aunque esto suena como un buen algoritmo para comparar las imágenes, se necesita una cantidad considerable de tiempo después de su aplicación utilizando JAI en mi proyecto. Por lo tanto, tengo que encontrar un método alternativo para hacerlo.

¿Alguna sugerencia?

+0

¿Ha pensado en utilizar OpenCV? http://stackoverflow.com/questions/2037579/java-opencv-bindings –

Respuesta

5

Dependiendo de cuán diferentes sean las imágenes, podría hacer algo como esto (pseudocódigo). Es muy primitivo, pero debería ser bastante eficiente. Puede acelerarlo tomando píxeles aleatorios o modelados en lugar de cada uno.

for x = 0 to image.size: 
    for y = 0 to image.size: 
     diff += abs(image1.get(x,y).red - image2.get(x,y).red) 
     diff += abs(image1.get(x,y).blue - image2.get(x,y).blue) 
     diff += abs(image1.get(x,y).green - image2.get(x,y).green) 
    end 
end 

return ((float)(diff))/(x * y * 3) 
+0

¿Esto realmente da suficiente precisión? – sum2000

+0

Bueno, no creo que sea la precisión que estás buscando, sino la precisión. Por ejemplo, si toma una imagen y la desplaza 3 píxeles hacia abajo y hacia la izquierda, esto mostrará que las imágenes no son casi iguales. Pero entonces tienes que preguntarte, ¿o sí? – corsiKa

+0

¿funciona este método para una imagen en blanco y negro? – manu

10
**// This API will compare two image file // 
// return true if both image files are equal else return false//** 
public static boolean compareImage(File fileA, File fileB) {   
    try { 
     // take buffer data from botm image files // 
     BufferedImage biA = ImageIO.read(fileA); 
     DataBuffer dbA = biA.getData().getDataBuffer(); 
     int sizeA = dbA.getSize();      
     BufferedImage biB = ImageIO.read(fileB); 
     DataBuffer dbB = biB.getData().getDataBuffer(); 
     int sizeB = dbB.getSize(); 
     // compare data-buffer objects // 
     if(sizeA == sizeB) { 
      for(int i=0; i<sizeA; i++) { 
       if(dbA.getElem(i) != dbB.getElem(i)) { 
        return false; 
       } 
      } 
      return true; 
     } 
     else { 
      return false; 
     } 
    } 
    catch (Exception e) { 
     System.out.println("Failed to compare image files ..."); 
     return false; 
    } 
} 
+0

Esto comparará si las dos imágenes son iguales, estoy pidiendo que encuentre la similitud entre dos imágenes. – sum2000

+0

Solo quería comprobar, si dos imágenes diferentes cumplen el mismo tamaño, ¿qué se devolverá? – ChanGan

+0

Hola Sandip, Cómo pasar dos pasa dos imágenes en su lugar archivoA y archivoB ... ¿ambas son la ubicación de los archivos? ¿Puedes darme un poco breve? – ChanGan

3

Esta API comparar dos archivos de imagen y consigue el porcentaje de similitud

public float compareImage(File fileA, File fileB) { 

    float percentage = 0; 
    try { 
     // take buffer data from both image files // 
     BufferedImage biA = ImageIO.read(fileA); 
     DataBuffer dbA = biA.getData().getDataBuffer(); 
     int sizeA = dbA.getSize(); 
     BufferedImage biB = ImageIO.read(fileB); 
     DataBuffer dbB = biB.getData().getDataBuffer(); 
     int sizeB = dbB.getSize(); 
     int count = 0; 
     // compare data-buffer objects // 
     if (sizeA == sizeB) { 

      for (int i = 0; i < sizeA; i++) { 

       if (dbA.getElem(i) == dbB.getElem(i)) { 
        count = count + 1; 
       } 

      } 
      percentage = (count * 100)/sizeA; 
     } else { 
      System.out.println("Both the images are not of same size"); 
     } 

    } catch (Exception e) { 
     System.out.println("Failed to compare image files ..."); 
    } 
    return percentage; 
} 
+0

Encuentra el nombre del método con los parámetros en la parte superior de la primera línea en el código, allí podemos pasar dos imágenes con la ruta del archivo (por ejemplo: C: //Documents//image1.jpg) –

+2

Deberías mencionar que está basado en el código de Sandip La respuesta de Ganguli. –

Cuestiones relacionadas