如何判断两张图片的相似度?原来图片对比也可以如此简单!

在介绍技术细节前,我们先来看看图片对比在哪些场景下可以用得到:
图片去重:自动删除重复图片,为存储空间"瘦身"。想象你是一个社交媒体平台的运营,每天要处理数万张图片。重复图片不仅占用存储空间,还会影响用户体验。
内容审核:一些平台需要筛选相似或重复的内容,防止版权侵犯和内容垃圾。
版权维权:检测图片有无被未经授权使用的情况,比如,摄影师和设计师需要知道自己的作品是否被未经授权使用。
相似图片搜索:网盘、云存储服务需要帮助用户清理重复文件。
在这些场景中,图片对比技术可以帮我们自动化处理大量图片,提高工作效率。
但是,图片对比可不像字符那样可以直接使用等于号=
直接对比,那么,我们有哪些对比方式呢?
方法一:MD5 指纹对比 - 精确匹配
MD5 是一种信息摘要算法,可以将任意长度的数据映射为固定长度的字符串。对于图片文件,我们可以将其计算出一个独一无二的 MD5 值,就像一个数字指纹,可以用来精确比对两个文件(不仅仅是图片)是否完全相同。
下面是使用 Go 语言计算图片 MD5 值的示例代码:
代码解读:
我们定义了一个
calculateMD5
函数,传入文件路径,返回计算出的 MD5 字符串。函数中先打开文件,创建一个 MD5 哈希器
hash
。通过
io.Copy
将文件内容写入哈希器中,计算出 MD5 值。最后将 MD5 字节数组格式化为字符串返回。
在
main
函数中,我们计算两个图片文件的 MD5 值,比对它们是否相等,输出结果。
MD5 比对的特点:
✅ 速度快、计算简单
✅ 可精确判断两个文件是否完全相同(只要是文件,都可以通过这种方式进行判断是否一样)
❌ 无法检测内容相似但不完全相同的图片
🐞 图片稍有改动(如添加水印)就会导致 MD5 值完全不同
所以 MD5 比对适合用于检测完全相同的图片,如文件去重等场景。如果两张图片只是稍作修改(如调整亮度、旋转等),MD5 就无能为力了。
比如下面这两张图,我只是稍微裁剪了一下


虽然,裁剪之后,确实已经不是一摸一样的图片了,但是,我们还是觉得这两张图片其实就是长得非常像的两张图,其实我们还是得认为它们就是一张图。那么像这样的图片,我们如何区分呢?这时,我们可以借助图像哈希算法。
方法二:图像哈希对比
图像哈希(Image Hashing)是一类可以比较图片相似程度的算法。其基本原理是:将图片缩小、简化为一个哈希值,然后比较不同图片哈希值的差异度,来判断它们的相似程度。
常见的图像哈希算法有:
平均哈希(Average Hash)
感知哈希(Perceptual Hash)
差异哈希(Difference Hash)
小波哈希(Wavelet Hash)
这里我们以第三方包为例:
首先先安装这个包
然后我们来尝试实现一个图片相似度比对:
图像哈希的特点:
✅ 可以比较图片内容的相似程度
✅ 对图片的缩放、旋转、亮度变化等稍微鲁棒
✅ 计算难度适中,可应用于相似图片搜索等场景
❌ 仍无法识别完全不同但语义相似的图片(比如同一物体不同角度的照片)
它们各有特点和适用场景:
MD5 指纹:简单快速,适合精确匹配完全相同的图片。图像哈希:可以比较图片的相似程度,在相似图片搜索等场景下很有用。
当然,这只是图像相似度算法的冰山一角。在实际应用中,我们还需要考虑性能、精度、复杂度等因素,选择最适合的方案。
图像识别领域在不断发展,一些前沿技术如机器学习、深度神经网络等,为图片相似度判断带来了更多的可能性,值得我们去学习和探索。
版权声明: 本文为 InfoQ 作者【左诗右码】的原创文章。
原文链接:【http://xie.infoq.cn/article/ab9b82ad8ab58ce0e8c48fcdb】。文章转载请联系作者。
评论