python之图片指纹(唯一性的)
介绍
每张图片都有一个唯一性的指纹。就好像人类的指纹可以识别出这个人类似。
图片指纹是什么?(图片哈希)
- 用图片指纹进行相似图片的检测。这种技术通常被称为“感知图像hash”或是简单的“图片hash”。
- 图片hash是检测一张图片的内容然后根据检测的内容为图片建立一个唯一值的过程。
- 比如,给定一张图片作为输入,应用一个hash函数,然后基于图片的视觉计算出一个图片hash。相似的图片也应当有相似的hash值。
- 将会使用“差别Hash”或简单的DHash算法计算图片指纹。简单来说,DHash算法着眼于两个相邻像素之间的差值。然后,基于这样的差值,就建立起一个hash值了。
为什么不使用md5,sha-1等算法?
我们不能在实现中使用加密hash算法。由于加密hash算法的本质使然,输入文件中非常微小的差别也能造成差异极大的hash值。我们实际上希望相似的输入可以有相似的hash输出值。
安装相关库
点击关闭代码块
pip install Pillow
pip install ImageHash
pip install numpy
pip install scipy
开始使用
获取图片指纹
点击关闭代码块
from PIL import Image
import imagehash
# 给一张图片
img1 = Image.open('images/demo4.jpg')
res = imagehash.dhash(img1) # 4f999cc90979704c
计算汉明距离
汉明距离被用于计算一个哈希中的不同位数。因此,哈希中只有一位不同的两张图片自然比有10位不同的图片更相似。
全部代码
点击关闭代码块
from PIL import Image
import imagehash
def img(img_path):
"""
图片哈希(类似:4f999cc90979704c)
:param img_path: 图片路径
:return: <class 'imagehash.ImageHash'>
"""
img1 = Image.open(img_path)
res = imagehash.dhash(img1)
return res
def hamm_img(res1, res2):
"""
汉明距离,汉明距离越小说明越相似,等 0 说明是同一张图片,大于10越上,说明完全不相似
:param res1:
:param res2:
:return:
"""
str1 = str(res1) # <class 'imagehash.ImageHash'> 转成 str
str2 = str(res2)
num = 0 # 用来计算汉明距离
for i in range(len(str1)):
if str1[i] != str2[i]:
num += 1
return num
if __name__ == '__main__':
img_path1 = 'images/demo1.jpg'
img_path2 = 'images/demo2.jpg'
res = hamm_img(img(img_path1), img(img_path2))
print('汉明距离是:', res)
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· DeepSeek智能编程
· 精选4款基于.NET开源、功能强大的通讯调试工具
· [翻译] 为什么 Tracebit 用 C# 开发
· 腾讯ima接入deepseek-r1,借用别人脑子用用成真了~
· DeepSeek崛起:程序员“饭碗”被抢,还是职业进化新起点?