оригинал:blog.CSDN.net/общее желание/AR…
1. Представьте
Ссылка 1 знакомит с основными принципами поиска похожих изображений С помощью поисковых систем по сходству, таких как milvus (ссылка 2), мы можем очень быстро реализовать поиск по сходству.
Но перед осуществлением поиска изображение необходимо преобразовать в вектор признаков. Среднее значение хэша, представленное в этой статье, является особенностью изображения.
2. Процесс расчета среднего хэша
- Чтение изображения и преобразование в оттенки серого
import numpy as np
import cv2
img = cv2.imread('Alyson_Hannigan_200512.jpg', cv2.IMREAD_GRAYSCALE)# IMREAD_GRAYSCALE, IMREAD_COLOR
Изображение взято из ссылки 4.
- изменить размер изображения
Необходимо равномерно преобразовать картинки в фиксированный размер, чтобы картинки разных размеров могли получить хэш-значение фиксированного размера
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, и длина хэш-значения, полученного при настройке этого размера, также отличается.
- Найдите среднее значение серого
ave = np.mean(img2)
- получить двоичный хэш
Пройдите каждый пиксель в изображении в градациях серого, если значение пикселя больше, чем среднее значение в градациях серого, установите значение 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-битное хеш-значение.
- Преобразовать двоичную строку в шестнадцатеричную строку
Используйте следующую программу для преобразования «двоичной строки в шестнадцатеричную строку»:
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. Плюсы и минусы среднего хеширования
- преимущество
- Простой и быстрый расчет
- После пропорционального масштабирования среднее значение хеш-функции изображения почти не изменилось.
- Потому что после окончательного изменения размера среднее значение и значение каждого пикселя практически не изменяются.
- Линейно увеличивать или уменьшать яркость, среднее хеш-значение картинки остается неизменным
- Потому что разница между значением каждого пикселя и средним значением почти не меняется.
- недостаток
Нелинейное увеличение или уменьшение яркости изображения приведет к большому изменению среднего значения хеш-функции. Упомянутая здесь нелинейность означает, что все значения пикселей не увеличиваются/уменьшаются на одно и то же кратное яркости, а, например, значение серого [0,120] увеличивается на 50, а значение серого [121,255] уменьшается на 20. Такие изменения вызывает каждый пиксель. Разница между значением и средним значением варьируется в широких пределах. Например, после гамма-коррекции изображения его среднее значение хеш-функции сильно меняется.
5. Резюме
Алгоритм среднего хеширования, средний хэш, также известный как aHash, является простейшим алгоритмом перцепционного хеширования.
В данной работе приводится исходный код процесса расчета, а также анализируются его преимущества и недостатки.
В этой статье в будущем будут публиковаться более сложные алгоритмы хэширования.
Другие похожие методы поиска изображений см. в Справке 3. Методы, использованные в этой статье, и дополнительные сведения см. в Справке 4.