Подтвердить что ты не робот

Как сравнить изображения для сходства с помощью java

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

Любые предложения?

4b9b3361

Ответ 1

    **// 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;
    }
}

Ответ 2

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

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)

Ответ 3

Этот 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;
}