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

309
09 марта 2018, 14:54

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

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

И какой материал лучше изучить по этой теме?

Answer 1

Сравнение картинок, которые могут отличаться размером (яркостью, контрастностью и т.п.), можно через перцептивные хэш-алгоритмы.

Перцептивные хэши можно сравнивать между собой и делать вывод о степени различия двух наборов данных.

По этому теме есть статья на хабрахабре. Также я находил реализацию этого алгоритма на с++. Для java уверен либо есть алгоритмы, либо можно написать, т.к. там нет ничего запредельного.

Тут я опишу общий алгоритм, приведя из статьи на хабре:

  1. Уменьшить размер. Самый быстрый способ избавиться от высоких частот — уменьшить изображение. В данном случае мы уменьшаем его до 8х8, так что общее число пикселей составляет 64. Можно не заботиться о пропорциях, просто загоняйте его в квадрат восемь на восемь. Таким образом, хэш будет соответствовать всем вариантам изображения, независимо от размера и соотношения сторон.

  2. Убрать цвет. Маленькое изображение переводится в градации серого, так что хэш уменьшается втрое: с 64 пикселей (64 значения красного, 64 зелёного и 64 синего) всего до 64 значений цвета.

  3. Найти среднее. Вычислите среднее значение для всех 64 цветов.

  4. Цепочка битов. Это самое забавное: для каждого цвета вы получаете 1 или 0 в зависимости от того, он больше или меньше среднего.

  5. Постройте хэш. Переведите 64 отдельных бита в одно 64-битное значение. Порядок не имеет значения, если он сохраняется постоянным (я записываю биты слева направо, сверху вниз).

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

Если вам нужно сравнить две картинки, то просто строите хэш для каждой из них и подсчитываете количество разных битов (это расстояние Хэмминга). Нулевое расстояние означает, что это, скорее всего, одинаковые картинки (или вариации одного изображения). Дистанция 5 означает, что картинки в чём-то отличаются, но в целом всё равно довольно близки друг к другу. Если дистанция 10 или больше, то это, вероятно, совершенно разные изображения.

Итого, чтобы сравнить две картинки:

  • Нужно найти перцептивные хэши обеих картинок.
  • С помощью расстояния Хэмминга определить степень различия хэшей и на основе различия определить их схожесть.
READ ALSO
Шифрование UDP java

Шифрование UDP java

Нужно шифровать UDP соединение c помощью TLS, JSSE вроде бы поддерживает DTLS, но я не могу найти примеровНекоторые говорят, вообще вроде бы deprecated,...

207
Как отсортировать файл со строками в java? [требует правки]

Как отсортировать файл со строками в java? [требует правки]

Добрый день! Подскажите как отсортировать файл со строками в java?

198
“Вылетает” активность

“Вылетает” активность

при нажатии на элемент списка RecyclerView открывается новая активность за это отвечает код в адаптере:

195
Получение доступа к вебсокету через SOCKS5

Получение доступа к вебсокету через SOCKS5

Есть проект на Spring MVC и я хочу подключиться с фронтенда (JavaScript) socketio веб сокету через Socks5

202