2009-06-15 3 views

ответ

3

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

Иногда они предназначены только для того, чтобы обеспечить удобный способ идентификации файла без вмешательства человека, особенно в присутствии нескольких параллельных авторов, на которые нельзя полагаться, чтобы увеличить некоторый главный счетчик (JPG001 JPG002) без перекрытия.

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

+0

Итак, вы бы использовали его, если хотите назначить уникальное трудно угадающее имя для изображения? – seanbrant

+1

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

-1

Umm .... Для сравнения изображений (в широком смысле, изображений или любых других двоичных файлов) быстро, не сравнивая весь файл?

+0

Ну, пока вы поняли, что два изображения, которые могут казаться в основном одинаковыми или точно такими же или даже отличаются только метаданными, тогда да. –

+0

... отличаются метаданными, но все же не соответствуют этому «сравнению», то да. –

1

На практике хеширование изображений является популярным для поиска похожих изображений в последовательности кадров или видео или для встраивания водяного знака с различными изображениями, как сейчас показывают многие из киностудий (почти послушайте обратно в Fight Club в жутком смысле !).

+0

Не похоже, но точно так же ... –

26

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

Одно из применений этого поиска. TinEye.com позволяет загружать изображение и находить множество его вхождений в Интернете. например google, у него есть искатель веб-страниц, который сканирует веб-страницы и ищет изображения. Затем он хэширует эти изображения и сохраняет хэш и url в базе данных. Когда вы загружаете изображение, он просто вычисляет хэш и извлекает все URL-адреса, связанные с этим хешем в базе данных. Примеры использования TinEye включают в себя поиск версий изображений с высоким разрешением или поиск общедоступных facebook/myspace/и т. Д. профиль от их изображений (в предположении, эти профили используют ту же самую фотографию.

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

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

19

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

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

Изображение, которые выглядят идентичны нам, может быть очень разным, если вы просто сравните необработанные байты.Это может быть связано с:

  • изменение размера
  • вращение
  • немного отличается цветовая гамма
  • другой формат
  • некоторые незначительные шумы, водяные знаки и артефакты

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

Итак, вам нужна хеш-функция, которая создаст аналогичный (или даже идентичный) хэш для похожих изображений. Один из общих - locality sensitive hashing. Но мы знаем, какие проблемы могут быть с изображениями, поэтому мы можем найти more specialized kind of hash.

Наиболее известные алгоритмы:

  • a-hash. Среднее хеширование - это самый простой алгоритм, который использует только несколько преобразований. Масштабируйте изображение, преобразуйте его в оттенки серого, вычислите среднее значение и выровняйте серию оттенков серого на основе среднего значения. Теперь преобразуем двоичное изображение в целое число. Алгоритм настолько прост, что вы можете реализовать его через час.
  • p-hash. Перцептивный хэш использует подобный подход, но вместо усреднения полагается на discrete cosine transformation (популярное преобразование в обработке сигналов).
  • d-hash. Хэш хеширования использует тот же подход, что и хэш, но вместо использования информации о средних значениях он использует градиенты (разница между соседними пикселями).
  • w-hash. Очень похоже на p-hash, но вместо DCT он использует wavelet transformation.

Кстати, если вы используете питон, все эти хэш уже реализованы в this library.

+0

Здесь я улучшил d-hash несколькими способами: https://github.com/Nakilon/dhash-vips#idhash-the-important-difference-hash – Nakilon

Смежные вопросы