如何用Python中的感知哈希确定2张图像是否相等

本文概述

  • 1.下载imagehash项目
  • 2.安装依赖项
  • 3.比较图像
感知哈希是由特殊算法生成的生成的字符串(哈希)。这种感知哈希是基于某些输入图片的指纹, 可通过计算汉明距离(基本上计算不同的单个位数)来比较图像。如果使用另一种哈希技术比较图像, 则对图片进行最小的更改将生成完全不同的哈希(例如MD5或SHA1)。
在本文中, 我们将向你展示如何从Python图片生成不同版本的感知哈希。
1.下载imagehash项目为了比较2张图像并使用Python中的感知哈希验证它们在视觉上是否相同, 我们将依赖@JohannesBuchner提出的imagehash项目的建议。该项目是用Python编写的图像哈希库, 它支持:
  • 平均哈希(aHash)
  • 感知哈希(pHash)
  • 差异哈希(dHash)
  • 小波哈希(wHash)
你可以使用以下命令通过Git获得该项目的源代码:
git clone https://github.com/JohannesBuchner/imagehash.git

克隆后, 你将可以继续学习本教程的其余部分。有关此库的更多信息, 请访问Github上的官方存储库。
2.安装依赖项imagehash项目以前需要一些依赖项才能正常工作, 可以使用pip轻松安装它们(如果未安装, 请使用sudo apt install python-pip安装pip)并读取项目的需求列表, 因此更改目录:
cd imagehash

【如何用Python中的感知哈希确定2张图像是否相等】然后使用以下命令安装依赖项:
pip install -r conda-requirements.txt

依赖项是:
  • 六:六提供了用于包装Python 2和Python 3之间差异的简单实用程序。它旨在支持无需修改即可在Python 2和3上运行的代码库。六个文件仅包含一个Python文件, 因此可以轻松复制到项目中。
  • 枕头:枕头是Alex Clark和Contributors友好的PIL叉子。 PIL是Fredrik Lundh和贡献者提供的Python Imaging Library。
  • numpy:NumPy是使用Python进行科学计算的基本软件包。它包含其他内容。
  • scipy:SciPy是用于数学, 科学和工程的基于Python的开源软件生态系统。
  • pywavelets:PyWavelets是用于Python的开源小波变换软件。它结合了简单的高级接口以及低级C和Cython性能。
安装库之后, 你现在可以使用它并生成该库提供的不同哈希值。
3.比较图像你可以按照以下示例来生成可以通过此Python项目生成的不同感知哈希:
A.平均哈希
生成感知哈希的最简单方法以及你可能会选择的一种方法, 可以很容易地实现, 如以下示例所示:
# example_averagehash.py# Import dependenciesfrom PIL import Imageimport imagehash# Create the Hash Object of the first imageHDBatmanHash = imagehash.average_hash(Image.open('batman_hd.jpg'))print('Batman HD Picture: ' + str(HDBatmanHash))# Create the Hash Object of the second imageSDBatmanHash = imagehash.average_hash(Image.open('batman_sd.jpg'))print('Batman HD Picture: ' + str(SDBatmanHash))# Compare hashes to determine whether the pictures are the same or notif(HDBatmanHash == SDBatmanHash):print("The pictures are perceptually the same !")else:print("The pictures are different, distance: " + (HDBatmanHash - SDBatmanHash))

在这种情况下, 使用python example_averagehash.py运行脚本将在终端中生成以下输出:
Batman HD Picture: 030f4f0f87070301Batman HD Picture: 030f4f0f87070301The pictures are perceptually the same !

由于蝙蝠侠的图片是相同的, 只是第一张图片具有比第一张图片更高的分辨率, 所以它们将生成相同的哈希值030f4f0f87070301, 尽管它们不是同一文件!你可以阅读有关此博客如何生成平均哈希的非常详细的理论解释。
B.感知哈希(pHash)
通过执行此实现之后的Perceptual Hash计算, 可以像这样使用:
# example_phash.py# Import dependenciesfrom PIL import Imageimport imagehash# Create the Hash Object of the first imageHDBatmanHash = imagehash.phash(Image.open('batman_hd.jpg'))print('Batman HD Picture: ' + str(HDBatmanHash))# Create the Hash Object of the second imageSDBatmanHash = imagehash.phash(Image.open('batman_sd.jpg'))print('Batman HD Picture: ' + str(SDBatmanHash))# Compare hashes to determine whether the pictures are the same or notif(HDBatmanHash == SDBatmanHash):print("The pictures are perceptually the same !")else:print("The pictures are different, distance: " + (HDBatmanHash - SDBatmanHash))

在这种情况下, 使用python example_phash.py运行脚本将在终端中生成以下输出:
Batman HD Picture: a8d14ab75aa9c62bBatman HD Picture: a8d14ab75aa9c62bThe pictures are perceptually the same !

C.差异哈希(dHash)
遵循此实现的” 差异哈希” 计算可以像这样使用:
# example_dhash.py# Import dependenciesfrom PIL import Imageimport imagehash# Create the Hash Object of the first imageHDBatmanHash = imagehash.dhash(Image.open('batman_hd.jpg'))print('Batman HD Picture: ' + str(HDBatmanHash))# Create the Hash Object of the second imageSDBatmanHash = imagehash.dhash(Image.open('batman_sd.jpg'))print('Batman HD Picture: ' + str(SDBatmanHash))# Compare hashes to determine whether the pictures are the same or notif(HDBatmanHash == SDBatmanHash):print("The pictures are perceptually the same !")else:print("The pictures are different, distance: " + (HDBatmanHash - SDBatmanHash))

在这种情况下, 使用python example_dhash.py运行脚本将在终端中生成以下输出:
Batman HD Picture: bf9f97372c2ebbb3Batman HD Picture: bf9f97372c2ebbb3The pictures are perceptually the same !

D.小波哈希(wHash)
遵循此实现的Wavelet Hash计算可以像这样使用:
# example_whash.py# Import dependenciesfrom PIL import Imageimport imagehash# Create the Hash Object of the first imageHDBatmanHash = imagehash.whash(Image.open('batman_hd.jpg'))print('Batman HD Picture: ' + str(HDBatmanHash))# Create the Hash Object of the second imageSDBatmanHash = imagehash.whash(Image.open('batman_sd.jpg'))print('Batman HD Picture: ' + str(SDBatmanHash))# Compare hashes to determine whether the pictures are the same or notif(HDBatmanHash == SDBatmanHash):print("The pictures are perceptually the same !")else:print("The pictures are different, distance: " + (HDBatmanHash - SDBatmanHash))

在这种情况下, 使用python example_whash.py运行脚本将在终端中生成以下输出:
Batman HD Picture: 074fdfdf87070301Batman HD Picture: 074fdfdf87070301The pictures are perceptually the same !

编码愉快!

    推荐阅读