个性化阅读
专注于IT技术分析

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

本文概述

感知哈希是由特殊算法生成的生成的字符串(哈希)。这种感知哈希是基于某些输入图片的指纹, 可通过计算汉明距离(基本上计算不同的单个位数)来比较图像。如果使用另一种哈希技术比较图像, 则对图片进行最小的更改将生成完全不同的哈希(例如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

然后使用以下命令安装依赖项:

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 dependencies
from PIL import Image
import imagehash

# Create the Hash Object of the first image
HDBatmanHash = imagehash.average_hash(Image.open('batman_hd.jpg'))
print('Batman HD Picture: ' + str(HDBatmanHash))

# Create the Hash Object of the second image
SDBatmanHash = 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 not
if(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: 030f4f0f87070301
Batman HD Picture: 030f4f0f87070301
The pictures are perceptually the same !

由于蝙蝠侠的图片是相同的, 只是第一张图片具有比第一张图片更高的分辨率, 所以它们将生成相同的哈希值030f4f0f87070301, 尽管它们不是同一文件!你可以阅读有关此博客如何生成平均哈希的非常详细的理论解释。

B.感知哈希(pHash)

通过执行此实现之后的Perceptual Hash计算, 可以像这样使用:

# example_phash.py

# Import dependencies
from PIL import Image
import imagehash

# Create the Hash Object of the first image
HDBatmanHash = imagehash.phash(Image.open('batman_hd.jpg'))
print('Batman HD Picture: ' + str(HDBatmanHash))

# Create the Hash Object of the second image
SDBatmanHash = imagehash.phash(Image.open('batman_sd.jpg'))
print('Batman HD Picture: ' + str(SDBatmanHash))

# Compare hashes to determine whether the pictures are the same or not
if(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: a8d14ab75aa9c62b
Batman HD Picture: a8d14ab75aa9c62b
The pictures are perceptually the same !

C.差异哈希(dHash)

遵循此实现的”差异哈希”计算可以像这样使用:

# example_dhash.py

# Import dependencies
from PIL import Image
import imagehash

# Create the Hash Object of the first image
HDBatmanHash = imagehash.dhash(Image.open('batman_hd.jpg'))
print('Batman HD Picture: ' + str(HDBatmanHash))

# Create the Hash Object of the second image
SDBatmanHash = imagehash.dhash(Image.open('batman_sd.jpg'))
print('Batman HD Picture: ' + str(SDBatmanHash))

# Compare hashes to determine whether the pictures are the same or not
if(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: bf9f97372c2ebbb3
Batman HD Picture: bf9f97372c2ebbb3
The pictures are perceptually the same !

D.小波哈希(wHash)

遵循此实现的Wavelet Hash计算可以像这样使用:

# example_whash.py

# Import dependencies
from PIL import Image
import imagehash

# Create the Hash Object of the first image
HDBatmanHash = imagehash.whash(Image.open('batman_hd.jpg'))
print('Batman HD Picture: ' + str(HDBatmanHash))

# Create the Hash Object of the second image
SDBatmanHash = imagehash.whash(Image.open('batman_sd.jpg'))
print('Batman HD Picture: ' + str(SDBatmanHash))

# Compare hashes to determine whether the pictures are the same or not
if(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: 074fdfdf87070301
Batman HD Picture: 074fdfdf87070301
The pictures are perceptually the same !

编码愉快!

赞(0)
未经允许不得转载:srcmini » 如何用Python中的感知哈希确定2张图像是否相等

评论 抢沙发

评论前必须登录!