2011-12-19 27 views
13

最近、私は自分のプロジェクトの一環としてImage Processing Technologiesを扱う機会を得ました。新しい画像が与えられたときにイメージストアから一致するイメージを見つけることでした。私は「Javaを使って画像を比較する方法」というグーグルでプロジェクトを始めました.2つの画像の類似点を見つけるための良い記事があります。ほぼすべてのそれらのは、4つの基本的な手順に基づいていた、彼らは以下のとおりです。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. 

これは、画像を比較するために良いアルゴリズムとして聞こえるが、それは私のプロジェクトでJAIを使用して、それを実装した後、かなりの時間を要します。したがって、私はそれを行う代わりの方法を見つける必要があります。

提案がありますか?

+0

はあなたがOpenCVのを使用して考えていた類似の割合を返しますか? http://stackoverflow.com/questions/2037579/java-opencv-bindings –

答えて

5

イメージの違いによって、このようなことができます(擬似コード)。非常に原始的ですが、かなり効率的です。すべてのピクセルではなくランダムまたはパターン化されたピクセルを取ることで、スピードアップできます。

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

これは実際に十分な精度を与えますか? – sum2000

+0

私はそれがあなたが探している精度だとは思わないが、正確さ。たとえば、画像を取得して3ピクセル下と左にオフセットした場合、これは画像がほとんど同じではないことを示します。しかし、それから、あなた自身に尋ねなければなりませんか? – corsiKa

+0

この方法は白黒画像で機能しますか? – 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

これは、2つの画像が同じかどうかを比較します。私は2つの画像の類似点を探しています。 – sum2000

+0

2つの異なるイメージが同じサイズを満たしている場合、返されるのはチェックしたいだけですか? – ChanGan

+0

こんにちはSandip、2つの画像を渡す方法fileAとfileB ...どちらもファイルの場所ですか?あなたは私に少し簡単に教えてください。 – ChanGan

3

このAPIは、次の2つのイメージファイルを比較し、

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

コードの最初の行のパラメータtopを持つメソッド名を見つけてください。ファイルパスを持つ2つのイメージを渡すことができます(例:C://Documents//image1.jpg) –

+2

これはSandipのコードに基づいていますガングリの答え。 –

関連する問題