2011-12-19 9 views
13

Recentemente ho avuto l'opportunità di lavorare con le tecnologie di elaborazione delle immagini come parte di uno dei miei progetti e il mio compito era quello di trovare immagini corrispondenti da un archivio di immagini quando viene fornita una nuova immagine. Ho iniziato il mio progetto con il googling "Come confrontare le immagini usando java" e ho ricevuto alcuni buoni articoli sulla ricerca della somiglianza di due immagini. Quasi tutti sono stati basati su quattro passaggi fondamentali, che sono:Come confrontare le immagini per similarità utilizzando 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. 

Anche se questo suona come un buon algoritmo per confrontare le immagini, ci vuole una notevole quantità di tempo dopo l'implementazione utilizzando JAI nel mio progetto. Quindi devo trovare un metodo alternativo per farlo.

Qualche suggerimento?

+0

Avete pensato di utilizzare OpenCV? http://stackoverflow.com/questions/2037579/java-opencv-bindings –

risposta

5

A seconda di come sono diverse le immagini, è possibile fare qualcosa di simile (pseudocodice). È molto primitivo, ma dovrebbe essere abbastanza efficiente. Potresti accelerarlo prendendo pixel casuali o modellati anziché tutti.

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

questo dà davvero abbastanza precisione ?? – sum2000

+0

Beh, non penso che sia la precisione che stai cercando, ma la precisione. Ad esempio, se si prende un'immagine e la si sfalsa di 3 pixel verso il basso e verso sinistra, questo mostrerà che le immagini non sono quasi uguali. Ma poi devi chiederti, dovrebbe? – corsiKa

+0

questo metodo funziona per un'immagine in bianco e nero? – 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

Questo confronterà se le due immagini sono le stesse, sto chiedendo di trovare la somiglianza tra due immagini. – sum2000

+0

Volevo solo controllare, se due immagini diverse hanno le stesse dimensioni, cosa verrà restituito? – ChanGan

+0

Ciao Sandip, Come passare due passate due immagini in posizione fileA e fileB ... entrambi sono la posizione dei file? Puoi per favore darmi un po 'di pazienza. – ChanGan

3

Questa API confronterà due file di immagine e restituire la percentuale di somiglianza

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

Si prega di trovare il nome del metodo con i parametri superiore della prima riga nel codice, ci possiamo passare due immagini con il percorso del file (ex: C: //Documents//image1.jpg) –

+2

Si dovrebbe menzionare questo si basa sul codice di Sandip La risposta di Ganguli. –

Problemi correlati