Как сравнить изображения по сходству с помощью Java - PullRequest
14 голосов
/ 20 декабря 2011

Недавно я получил возможность работать с технологиями обработки изображений в рамках одного из моих проектов, и моей задачей было найти подходящие изображения в хранилище изображений, когда дается новое изображение.Я начал свой проект с поиска в Google «Как сравнивать изображения с использованием 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 в моем проекте.Поэтому я должен найти альтернативный способ сделать это.

Есть предложения?

Ответы [ 3 ]

10 голосов
/ 20 июня 2012
    **// 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;
    }
}
6 голосов
/ 11 декабря 2015

Этот API сравнивает два файла изображения и возвращает процент сходства

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;
}
6 голосов
/ 20 декабря 2011

В зависимости от того, насколько разные изображения, вы можете сделать что-то вроде этого (псевдокод). Это очень примитивно, но должно быть довольно эффективно. Вы могли бы ускорить его, взяв вместо каждого случайные или шаблонные пиксели.

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