Библиотека Java для сравнения сходства изображений

Я потратил довольно много времени на изучение библиотеки, которая позволяет мне сравнивать изображения друг с другом в Java.

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

В принципе, я хочу сравнить два изображения друг с другом и получить значение того, насколько они похожи. Как процент или около того.

Надеюсь, у вас, ребята, есть что-то, что я могу использовать, я не знаю, как написать что-то подобное...

PS: Это не обязательно должно быть на Java, это просто среда, в которой будет работать мое приложение.

Ответ 1

Вы можете взглянуть на два ответа на сам SO: этот пример касается самого сравнения изображений, предлагая ссылки на вещи на С++ (если я правильно прочитал), а этот канал предлагает ссылки на более широкие подходы, один из которых находится в C.

Я бы предложил начать со второй ссылки, так как там ссылки на эту дискуссию, которые приведут к реализации кода некоторых соответствующих методов, которые вы могли бы "перевести" на Java самостоятельно.

Что лучшие мои навыки Google могли бы сделать, ни одна Java, хотя - извините. Надеюсь, это хорошая отправная точка!

EDIT: Здесь кто-то с вашей проблемой написал свой класс сравнения в Java. Однако я не читал исходный код. Он прямо заявляет, что он тоже не мог найти Java-библиотеки для этой цели, поэтому он сам написал сам.

О, и этот вопрос о SO имеет, вероятно, лучшие ссылки по этому поводу, касающиеся Java-библиотек обработки изображений. Надеюсь, среди них есть одна из них, которая может сравнивать изображения для сходства.

Хорошо, последнее редактирование: В книге обработки изображений Java показана реализация Java базового алгоритма для определения разницы между двумя картинками. У него также есть электронное письмо, чтобы связаться с парнем, который написал его, а также с множеством ссылок. Нет библиотеки.

EDIT после прочтения вашего комментария к вашему вопросу: Если вы уже не проверили все вышеперечисленные ссылки, так как вам кажется, что вы проверяете, равны ли два изображения, я бы предложил начать с Cookbook обработки изображений Java (так как у этого есть реализация алгоритма на Java для проверки равные образы) и последняя ссылка на вопрос SO. Кроме того, проверить PerceptualImageDiff и исходный код этого проекта (С++); это звучит очень изящно - по-видимому, он должен проверить, соответствуют ли два изображения человеческой визуальной системе.

Ответ 2

Сверху моей головы OpenCV - отличная библиотека обработки изображений, но она может быть излишней, если вы просто хотите для сравнения изображений. Если это так, я бы пошел с ImageJ.

Кто-то уже спросил, как это сделать, используя OpenCV здесь.

Я бы использовал С++ для этого, но если вы должны использовать Java, есть проект, который сделал оболочку Java для OpenCV, здесь.

Ответ 3

Я использовал класс в эту ссылку, чтобы сравнить два изображения продукта, и результаты были классными. Это не очень сложно реализовать, просто для сравнения двух изображений, вам просто нужно удалить строки JAI и Swing и т.д. Он изменяет размеры изображений до 300x300 и возвращает значение разности, например "1234". Максимальное значение разности составляет около 11041, указано в ссылке. Делая разделение, вы можете просто получить процент. Если интересно, я могу опубликовать измененный код здесь позже.

Результаты были классными, но у меня все еще есть "фотографии цифровых фотоаппаратов", которые обнаруживаются как "ТВ-фотографии". Итак, я использовал ImageJ для обнаружения ребер на картинке. Используя операцию обнаружения краев, ImageJ преобразует изображение в обнаруженное ребро изображение greyform. Затем я помещал два обнаруженных края изображения в один и тот же компаратор и умножал оба значения. Результаты стали еще точнее.

Получение обнаруженной по краям формы изображений