Страницы

Поиск по вопросам

четверг, 11 октября 2018 г.

Сравнение картинок на сходство

Как сравнить картинку 1 и картинку 2 ?

на сходство, причем не обязательно, чтобы они могут отличаться размерами. Так же они не должны быть похожи друг на друга на 100%
И какой материал лучше изучить по этой теме?


Ответ

Сравнение картинок, которые могут отличаться размером (яркостью, контрастностью и т.п.), можно через перцептивные хэш-алгоритмы
Перцептивные хэши можно сравнивать между собой и делать вывод о степени различия двух наборов данных.
По этому теме есть статья на хабрахабре. Также я находил реализацию этого алгоритма на с++. Для java уверен либо есть алгоритмы, либо можно написать, т.к. там нет ничего запредельного.
Тут я опишу общий алгоритм, приведя из статьи на хабре:
Уменьшить размер. Самый быстрый способ избавиться от высоких частот — уменьшить изображение. В данном случае мы уменьшаем его до 8х8, так что общее число пикселей составляет 64. Можно не заботиться о пропорциях, просто загоняйте его в квадрат восемь на восемь. Таким образом, хэш будет соответствовать всем вариантам изображения, независимо от размера и соотношения сторон. Убрать цвет. Маленькое изображение переводится в градации серого, так что хэш уменьшается втрое: с 64 пикселей (64 значения красного, 64 зелёного и 64 синего) всего до 64 значений цвета. Найти среднее. Вычислите среднее значение для всех 64 цветов. Цепочка битов. Это самое забавное: для каждого цвета вы получаете 1 или 0 в зависимости от того, он больше или меньше среднего. Постройте хэш. Переведите 64 отдельных бита в одно 64-битное значение. Порядок не имеет значения, если он сохраняется постоянным (я записываю биты слева направо, сверху вниз). Итоговый хэш не изменится, если картинку масштабировать, сжать или растянуть. Изменение яркости или контраста, или даже манипуляции с цветами тоже сильно не повлияет на результат. И самое главное: такой алгоритм очень быстрый! Если вам нужно сравнить две картинки, то просто строите хэш для каждой из них и подсчитываете количество разных битов (это расстояние Хэмминга). Нулевое расстояние означает, что это, скорее всего, одинаковые картинки (или вариации одного изображения). Дистанция 5 означает, что картинки в чём-то отличаются, но в целом всё равно довольно близки друг к другу. Если дистанция 10 или больше, то это, вероятно, совершенно разные изображения.

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

Комментариев нет:

Отправить комментарий