Средний хэш (aHash) в поиске похожих изображений

искусственный интеллект

оригинал:blog.CSDN.net/общее желание/AR…

1. Представьте

Ссылка 1 знакомит с основными принципами поиска похожих изображений С помощью поисковых систем по сходству, таких как milvus (ссылка 2), мы можем очень быстро реализовать поиск по сходству.

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

2. Процесс расчета среднего хэша

  1. Чтение изображения и преобразование в оттенки серого
import numpy as np
import cv2
img = cv2.imread('Alyson_Hannigan_200512.jpg', cv2.IMREAD_GRAYSCALE)# IMREAD_GRAYSCALE, IMREAD_COLOR

Изображение взято из ссылки 4.

  1. изменить размер изображения

Необходимо равномерно преобразовать картинки в фиксированный размер, чтобы картинки разных размеров могли получить хэш-значение фиксированного размера

img2 = cv2.resize(img, (8, 8), interpolation=cv2.INTER_AREA)

Resize использует здесь другие методы интерполяции, и полученные результаты будут несколько отличаться.

  • INTER_NEAREST – интерполяция ближайшего соседа.
  • INTER_LINEAR – билинейная интерполяция (используется по умолчанию)
  • INTER_AREA – передискретизация с использованием отношения площади пикселя. ...
  • INTER_CUBIC – бикубическая интерполяция по окрестностям размером 4×4 пикселя.
  • INTER_LANCZOS4 — интерполяция Ланцоша по окрестностям размером 8×8 пикселей.

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

  1. Найдите среднее значение серого
ave = np.mean(img2)
  1. получить двоичный хэш

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

hash_bin = ''
for i in range(img2.shape[0]):
    for j in range(img2.shape[1]):
        value = img2[i][j]
        if value>ave:
            hash_bin+='1'
        else:
            hash_bin+='0'
print(hash_bin)#1110011111000111110010111100001011000100111101001111100011101000
print(len(hash_bin))#64

Как вы можете видеть здесь, поскольку размер изображения фиксирован и равен 8x8, в итоге получается 64-битное хеш-значение.

  1. Преобразовать двоичную строку в шестнадцатеричную строку

Используйте следующую программу для преобразования «двоичной строки в шестнадцатеричную строку»:

hash_hex = format(int(hash_bin, 2),'x')# bin to hex
hash_hex.rjust(16,'0')# fixed to 16 hex values with zero pending
print(hash_hex)# e7c7cbc2c4f4f8e8
print(len(hash_hex))# 16

Окончательное вычисленное значение «e7c7cbc2c4f4f8e8» является средним значением хеш-функции.

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

3. Расчет расстояния между двумя средними хэш-значениями

Следующий код, учитывая две шестнадцатеричные строки хеш-значений, вычисляет расстояние Хэмминга:

# hex string 
ahash_hex_1 = "e7c7cbc2c4f4f8e8"
ahash_hex_2 = "8a0303f6df3ec8cd"
scale = 16
# convert hex to binary 
ahash_bin_1 = bin(int(ahash_hex_1, scale)).zfill(64) # fixed 64 bit for this paper
ahash_bin_2 = bin(int(ahash_hex_2, scale)).zfill(64) 
# binary difference calculation
diff = 0
for i in range(len(ahash_bin_1)):
    b1 = ahash_bin_1[i]
    b2 = ahash_bin_2[i]
    if b1!=b2:
        diff+=1
print(diff) #27       

Отсюда разница (расстояние) между двумя хэшами равна 27.

4. Плюсы и минусы среднего хеширования

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

Нелинейное увеличение или уменьшение яркости изображения приведет к большому изменению среднего значения хеш-функции. Упомянутая здесь нелинейность означает, что все значения пикселей не увеличиваются/уменьшаются на одно и то же кратное яркости, а, например, значение серого [0,120] увеличивается на 50, а значение серого [121,255] уменьшается на 20. Такие изменения вызывает каждый пиксель. Разница между значением и средним значением варьируется в широких пределах. Например, после гамма-коррекции изображения его среднее значение хеш-функции сильно меняется.

5. Резюме

Алгоритм среднего хеширования, средний хэш, также известный как aHash, является простейшим алгоритмом перцепционного хеширования.

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

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

Другие похожие методы поиска изображений см. в Справке 3. Методы, использованные в этой статье, и дополнительные сведения см. в Справке 4.

6. Ссылка

  1. Вууху. Руан Ифэн.com/blog/2011/0…
  2. milvus.io/
  3. Вууху. Руань Ифэн.com/blog/2013/0…
  4. woohoo.hackerfactor.com/blog/index. …