本文概述
- 1.下载imagehash项目
- 2.安装依赖项
- 3.比较图像
在本文中, 我们将向你展示如何从Python图片生成不同版本的感知哈希。
1.下载imagehash项目为了比较2张图像并使用Python中的感知哈希验证它们在视觉上是否相同, 我们将依赖@JohannesBuchner提出的imagehash项目的建议。该项目是用Python编写的图像哈希库, 它支持:
- 平均哈希(aHash)
- 感知哈希(pHash)
- 差异哈希(dHash)
- 小波哈希(wHash)
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 !
编码愉快!
推荐阅读
- 使用Android OS进行应用程序开发的挑战
- Hyper(基于Web技术的开源终端)
- 如何在Windows中使用Python检索桌面路径
- HospitalRun(一个免费且易于使用的软件,用于发展世界各地的医疗保健)
- Ubuntu composer错误(你的系统缺少所请求的PHP扩展curl)
- 如何在Ubuntu中使用XAMPP在本地设置虚拟主机
- 如何使用NVM在Ubuntu 16.04上安装任何版本的Node.js
- 在Ubuntu 16.04 Terminal中伪造好莱坞黑客终端
- 基于深度学习的短文本相似度学习与行业测评