2011-12-19 28 views
13

Gần đây tôi có cơ hội để làm việc với hình ảnh Processing Technologies là một phần của một trong những dự án của mình và nhiệm vụ của tôi là tìm hình ảnh phù hợp từ một cửa hàng hình ảnh khi một hình ảnh mới được đưa ra. Tôi bắt đầu dự án của tôi với googling "Làm thế nào để so sánh hình ảnh bằng cách sử dụng java" và tôi có một số bài viết tốt về việc tìm kiếm sự giống nhau của hai hình ảnh. Hầu như tất cả trong số họ đã dựa trên bốn bước cơ bản, đó là:Làm thế nào để so sánh hình ảnh cho tương đồng sử dụng 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. 

Mặc dù điều này có vẻ như một thuật toán tốt để so sánh hình ảnh, phải mất một số lượng đáng kể thời gian sau khi thực hiện nó bằng cách sử JAI trong dự án của tôi. Vì vậy tôi phải tìm một phương pháp thay thế để làm điều đó.

Mọi đề xuất?

+0

Bạn đã nghĩ đến việc sử dụng OpenCV? http://stackoverflow.com/questions/2037579/java-opencv-bindings –

Trả lời

5

Tùy thuộc vào cách khác nhau những hình ảnh, bạn có thể làm một cái gì đó như thế này (giả). Nó rất nguyên thủy, nhưng nên khá hiệu quả. Bạn có thể tăng tốc độ bằng cách lấy các pixel ngẫu nhiên hoặc khuôn mẫu thay vì mỗi pixel.

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

thực hiện điều này thực sự cung cấp đủ độ chính xác? – sum2000

+0

Tôi không nghĩ rằng đó là độ chính xác mà bạn đang tìm kiếm, nhưng chính xác. Ví dụ, nếu bạn chụp ảnh và bù đắp nó bằng 3 pixel xuống và sang trái, điều này sẽ cho thấy các hình ảnh hầu như không giống nhau. Nhưng sau đó bạn phải tự hỏi mình, phải không? – corsiKa

+0

phương pháp này có hoạt động cho hình ảnh đen trắng không? – 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

Điều này sẽ so sánh nếu hai hình ảnh giống nhau, tôi yêu cầu tìm sự giống nhau giữa hai hình ảnh. – sum2000

+0

Chỉ muốn kiểm tra, nếu hai hình ảnh khác nhau có cùng kích thước, hình ảnh sẽ được trả về? – ChanGan

+0

Hi Sandip, Làm thế nào để vượt qua hai vượt qua hai hình ảnh trong tập tin placeA và fileB ... cả hai đều là vị trí của các tập tin? Bạn có thể vui lòng cho tôi chút ngắn gọn không. – ChanGan

3

API này sẽ so sánh hai tập tin hình ảnh và trở về tỷ lệ tương

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

Hãy tìm tên phương pháp với các thông số trên của firstline trong mã, có chúng ta có thể vượt qua hai hình ảnh với đường dẫn tập tin (ví dụ: C: //Documents//image1.jpg) –

+2

Bạn nên đề cập đến điều này được dựa trên mã từ Sandip Câu trả lời của Ganguli. –

Các vấn đề liên quan