it-swarm-pt.tech

Como comparar imagens por similaridade usando java

Recentemente, tive a oportunidade de trabalhar com a Image Processing Technologies como parte de um dos meus projetos e minha tarefa era encontrar imagens correspondentes de uma loja de imagens quando uma nova imagem é fornecida. Comecei meu projeto pesquisando "Como comparar imagens usando Java" e recebi alguns bons artigos sobre como encontrar a semelhança de duas imagens. Quase todos eles foram baseados em quatro etapas básicas, são elas:

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.

Embora isso pareça um bom algoritmo para comparar imagens, leva um tempo considerável depois de implementá-lo usando JAI no meu projeto. Portanto, eu tenho que encontrar um método alternativo para fazê-lo.

Alguma sugestão?

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

Essa API comparará dois arquivos de imagem e retornará a porcentagem de similaridade

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

Dependendo da diferença entre as imagens, você pode fazer algo assim (pseudocódigo). É muito primitivo, mas deve ser bastante eficiente. Você pode acelerar usando pixels aleatórios ou padronizados em vez de todos.

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