Вычисление разницы между изображениями
Ребята, вы знаете какие-нибудь алгоритмы, которые можно использовать для вычисления различий между изображениями?
Возьмите эту веб-страницу, например, http://tineye.com/ Вы даете ей ссылку или загружаете изображение, и оно находит похожие изображения. Я сомневаюсь, что это сравнивает рассматриваемое изображение со всеми из них (или, может быть, это так).
Под вычислениями я подразумеваю, например, как Levenshtein_distance или расстояние Хемминга для строк.
Я ни в коем случае не нуждаюсь в правильном ответе для проекта или чего-либо еще, я просто нашел веб-сайт и стал очень любопытным. Я знаю, Digg платит за аналогичный сервис для их сайта.
7 ответов
Самыми простыми мерами будут подходы, основанные на RMS-ошибках, например:
Возможно, они совпадают с вашими представлениями о мерах расстояния, но их результаты действительно имеют смысл только в том случае, если у вас есть два изображения, которые уже очень близки, например, если вы смотрите, насколько хорошо конкретная схема сжатия сохранила исходное изображение. Кроме того, один и тот же результат любого сравнения может означать много разных вещей, в зависимости от того, какие существуют артефакты (взгляните на статью, которую я цитирую ниже, для некоторых примеров фотографий RMS/PSNR могут вводить в заблуждение).
Помимо этого, существует целая область исследований, посвященных подобию изображения. Я не эксперт, но вот несколько советов:
Много работы было уделено подходам, использующим уменьшение размерности (PCA, SVD, анализ собственных значений и т. Д.), Чтобы выделить основные компоненты изображения и сравнить их на разных изображениях.
Другие подходы (особенно медицинские изображения) используют методы сегментации, чтобы выбрать важные части изображений, затем они сравнивают изображения на основе того, что найдено
Третьи пытались разработать меры сходства, которые позволяют обойти некоторые недостатки ошибок RMS и PSNR. Была довольно крутая статья о мере структурного сходства пространственных доменов (SSIM), которая пытается имитировать восприятие людьми ошибок изображения вместо прямых математических представлений об ошибке. Те же самые ребята сделали улучшенную версию, инвариантную к переводу / вращению, используя вейвлет-анализ в этой статье о WSSIM.
Похоже, что TinEye использует векторы объектов со значениями для множества атрибутов, чтобы сделать их сравнение. Если вы будете охотиться на их сайте, вы в конечном итоге попадете на страницу Ideé Labs, и в их FAQ есть некоторые (но не слишком много) особенности алгоритма:
В: Как работает визуальный поиск?
A: Технология визуального поиска Idée использует сложные алгоритмы для анализа сотен атрибутов изображения, таких как цвет, форма, текстура, яркость, сложность, объекты и области. Эти атрибуты образуют компактную цифровую подпись, которая описывает внешний вид каждого изображения, и эти подписи рассчитываются и индексируются нашим программным обеспечением. При выполнении визуального поиска эти сигнатуры быстро сравниваются нашей поисковой системой для получения визуально похожих результатов.
Это ни в коем случае не является исчерпывающим (это всего лишь горстка методов, с которыми я столкнулся в ходе моего собственного исследования), но если вы ищете технические статьи или просматриваете материалы последних конференций по обработке изображений, вы обязательно найдете больше методов для этого материала. Это не решенная проблема, но, надеюсь, эти указатели дадут вам представление о том, что происходит.
Одним из методов является использование цветных гистограмм. Вы можете использовать алгоритмы машинного обучения, чтобы найти похожие изображения, основываясь на представлении, которое вы используете. Например, обычно используемый алгоритм k-средних. Я видел другие решения, пытающиеся проанализировать вертикальные и горизонтальные линии на изображении после использования обнаружения края. Анализ текстуры также используется.
В недавней статье собраны изображения из сети Picasa. Вы также можете попробовать алгоритм кластеризации, над которым я работаю.
Подумайте об использовании вейвлет-сжатия с потерями и сравните элементы изображений с наибольшей релевантностью.
Вот страница с изображением подобия, но для полигонов. Вы можете преобразовать ваше изображение в конечное число полигонов в зависимости от цвета и формы, и запустить этот алгоритм для каждого из них.
То, что делает TinEye, является своего рода хэшированием изображения или его частей (см. Их часто задаваемые вопросы). Вероятно, это не настоящая хеш-функция, так как они хотят схожие "хеши" для похожих (или почти идентичных) изображений. Но все, что им нужно сделать, это сравнить этот хеш и, возможно, его подстроки, чтобы узнать, являются ли изображения похожими / идентичными или одно содержится в другом.
Вот некоторый код, который я написал 4 года назад в java yikes, который сравнивает изображения с помощью гистограмм. не смотрите ни на что, кроме buildHistograms ()
https://jpicsort.dev.java.net/source/browse/jpicsort/ImageComparator.java?rev=1.7&; view=markup
может быть полезно, по крайней мере, если вы используете Java
Методы корреляции заставят спичку выпрыгнуть. Если это JPEG, вы можете сравнить доминантные коэффициенты для каждого блока 8x8 и получить приличное совпадение. Это не совсем корреляция, но она основана на косинусе, поэтому это двоюродный брат.