ImageSearch

以图搜图

  1. 两大类

    • pHash + hamming距离
    • CNN + cos距离
  2. 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
    27
    import 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,说明不同