python中的哈希算法_使用openCV和Python实现图像哈希(hash)算法

本文介绍了图像哈希算法中的感知哈希dHash,用于生成图像的“指纹”,以便比较图像的相似性。dHash通过计算相邻像素的差异,对图像进行灰度化、调整大小、计算差异和构建哈希值。算法适用于图像归类和快速查找相似图像,具有鲁棒性,对图像尺寸变化和亮度对比度调整有较好的适应性。
摘要由CSDN通过智能技术生成

之前介绍了许多图像比对的算法,这里再介绍一个算法,叫感知哈希算法:perceptual hash algorithm, 它的作用是对每张图像生成一个“指纹”字符串,然后比较不同图像的指纹。结构越接近,说明图像越相似。

哈希算法步骤图解

这个算法常用于图像整理,归类上,比如快速整理手机中的照片文件夹子。该算法的优点明显,相对于其它算法实现起来比较简单,且速度快,准确率高。

图像哈希或者叫感知哈希包括以下两个过程:

1)检查图像内容

2)构造基于图像内容唯一标识,即输入图像的哈希值

最典型的应用比如TinEye,就是一种采用反向图像搜索引擎。用户可以:

1)上传图像

2)然后TinEye给出类似图像的网址

接下来我们将讨论:

1)图像散列(为什么传统散列不起作用)

2)实现图像散列,特别是差异散列(dHash)

3)将图像散列应用于实际问题和数据集

为什么我们不能使用md5,sha-1等?

图2:

在此示例中,我获取输入图像并计算md5哈希值。然后我将图像调整为宽度为250像素而不是500像素,然后再次计算md5哈希值。即使图像的内容没有改变,哈希也是如此。

具有密码学或文件验证背景的读者可能想知道为什么不能使用md5或sha-1等。这里的问题在于加密散列算法的本质:更改文件中的单个位将导致不同的散列。这意味着如果我们改变输入图像中单个像素的颜色,最终会得到一个不同的校验和,而事实上对于我们在图像感知层面上根本不觉得有什么不同。也就是说这个微小的改变我们是无法觉察的。

图2中的例子就说明这个问题,只是改变图像的大小,其它不变,计算图像的md5哈希,结构哈希值发生变化。在图像哈希情况下,我们实际上希望类似的图像具有类似的哈希值。

该项目的测试图像哈希数据集

该项目的目标是:

1)两个图像目录,dataset和query

2)确定query目录中的图像哪些已经在dataset中,哪些没有

使用图像哈希,我们可以快速完成这个任务。

了解图像哈希和差异哈希

dHash算法只有四个步骤

步骤一:转换图像为灰度

图3:通过差异散列算法进行图像散列的第一步是将输入图像(左)转换 为灰度(右)。

图像散列算法的第一步把输入图像转换成灰度并丢弃任何颜色信息。这样我们只需要检查一个通道,从而更快地散列图像,另外匹配相同但颜色空间略有变化的图像。无论出于何种原因,如果你对于颜色感兴趣,可以独立在每个通道上应用散列算法,然后在最后进行组合。

步骤二:调整大小

灰度图像后,把图像压缩到9 x 8像素,忽略纵横比。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
感知哈希算法(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值越接近,则表示图片越相似。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值