Открыть сервис

dHash

dHash (англ. difference hash, хеш на основе разностей) — это алгоритм вычисления хеш-суммы изображения, основанный на анализе разницы яркости между соседними пикселями. Относится к классу перцептивных хешей (perceptual hashing), предназначенных для сравнения изображений по их визуальному содержанию, а не по точному побитовому совпадению. dHash широко применяется в системах поиска дубликатов изображений, обнаружения модифицированных копий, дедупликации данных и в задачах компьютерного зрения.

Принцип работы

Алгоритм dHash преобразует изображение в компактную битовую строку фиксированной длины (обычно 64 бита), которая отражает относительные изменения яркости между соседними пикселями. Основная идея заключается в том, что визуально похожие изображения будут иметь схожие паттерны перепадов яркости, даже если их абсолютные значения различаются.

Этапы вычисления

  1. Приведение к оттенкам серого. Исходное цветное изображение преобразуется в полутоновое (grayscale). Это устраняет влияние цветовой палитры и фокусируется на яркостной структуре.
  1. Масштабирование. Изображение уменьшается до размера (N+1) × N пикселей, где N — желаемая длина хеша в битах. Для стандартного 64-битного хеша используется размер 9 × 8 пикселей. Уменьшение устраняет высокочастотные детали и шум, сохраняя только основные визуальные характеристики.
  1. Вычисление разностей. Для каждого столбца (от 1 до N) вычисляется разность яркости между пикселем текущего столбца и пикселем предыдущего столбца в той же строке. Таким образом, для изображения 9×8 пикселей получается 8×8 = 64 разности.
  1. Бинаризация. Каждая разность кодируется одним битом: если разность положительна (яркость увеличилась), бит устанавливается в 1; если отрицательна или равна нулю — в 0.
  1. Формирование хеша. Полученные 64 бита объединяются в 64-битное целое число, которое и является хешем изображения.

Варианты алгоритма

Существуют две основные модификации dHash, различающиеся направлением сравнения пикселей:

  • Горизонтальный dHash (оригинальный): сравниваются соседние пиксели по горизонтали (слева направо). Наиболее распространённый вариант.
  • Вертикальный dHash: сравниваются соседние пиксели по вертикали (сверху вниз). Используется для учёта вертикальных структур изображения.

Некоторые реализации комбинируют оба подхода, вычисляя два хеша и объединяя их для повышения устойчивости.

Сравнение с другими перцептивными хешами

dHash является одним из трёх наиболее популярных алгоритмов перцептивного хеширования, наряду с aHash (average hash) и pHash (perceptual hash).

ХарактеристикаaHashdHashpHash
ОсноваСравнение со средним значением яркостиСравнение соседних пикселейДискретное косинусное преобразование (ДКП)
Размер хеша64 бита (8×8)64 бита (9×8)64 бита (8×8 после ДКП)
Устойчивость к изменению яркостиНизкаяСредняяВысокая
Устойчивость к поворотуНизкаяНизкаяСредняя
Скорость вычисленияОчень высокаяВысокаяСредняя
Сложность реализацииОчень низкаяНизкаяСредняя

dHash занимает промежуточное положение: он быстрее и проще pHash, но устойчивее к изменениям яркости и контраста, чем aHash. При этом dHash чувствителен к зеркальным отражениям и поворотам изображения.

Применение

Поиск дубликатов изображений

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

Обнаружение модифицированных копий

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

Дедупликация в хранилищах

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

Защита авторских прав

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

Компьютерное зрение

В некоторых системах распознавания объектов и классификации изображений dHash используется как дешёвый дескриптор для предварительной фильтрации или индексации.

Ограничения

  • Чувствительность к зеркальному отражению. Горизонтальное или вертикальное отражение изображения приводит к полностью противоположному хешу, так как направление сравнения пикселей меняется на противоположное.
  • Неустойчивость к повороту. Поворот изображения на угол более нескольких градусов разрушает структуру разностей, делая хеши несопоставимыми.
  • Неустойчивость к сильному кадрированию. Если обрезана значительная часть изображения, паттерн разностей изменяется кардинально.
  • Зависимость от размера. Для корректного сравнения все изображения должны быть приведены к одинаковому размеру перед вычислением хеша.
  • Коллизии. Как и любой хеш-алгоритм, dHash может давать одинаковые хеши для разных изображений, хотя вероятность коллизий для 64-битного хеша невелика.

Реализации

Алгоритм dHash реализован во многих библиотеках компьютерного зрения и обработки изображений:

  • Python: библиотека ImageHash (поддерживает aHash, dHash, pHash, whash), PIL/Pillow с ручной реализацией.
  • C++: OpenCV (через модуль img_hash), собственная реализация.
  • JavaScript: библиотека imghash для Node.js.
  • Go: пакет go-imagehash.
  • Java: библиотека phash (включает dHash).

Пример реализации на Python с использованием Pillow:

```python from PIL import Image

def dhash(image, hash_size=8): image = image.convert('L').resize((hash_size + 1, hash_size)) pixels = list(image.getdata()) diff = [] for row in range(hash_size): for col in range(hash_size): left = pixels[row (hash_size + 1) + col] right = pixels[row (hash_size + 1) + col + 1] diff.append(left < right) return sum(2**i for i, bit in enumerate(diff)) ```

История

Алгоритм dHash был впервые описан в 2011 году в блоге разработчика Нила Кравица (Neal Krawetz) в статье «Looks Like It». Кравиц предложил dHash как более быструю и простую альтернативу существующим методам перцептивного хеширования, в частности pHash, основанному на дискретном косинусном преобразовании. С тех пор dHash получил широкое распространение в индустрии благодаря своей эффективности и лёгкости реализации.

Источники

  • Krawetz N. Looks Like It // Hacker Factor Blog, 2011.
  • Zauner C. Implementation and Benchmarking of Perceptual Image Hash Functions // Upper Austria University of Applied Sciences, 2010.
  • Monga V., Evans B. L. Perceptual Image Hashing Via Feature Points: Performance Evaluation and Tradeoffs // IEEE Transactions on Image Processing, 2006.
  • Документация библиотеки ImageHash (Python).
  • OpenCV модуль img_hash — документация.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →