他们分别是简单数值运算average hash、difference hash复杂图像变换提取低频部分perceptual hash、wavelet hashAverage hashimage image.convert pixels np.asarray(image) avg pixels.mean() diff pixels avg #多维数组Different hash:image image.convert pixels np.asarray(image) diff pixelsp[:, 1:] pixelsp[:, :-1]Perceptual hash:image image.convert pixels np.asarray(image) dct scipy.fftpack.dct(scipy.fftpack.dct(pixels, axis0), axis1) # 离散余弦变换 # 左上角认为是低频部分低频刻画图像本身高频刻画图像纹理 dctlowfreq dct[:hash_size, :hash_size] med numpy.median(dctlowfreq) diff dctlowfreq medwavelet hash:和 PHash区别在于底层使用小波而非离散余弦变换image image.convert pixels np.asarray(image) #对灰度图像执行最大层级 Haar 二维小波分解得到小波系数 #将分解结果里最低频的 LL 分量系数列表第 0 项全部置 0 #使用修改后的系数执行逆小波变换重构出新的像素图像。 作用抹除图像最粗粒度全局亮度弱化光照带来的干扰。 #对上一步得到的像素矩阵执行dwt_level层 Haar 二维小波分解 #取出分解结果中的低频近似分量 LLcoeffs [0] #计算低频矩阵dwt_low所有数值的中位数 #矩阵每个元素和中位数比这四种方法都对旋转敏感。