2011-12-19 22 views
13

Geçtiğimiz günlerde Görüntü İşleme Teknolojileri ile projelerimden birinin bir parçası olarak çalışma fırsatım oldu ve görevim, yeni bir görüntü verildiğinde görüntü deposundan eşleşen görüntüler bulmaktı. Projemizi "java kullanarak görüntüleri nasıl karşılaştıracağım" ile başladım ve iki görüntünün benzerliğini bulmak için iyi makaleler aldım. Hemen hepsi dört adımdan dayandığını, onlar:java kullanarak benzerlik için görüntüleri nasıl karşılaştırılır

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. 

bu iyi algoritma görüntüleri karşılaştırmak için, benim projede Jai kullanarak uygulamadan sonra zaman önemli miktarda alır sesler rağmen. Bu yüzden bunu yapmanın alternatif bir yöntemini bulmak zorundayım.

Herhangi bir öneriniz var mı?

+0

Eğer OpenCV kullanarak düşündünüz mü benzerlik yüzdesini dönecek? http://stackoverflow.com/questions/2037579/java-opencv-bindings –

cevap

5

Görüntülerin ne kadar farklı olduğuna bağlı olarak, bunun gibi bir şey yapabilirsiniz (sözde kod). Çok ilkel, ama oldukça verimli olmalı. Her biri yerine rastgele veya desenli pikseller alarak hızlandırabilirsiniz.

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

bu gerçekten yeterli hassasiyet veriyor mu? – sum2000

+0

Peki, aradığın kesinliğin doğruluk olduğunu düşünmüyorum. Örneğin, bir görüntüyü alıp 3 piksel aşağı ve sola göre dengelerseniz, bu resimlerin neredeyse hiçbir şey olmadığını gösterir. Ama sonra kendine sormalısın, değil mi? – corsiKa

+0

Bu yöntem siyah beyaz bir görüntü için mi çalışıyor? – 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

İki görüntü aynıysa, bu iki görüntü arasındaki benzerliği bulmayı sorar. – sum2000

+0

İki farklı görüntünün aynı büyüklükte aynı olup olmadığını kontrol etmek istedim, ne iade edilecek? – ChanGan

+0

Merhaba Sandip, DosyaA ve fileB'de iki geçişli iki görüntü nasıl geçilir ... her ikisi de dosyaların yeridir? Bana biraz kısaca verebilir misin? – ChanGan

3

Bu API iki görüntü dosyasını karşılaştırmak ve

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

Lütfen kodda birinci satırın en üstündeki parametreleri içeren yöntem ismini bulunuz, orada iki resim dosya yolu ile geçebiliriz (örn .: C: //Documents//image1.jpg) –

+2

Bunu, Sandip'in koduna dayalı olarak belirtmelisiniz. Ganguli'nin cevabı. –

İlgili konular