感知哈希算法(pHash算法+python代码实现)
pHash算法是计算图片相似度算法的一种,可以用在以图搜图上面,原理也很简单,下面简单罗列一下算法过程:
- 缩放图片尺寸:缩放到8*8的大小,这里是为了去除图片的细节,只保留结构、明暗等基本信息,摒弃不同尺寸、比例带来的图片差异;
- 简化色彩:将缩放后的图片转化为灰度图
- 计算平均值,计算64个像素点的平均值
- 比较灰度图的像素值:将64个像素点的值与平均值做对比,大于平均值的记为1,小于或等于平均值的记为0
- 计算哈希值:将上一步的计算结构组合在一起,这就是这一张图片的“指纹”,组合的次序并不重要,只要保证所有的图片采用的组合次序都一样就可以了。
- 计算不同图片的韩明距离
汉明距离
- 汉明距离定义:两个等长距离的字符串的汉明距离为连个字符串对应位置不同字符的个数,比如“100010”和“000001”的汉明距离为3
pHash算法的python代码实现
import cv2
import numpy as np
def pHash(img):
img = cv2.resize(img, (8, 8), interpolation=cv2.INTER_CUBIC)
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img_sum = np.sum(img)
img_mean = img_sum / 64
img_finger = np.where(img > img_mean, 1, 0)
return img_finger
if __name__ == '__main__':
img1 = cv2.imread('11.png')
img1_phash = pHash(img1)
img2 = cv2.imread('12.jpg')
img2_phash = pHash(img2)
isquel = img1_phash == img2_phash
index = isquel ==True
han = isquel[index]
#两张图片的相似度
hanming = len(han)