简介
imagehash
是一个Python库,用于生成图像的哈希值,并比较图像之间的相似度。这个库提供了多种哈希算法,包括平均哈希(Average Hash)、感知哈希(Perceptual Hash)、差异哈希(Difference Hash)和颜色哈希(Color Hash)。这些哈希值可以用来快速识别相似或相同的图像,特别适用于图像去重、版权检测和图像检索等场景。
安装
在使用imagehash
之前,您需要先安装这个库。可以通过pip安装:
pip install imagehash
基本用法
1. 导入库
首先,导入必要的库:
from PIL import Image
from imagehash import average_hash
2. 计算图像哈希
使用imagehash
计算图像的哈希值非常简单。以下是如何计算一个图像的平均哈希值:
# 打开图像文件
image = Image.open("1.jpg")
# 计算平均哈希值
hash_value = average_hash(image)
# 打印哈希值
print(hash_value)
3. 比较图像相似度
imagehash
库提供了一个方便的方法来比较两个图像的相似度,即计算它们的哈希值之间的汉明距离(Hamming distance):
# 计算另一个图像的哈希值
image2 = Image.open("2.jpg")
hash_value2 = average_hash(image2)
# 计算两个哈希值之间的汉明距离
distance = hash_value - hash_value2
# 打印汉明距离
print(f"汉明距离: {distance}")
汉明距离越小,表示两个图像越相似。
其他哈希算法
imagehash
库提供了多种哈希算法,每种算法都有其特点和适用场景。
1. 感知哈希(Perceptual Hash)
感知哈希考虑了图像的视觉特征,对于图像的缩放、旋转和亮度变化具有较好的鲁棒性:
from imagehash import phash
# 计算感知哈希值
hash_value = phash(image)
# 打印哈希值
print(hash_value)
2. 差异哈希(Difference Hash)
差异哈希通过比较相邻像素的差异来生成哈希值,适用于检测图像的微小变化:
from imagehash import dhash
# 计算差异哈希值
hash_value = dhash(image)
# 打印哈希值
print(hash_value)
3. 颜色哈希(Color Hash)
颜色哈希主要基于图像的颜色分布:
from imagehash import colorhash
# 计算颜色哈希值
hash_value = colorhash(image)
# 打印哈希值
print(hash_value)
比较各算法的计算速度
import time
import functools
from PIL import Image
from imagehash import phash, average_hash, dhash, colorhash
def timeit(func):
"""计算函数用时的装饰器 """
@functools.wraps(func)
def wrapper(*args, **kwargs):
start_time = time.time() # 记录开始时间
result = func(*args, **kwargs) # 执行函数
end_time = time.time() # 记录结束时间
print(f"函数{func.__name__} 用时 {end_time - start_time:.4f} 秒")
return result
return wrapper
@timeit
def get_average_hash(img_file):
# 获取平均哈希
return average_hash(Image.open(img_file))
@timeit
def get_phash(img_file):
# 获取感知哈希
return phash(Image.open(img_file))
@timeit
def get_dhash(img_file):
# 获取差异哈希
return dhash(Image.open(img_file))
@timeit
def get_colorhash(img_file):
# 获取颜色哈希
return colorhash(Image.open(img_file))
if __name__ == '__main__':
file = "1.png"
get_average_hash(file)
get_phash(file)
get_dhash(file)
get_colorhash(file)
经过多次测试,计算用时:平均哈希=差异哈希<感知哈希<颜色哈希。