以图搜图
两大类
- pHash + hamming距离
- CNN + cos距离
pHash
cv2的dct变换和库函数imagehash调用的scipy.fftpack.dct结果不太一样,所以编码结果也不一样
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27import numpy as np
import cv2
import imagehash
from PIL import Image
def pHash(img_file):
# step1: gray, 0-255, 32x32
img = cv2.imread(img_file, 0)
img = cv2.resize(img, (32,32), interpolation=cv2.INTER_CUBIC)
# step2: dct, left-top 8x8
img = cv2.dct(img.astype(np.float32))
img = img[:8,:8]
# step3: flatten, mean, 0-1 binary
img = img.reshape((-1)).tolist()
mean = sum(img)/len(img)
img_print = ['1' if i>mean else '0' for i in img]
# hex encoding
return ''.join(['%x' % int(''.join(img_print[i:i+4]),2) for i in range(0,32*32,4)])
cv_hash = pHash(img_file)
scipy_hash = imagehash.phash(Image.open(img_file), hash_size=8, highfreq_factor=4) # imagehash object
scipy_hash = scipy_hash.__str__()以上编码得到16位的16进制编码,类似这张图像的低级特征指纹。
Hamming距离:两个等长字符串,在对应位置的不同字符的个数
- 如果不同字符数不超过5,说明近似
- 如果大于10,说明不同