web-dev-qa-db-ja.com

javaを使用して画像の類似性を比較する方法

最近、私は自分のプロジェクトの一部として画像処理技術を使用する機会を得ました。私の仕事は、新しい画像が与えられたときに画像ストアから一致する画像を見つけることでした。私は「Javaを使用して画像を比較する方法」をグーグルで開始するプロジェクトを開始し、2つの画像の類似性を見つけるための優れた記事を入手しました。それらのほとんどすべてが4つの基本的な手順に基づいていました。

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 [〜#〜]を使用して実装した後、かなりの時間がかかります。したがって、私はそれを行う別の方法を見つけなければなりません。

助言がありますか?

16
sum2000
    **// 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;
    }
}
12
Sandip Ganguli

この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;
}
7
Sireesha K

画像の違いに応じて、次のようなことができます(疑似コード)。これは非常に原始的ですが、かなり効率的なはずです。すべてではなく、ランダムまたはパターン化されたピクセルを取得することで、速度を上げることができます。

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)
7
corsiKa