aHash
aHash (Average Hash, средний хеш) — это алгоритм хеширования изображений, предназначенный для быстрого сравнения визуального содержимого цифровых изображений. Относится к классу перцептивных хешей (perceptual hashing), которые генерируют короткие сигнатуры (хеши) на основе визуальных характеристик изображения, таких как яркость, цвет или текстура. В отличие от криптографических хешей (например, MD5 или SHA), aHash устойчив к небольшим изменениям изображения: изменению размера, сжатию, незначительным цветовым корректировкам. Основное применение — поиск дубликатов, обнаружение похожих изображений, дедупликация контента в базах данных и системах управления цифровыми активами.
Принцип работы
Алгоритм aHash основан на преобразовании изображения в монохромное (оттенки серого) и последующем сравнении яркости пикселей со средним значением. Процесс включает несколько последовательных этапов.
Приведение к единому размеру
Исходное изображение масштабируется до фиксированного размера, обычно 8×8 пикселей. Это уменьшает влияние деталей и шумов, а также унифицирует входные данные. Размер 8×8 выбран как компромисс между точностью и вычислительной сложностью: 64 пикселя достаточно для формирования уникальной сигнатуры, но недостаточно для точного копирования содержимого.
Преобразование в оттенки серого
Цветное изображение преобразуется в градации серого. Для каждого пикселя вычисляется яркость по стандартной формуле (например, Y = 0.299R + 0.587G + 0.114B, где R, G, B — компоненты цвета). Это устраняет цветовую информацию, которая может варьироваться при сжатии или редактировании.
Вычисление среднего значения яркости
Для всех 64 пикселей вычисляется среднее арифметическое значение яркости. Это значение служит порогом для бинаризации.
Бинаризация
Каждый пиксель сравнивается со средним значением: если яркость пикселя больше или равна среднему, ему присваивается значение 1, иначе — 0. В результате получается бинарная матрица размером 8×8.
Формирование хеша
Бинарная матрица преобразуется в одномерный массив из 64 бит. Обычно это делается построчно: сначала первая строка (8 бит), затем вторая и так далее. Полученная последовательность битов интерпретируется как 64-битное целое число (хеш). Например, хеш может быть представлен в виде 16-значного шестнадцатеричного числа.
Сравнение хешей
Для оценки сходства двух изображений сравниваются их aHash-хеши. Используется расстояние Хэмминга — количество позиций, в которых биты различаются. Чем меньше расстояние, тем более похожи изображения. Порог сходства выбирается эмпирически: для 64-битного хеша расстояние 0 означает полное совпадение, 1–3 — почти идентичные изображения, 4–10 — похожие, более 10 — разные.
Отличия от других перцептивных хешей
aHash — один из нескольких алгоритмов перцептивного хеширования. Его основные конкуренты — pHash (Perceptual Hash) и dHash (Difference Hash).
pHash
pHash (алгоритм, разработанный в 2000-х годах) использует дискретное косинусное преобразование (ДКП) для анализа частотных характеристик изображения. В отличие от aHash, который работает только с яркостью, pHash учитывает распределение энергии по частотам. Это делает его более устойчивым к сжатию и изменению размера, но требует больше вычислительных ресурсов. pHash обычно генерирует 64-битный хеш, но может быть расширен до 128 или 256 бит.
dHash
dHash (Difference Hash) вычисляет разницу яркости между соседними пикселями. Сначала изображение масштабируется до 9×8 пикселей (на один столбец больше, чем строк), затем для каждого пикселя сравнивается яркость с соседним справа. Если яркость левого пикселя больше, ставится 1, иначе — 0. Это даёт 64-битный хеш. dHash проще и быстрее aHash, но менее устойчив к поворотам и обрезке.
Сравнительная таблица
| Параметр | aHash | pHash | dHash |
|---|---|---|---|
| Основа | Средняя яркость | ДКП | Разница яркости |
| Размер хеша | 64 бита | 64–256 бит | 64 бита |
| Скорость вычисления | Высокая | Средняя | Очень высокая |
| Устойчивость к сжатию | Средняя | Высокая | Средняя |
| Устойчивость к поворотам | Низкая | Средняя | Низкая |
| Сложность реализации | Низкая | Высокая | Низкая |
Применение
aHash широко используется в задачах, где требуется быстрое сравнение большого количества изображений.
Поиск дубликатов
В системах управления цифровыми активами (DAM) aHash позволяет обнаруживать точные копии изображений, а также изображения, подвергшиеся незначительным изменениям (например, сжатие, изменение яркости, обрезка краёв). Это особенно полезно для дедупликации в облачных хранилищах и социальных сетях.
Обнаружение похожих изображений
В поисковых системах (например, в Google Images, Яндекс.Картинки) aHash используется для кластеризации похожих изображений. При загрузке пользователем фото система вычисляет его хеш и сравнивает с базой данных, возвращая визуально похожие результаты.
Анализ контента в социальных сетях
Платформы, такие как ВКонтакте и Instagram (принадлежит Meta — организация признана экстремистской и запрещена в РФ), применяют aHash для автоматического обнаружения запрещённого контента (например, изображений с насилием или порнографией). Если хеш изображения совпадает с хешем из чёрного списка, контент блокируется.
Защита авторских прав
В системах управления цифровыми правами (DRM) aHash помогает отслеживать несанкционированное распространение изображений. Например, фотографы могут загрузить свои работы в базу данных, а система будет автоматически проверять загружаемые пользователями изображения на совпадение с хешами.
Медицинская диагностика
В радиологии aHash применяется для сравнения снимков (например, рентгеновских или МРТ) с эталонными изображениями. Это позволяет быстро выявлять аномалии, такие как опухоли или переломы, путём поиска похожих случаев в архиве.
Ограничения и критика
Несмотря на простоту и скорость, aHash имеет ряд недостатков.
Чувствительность к геометрическим трансформациям
aHash плохо справляется с поворотами, отражениями и значительными обрезками. Если изображение повёрнуто на 90 градусов, хеш полностью изменится, и алгоритм не сможет определить сходство.
Влияние шума
Сильный шум (например, при съёмке в условиях низкой освещённости) может исказить среднее значение яркости, что приведёт к изменению хеша. Для снижения этого эффекта перед вычислением хеша рекомендуется применять фильтры (например, медианный фильтр).
Ограниченная различительная способность
64-битный хеш может быть недостаточным для различения большого количества изображений. При базе данных в миллионы изображений возможны коллизии (совпадение хешей у разных изображений). Для повышения точности используются более длинные хеши (например, 128-битные) или комбинация с другими алгоритмами.
Неприменимость для точного сравнения
aHash не подходит для задач, где требуется высокая точность, например, для проверки подлинности документов или сравнения медицинских снимков с эталоном. В таких случаях используются более сложные методы, такие как SURF или SIFT.
Реализации
aHash реализован во многих библиотеках для обработки изображений:
- Python: библиотека
ImageHash(разработчик — Johannes Buchner) предоставляет готовые функции для aHash, pHash и dHash. Пример использования:from imagehash import average_hash; hash = average_hash(Image.open('image.jpg')). - C++: библиотека OpenCV (Open Source Computer Vision Library) содержит модуль
img_hash, включающий aHash. Пример:cv::img_hash::AverageHash::create(). - Java: библиотека
java-image-scaling(разработчик — Marco Schmidt) включает реализацию aHash. - JavaScript: библиотека
imghash(разработчик — Peter de Croos) позволяет вычислять aHash в браузере или Node.js.
Интересные факты
- Алгоритм aHash был впервые описан в 2000-х годах в рамках исследований по перцептивному хешированию, но его точное авторство не установлено. Наиболее известная реализация — библиотека
pHash(разработчик — Evan Klinger), которая включает aHash как один из методов. - В 2010 году компания Google запатентовала метод перцептивного хеширования, основанный на aHash, для использования в своём поиске изображений.
- В России aHash применяется в системах мониторинга интернета, таких как «Реестр запрещённой информации» (Роскомнадзор), для автоматического обнаружения изображений, содержащих запрещённый контент.
Источники
- Buchner, J. (2012). ImageHash: A Python library for perceptual hashing. GitHub.
- Klinger, E. (2008). pHash: The open source perceptual hash library. pHash.org.
- OpenCV Team. (2023). OpenCV documentation: img_hash module. OpenCV.org.
- Роскомнадзор. (2022). Методические рекомендации по автоматическому обнаружению запрещённого контента. Москва.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →