感知哈希算法(pHash算法+python代码实现)

感知哈希算法(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)
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
感知哈希算法(Perceptual Hash Algorithm,简称PHash)是一种用于图片相似度比较的算法,通过对图像进行降维处理,将图像转化为一个唯一的hash值,然后通过计算hash值的差异度来判断图像的相似程度。下面是用Python实现PHash算法的步骤: 1. 图像预处理:首先,将图像转为灰度图像,这样可以减少计算复杂度。使用Python的PIL库可以方便地实现这一步骤。 2. 图像缩放:为了降低计算复杂度,将图像缩小到一个固定的大小,如8x8像素。这一步骤也可以使用PIL库来实现。 3. 离散余弦变换(Discrete Cosine Transform,简称DCT):对缩小后的图像进行DCT变换,得到频域信息。可以使用Python的numpy库中的dct函数来计算DCT。 4. 量化:将DCT系数量化,得到一个8x8的二进制矩阵,其中大于平均值为1,小于平均值为0。 5. 生成hash值:将量化后的二进制矩阵转为一个唯一的hash值。可以将矩阵展平,并将每个元素按顺序拼接成一个长字符串,然后使用Pythonhash函数计算出一个hash值。 通过上述步骤,就可以实现PHash算法。使用Python中的PIL库和numpy库可以方便地进行图像处理和计算操作。具体实现代码可以参考以下示例: ```python from PIL import Image import numpy as np def perceptual_hash(image_path): # 图像预处理 image = Image.open(image_path).convert('L') # 图像缩放 image = image.resize((8, 8), Image.ANTIALIAS) # 离散余弦变换 dct_coeffs = np.asarray(image, dtype=float) dct_coeffs = np.round(dct_coeffs) - 128 dct_coeffs = np.fft.dct(dct_coeffs) dct_coeffs = dct_coeffs[:8, :8] # 量化 avg = np.mean(dct_coeffs) hash_value = np.where(dct_coeffs > avg, 1, 0) # 生成hashhash_value = hash_value.flatten().tolist() hash_value = ''.join(map(str, hash_value)) hash_value = hash(hash_value) return hash_value # 使用示例 image1_path = 'image1.jpg' image2_path = 'image2.jpg' hash1 = perceptual_hash(image1_path) hash2 = perceptual_hash(image2_path) print("Image1 hash value:", hash1) print("Image2 hash value:", hash2) ``` 以上代码中的`image1.jpg`和`image2.jpg`分别为待比较的两张图片,根据输出的hash值可以判断两张图片的相似性。如果hash值越接近,则表示图片越相似。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值