Методы сравнения изображений с Java - PullRequest
7 голосов
/ 01 декабря 2010

Я ищу несколько способов сравнить два изображения, чтобы увидеть, насколько они похожи.В настоящее время я планирую использовать проценты в качестве «индекса сходства».Моя схема программы выглядит примерно так:

  1. Пользователь выбирает 2 изображения для сравнения.
  2. С помощью кнопки изображения сравниваются несколькими различными методами.
  3. ВВ конце каждого метода будет указан процент, указывающий, насколько похожи изображения на основе этого метода.

В последнее время я много читал и кое-что прочиталкажется невероятно сложным и продвинутым, и не для таких, как я, с опытом работы с Java на протяжении года.До сих пор я читал о:

  • Преобразование Фурье - я нахожу это довольно запутанным для реализации в Java, но, очевидно, Java Advanced Imaging API имеет классдля этого.Хотя я не уверен, как преобразовать вывод в фактический результат

  • SIFT алгоритм - кажется невероятно сложным

  • Гистограммы - вероятно, самый простой из всех упомянутых до сих пор

  • Пиксельный захват - кажется жизнеспособным, но если существует значительная разница междуэти два изображения не выглядят так, как будто это даст какой-то точный результат.Возможно, я ошибаюсь?

У меня также есть идея предварительно обработать изображение с использованием фильтра Собеля, а затем сравнить его.Проблема заключается в реальной части сравнения.

Так что да, я смотрю, есть ли у кого-нибудь идеи для сравнения изображений в Java.Надеюсь, что здесь есть люди, которые делали подобные проекты раньше.Я просто хочу получить некоторую информацию о жизнеспособных методах сравнения, которые не слишком сложно реализовать в Java.

Заранее спасибо

Ответы [ 2 ]

4 голосов
/ 01 декабря 2010
  • Преобразование Фурье - это может быть использовано для эффективного вычисления взаимной корреляции , которая расскажет вам, как выровнять два изображения и насколько они похожи, когда они оптимально выровнены.
  • Sift descriptors - Они могут использоваться для сравнения локальных особенностей. Они часто используются для анализа соответствия и распознавания объектов. (См. Также SURF )
  • Гистограммы - нормализованная взаимная корреляция часто дает хорошие результаты для сравнения изображений на глобальном уровне. Но поскольку вы просто сравниваете распределение цветов, вы можете в итоге объявить сцену на улице с большим количеством снега похожей на сцену в помещении с множеством белых обоев ...
  • Пиксельный захват - понятия не имею, что это ...

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

Извините, что не относитесь к Java. НТН.

1 голос
/ 02 декабря 2010

В качестве лучшей альтернативы простому захвату пикселей попробуйте SSIM .Однако требует , чтобы ваши изображения были в основном одного и того же объекта под тем же углом.Это полезно, если вы сравниваете изображения, которые были сжаты с помощью различных алгоритмов, например (например, JPEG против JPEG2000).Кроме того, это довольно простой подход, который вы должны быть в состоянии реализовать достаточно быстро, чтобы увидеть некоторые результаты.

Я не знаю реализации Java, но есть реализация C ++ с использованием OpenCV ,Вы можете попытаться использовать это снова (через что-то вроде javacv ) или просто написать это с нуля.Сам алгоритм не так уж и сложен, так что вы должны иметь возможность реализовать его напрямую.

...