解密百度以图搜图的百度算法原理

2010年12月,百度突然多了一个“以图搜图”的功能,着实惊艳了广大网民,我们可以通过缩略图去查找高清原图,也可以根据图片去查找其出处、介绍。

比如,我上传了一张黄色小猫的图片,下图是其搜索的结果,发现搜索结果非常精准!

这种技术的原理是什么?计算机怎么知道两张图片相似呢?

其实原理非常简单易懂。我们可以用一个快速算法,就达到基本的效果。这里的关键技术叫做”感知哈希算法”(Perceptual hash algorithm),它的作用是对每张图片生成一个”指纹”(fingerprint)字符串,然后比较不同图片的指纹,结果越接近,就说明图片越相似。

下面是一个简单的实现。

首先将图片缩小到8像素×8像素的尺寸,总共64像素。这是为了尽量去除图片的细节,排除不同尺寸、比例带来的干扰,所以只保留图片的结构、明暗等基本信息。

随后,将缩小后的图片转化为64阶灰度图像,进一步减少色彩信息带来的干扰。紧接着,计算所有64个像素的灰度平均值。再将每个像素的灰度值,与平均值进行比较,大于或等于平均值的话,记为1,小于平均值,记为0。最后,将上一步的比较结果,组合在一起,就构成了一个64位的整数,这就是这张图片的指纹。

得到指纹以后,就可以对比不同的图片,看看64位中有多少位是不一样的。如果不相同的数据位不超过5,就说明两张图片很相似;如果大于10,就说明这是两张不同的图片。

具体代码,可参考Wote用python语言写的imgHash.py,如下图所示:

imgHash.py源代码

这种算法的优点是简单快速,不受图片大小缩放的影响,缺点是图片的内容不能变更。如果在图片上加几个文字,它就认不出来了。所以,它的最佳用途是根据缩略图,找出原图。

实际应用中,往往采用更强大的pHash算法和SIFT算法,它们能够识别图片的变形。只要变形程度不超过25%,它们就能匹配原图。这些算法虽然更复杂,但是原理与上面的简便算法是一样的,就是先将图片转化成Hash字符串,然后再进行比较。

欢迎关注“编程珠玑”,每日分享精彩的编程套路。