dHash
dHash (англ. difference hash, хеш на основе разностей) — это алгоритм вычисления хеш-суммы изображения, основанный на анализе разницы яркости между соседними пикселями. Относится к классу перцептивных хешей (perceptual hashing), предназначенных для сравнения изображений по их визуальному содержанию, а не по точному побитовому совпадению. dHash широко применяется в системах поиска дубликатов изображений, обнаружения модифицированных копий, дедупликации данных и в задачах компьютерного зрения.
Принцип работы
Алгоритм dHash преобразует изображение в компактную битовую строку фиксированной длины (обычно 64 бита), которая отражает относительные изменения яркости между соседними пикселями. Основная идея заключается в том, что визуально похожие изображения будут иметь схожие паттерны перепадов яркости, даже если их абсолютные значения различаются.
Этапы вычисления
- Приведение к оттенкам серого. Исходное цветное изображение преобразуется в полутоновое (grayscale). Это устраняет влияние цветовой палитры и фокусируется на яркостной структуре.
- Масштабирование. Изображение уменьшается до размера (N+1) × N пикселей, где N — желаемая длина хеша в битах. Для стандартного 64-битного хеша используется размер 9 × 8 пикселей. Уменьшение устраняет высокочастотные детали и шум, сохраняя только основные визуальные характеристики.
- Вычисление разностей. Для каждого столбца (от 1 до N) вычисляется разность яркости между пикселем текущего столбца и пикселем предыдущего столбца в той же строке. Таким образом, для изображения 9×8 пикселей получается 8×8 = 64 разности.
- Бинаризация. Каждая разность кодируется одним битом: если разность положительна (яркость увеличилась), бит устанавливается в 1; если отрицательна или равна нулю — в 0.
- Формирование хеша. Полученные 64 бита объединяются в 64-битное целое число, которое и является хешем изображения.
Варианты алгоритма
Существуют две основные модификации dHash, различающиеся направлением сравнения пикселей:
- Горизонтальный dHash (оригинальный): сравниваются соседние пиксели по горизонтали (слева направо). Наиболее распространённый вариант.
- Вертикальный dHash: сравниваются соседние пиксели по вертикали (сверху вниз). Используется для учёта вертикальных структур изображения.
Некоторые реализации комбинируют оба подхода, вычисляя два хеша и объединяя их для повышения устойчивости.
Сравнение с другими перцептивными хешами
dHash является одним из трёх наиболее популярных алгоритмов перцептивного хеширования, наряду с aHash (average hash) и pHash (perceptual hash).
| Характеристика | aHash | dHash | pHash |
|---|---|---|---|
| Основа | Сравнение со средним значением яркости | Сравнение соседних пикселей | Дискретное косинусное преобразование (ДКП) |
| Размер хеша | 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 →