Вычисление разницы между изображениями - PullRequest
27 голосов
/ 05 марта 2009

Ребята, знаете ли вы какие-нибудь алгоритмы, которые можно использовать для вычисления различий между изображениями?

Возьмем, к примеру, эту веб-страницу http://tineye.com/ Вы даете ей ссылку или загружаете изображение, и оно находит похожие изображения. Я сомневаюсь, что это сравнивает рассматриваемое изображение со всеми из них (или, может быть, это так).

Под вычислениями я подразумеваю то, что Levenshtein_distance или Расстояние Хэмминга для строк.

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

Ответы [ 7 ]

24 голосов
/ 05 марта 2009

Самыми простыми мерами будут подходы, основанные на среднеквадратичной ошибке, например:

Возможно, они совпадают с вашими представлениями о мерах расстояния, но их результаты действительно имеют смысл только в том случае, если у вас уже есть два очень близких изображения, например, если вы смотрите, насколько хорошо конкретная схема сжатия сохранила исходное изображение , Кроме того, один и тот же результат любого сравнения может означать много разных вещей, в зависимости от того, какие существуют артефакты (взгляните на статью, которую я цитирую ниже, для некоторых примеров фотографий RMS / PSNR могут вводить в заблуждение).

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

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

6 голосов
/ 05 марта 2009

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

Недавняя бумага сгруппированных изображений из сети Picasa. Вы также можете попробовать алгоритм кластеризации , над которым я работаю.

4 голосов
/ 05 марта 2009

Рассмотрите возможность использования вейвлет-сжатия с потерями и сравнения элементов изображений с наибольшей релевантностью.

1 голос
/ 05 марта 2009

вот код, который я написал 4 года назад в java yikes , который сравнивает изображения с помощью гистограмм не смотрите ни на что, кроме buildHistograms ()

https://jpicsort.dev.java.net/source/browse/jpicsort/ImageComparator.java?rev=1.7&view=markup

может быть полезно, по крайней мере, если вы используете Java

1 голос
/ 05 марта 2009

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

1 голос
/ 05 марта 2009

То, что делает TinEye, является своего рода хэшированием изображения или его частей (см. Их FAQ ). Вероятно, это не настоящая хеш-функция, поскольку они хотят иметь одинаковые «хэши» для похожих (или почти идентичных) изображений. Но все, что им нужно сделать, это сравнить этот хеш и, возможно, его подстроки, чтобы узнать, являются ли изображения похожими / идентичными или одно содержится в другом.

0 голосов
/ 05 марта 2009

Методы корреляции заставят спичку выпрыгнуть. Если это JPEG, вы можете сравнить доминантные коэффициенты для каждого блока 8x8 и получить достойное совпадение. Это не совсем корреляция, но она основана на косинусе, поэтому это двоюродный брат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...