Python 图像哈希库 imagehash:从原理到实践
一、前言:为什么需要图像哈希?
在当下的互联网环境中,图像数据以爆炸式速度增长。从社交平台的图片分发,到电商平台的商品图采集,再到内容审核、重复图像检测、盗图追踪,如何高效比较两个图像是否相同或相似成为一个核心问题。
我们可以使用深度学习模型如 CNN、ViT 提取图像特征,但这需要 GPU,代价高、复杂度大。而传统图像处理领域提供了一个简单高效的解决方案。
图像感知哈希(Perceptual Hash, pHash)及其系列算法
Python 图像哈希库 imagehash 的原理与实践。涵盖安装、四大核心算法(aHash、pHash、dHash、wHash)解析、哈希值比较方法(汉明距离)、十大应用场景及性能优化方案。对比了与传统 OpenCV 及深度学习的差异,提供了完整的图片重复检测系统代码示例,适用于内容去重、以图搜图等工程场景。
在当下的互联网环境中,图像数据以爆炸式速度增长。从社交平台的图片分发,到电商平台的商品图采集,再到内容审核、重复图像检测、盗图追踪,如何高效比较两个图像是否相同或相似成为一个核心问题。
我们可以使用深度学习模型如 CNN、ViT 提取图像特征,但这需要 GPU,代价高、复杂度大。而传统图像处理领域提供了一个简单高效的解决方案。
图像感知哈希(Perceptual Hash, pHash)及其系列算法
Python 的 imagehash 库正是目前应用最广、最稳定的一套图像哈希计算工具。
它具有以下特点:
无论你是做:内容去重、图像相似搜索、爬虫去重、图库管理、数字资产管理、图形数据库、以图搜图系统,imagehash 都能胜任。
接下来,我们将从安装、算法原理、使用方法、进阶技巧,逐步完整展开。
imagehash 是基于 PIL(即 pillow)的图像感知哈希算法工具包。
安装方式非常简单:
pip install imagehash pillow
常用导入方式:
from PIL import Image
import imagehash
它支持四大经典图像哈希算法:
| 哈希算法 | 全称 | 优点 | 使用场景 |
|---|---|---|---|
| aHash | average hash | 简单快速 | 基础相似检测、轻量级应用 |
| pHash | perceptual hash | 最稳健、常用 | 内容审查、重复图检测 |
| dHash | difference hash | 相当稳定 | 图像去重、图像聚类 |
| wHash | wavelet hash | 去噪效果强 | 细节损失较多场景 |
除此之外,它还支持 colorhash、crop-resistant hash 等进阶算法。
传统哈希(如 MD5、SHA256)的特点是:
输入只要有一点点变化,输出就完全不同。
所以不能用来比较图像相似度。
感知哈希的思想正好相反:
当两张图片'看起来相似'时,它们的哈希应当相近。
因此,感知哈希的目标:
最终得到一个通常使用 64 bit(8x8)长度的哈希值:
例:
ff00aa55cc33ee99
两个哈希值之间的差异(Hamming Distance)即可判断图像相似度。
例如:
hash1 = imagehash.phash(Image.open("img1.jpg"))
hash2 = imagehash.phash(Image.open("img2.jpg"))
similarity = hash1 - hash2 # 汉明距离
通常距离 <5 可以认为是同一张图片或极其相似。
接下来我们分别讲解算法原理、特点和代码使用。
hash_val = imagehash.average_hash(Image.open('x.jpg'))
print(hash_val)
hash_val = imagehash.phash(Image.open('x.jpg'))
print(hash_val)
hash_val = imagehash.dhash(Image.open('x.jpg'))
hash_val = imagehash.whash(Image.open('x.jpg'))
imagehash 的对象支持直接做减法:
hash1 = imagehash.phash(Image.open('a.jpg'))
hash2 = imagehash.phash(Image.open('b.jpg'))
distance = hash1 - hash2 # 汉明距离
一般参考阈值:
| 汉明距离 | 相似度判断 |
|---|---|
| 0 | 完全相同 |
| 1-5 | 同一张图片、压缩尺寸不同 |
| 6-10 | 内容相似(例如同一物体) |
| 10 以上 | 基本不相似 |
可自定义阈值:
if distance < 5:
print("图片相似")
适用于:
使用 pHash 或 dHash 最稳定。
可用于发现:
流程:
将哈希存储为字符串即可快速检索。
可用于:
借助 k-means/DBSCAN 可聚类哈希向量。
可判断:
imagehash + ffmpeg:
可根据哈希查重。
字符变换颜色后仍可检测相似。
判断图标、UI 素材是否被篡改。
imagehash 还提供高级功能:
适合风景图、背景色分类。
hash_val = imagehash.colorhash(Image.open('x.jpg'))
对裁剪、长宽变化非常稳健。
适用于:
OpenCV 也能写 dHash,但 imagehash 更完整。
imagehash 适合结构相似检测,深度学习适合语义相似检测。
在工程中常常两种结合使用。
如果要处理百万级图片,可采取:
多线程:
from concurrent.futures import ThreadPoolExecutor
def calc(path):
return imagehash.phash(Image.open(path))
with ThreadPoolExecutor(20) as pool:
results = list(pool.map(calc, images))
存储为:
可加速比较。
imagehash 返回的是 64bit bit-array,可作为向量存入 FAISS。
以下代码展示一个从目录中自动检测重复图片的完整程序:
from PIL import Image
import imagehash
import os
def find_duplicates(folder, threshold=5):
hash_dict = {}
duplicates = []
for fname in os.listdir(folder):
if not fname.lower().endswith(('.jpg', '.png', '.jpeg')):
continue
path = os.path.join(folder, fname)
img = Image.open(path)
h = imagehash.phash(img)
for oh, opath in hash_dict.values():
if h - oh < threshold:
duplicates.append((path, opath))
break
hash_dict[fname] = (h, path)
return duplicates
dups = find_duplicates("images/")
for a, b in dups:
print("相似图片:", a, "<==>", b)
建议:
可能原因:
经验值:
10:不同
即使在深度学习时代,imagehash 仍然是工程中最常用的图像相似工具之一,因为它:
适合作为图像比对的第一道过滤器,再结合深度学习做更高精度分析。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online