老司机放招:以图搜图到底是怎么回事?

想象这样一个场景,你在逛贴吧的时候得到一张图片,是这样子的。

老司机放招:以图搜图到底是怎么回事?你的好奇心来了,很想知道她是谁,有什么车牌号或者作品可以学习学习。咋办呢,手里头只有一张图,其它信息没有,百度一下看来帮不了你。

于是去请教老司机,他向你推荐了以图搜图的搜索引擎。顾名思义,上传一张图片,它就能帮你找到类似的图片或者图片的出处。类似这样子:

老司机放招:以图搜图到底是怎么回事?

果然有效果!于是你通过以图搜图的方法,找到了图片上美女的信息,还顺藤摸瓜的找到了她的作品,后面的事情就不用说了。现在的互联网真是强大,只要有一点点线索,就能把一个人的老底翻个遍。

感叹之余,我们来看下以图搜图是什么原理吧。

其实说起搜索,就是一个匹配的过程。你服务器上存了互联网上几乎所有的网页,这些网页绝大部分都是由文本构成的。当你以某个关键词查找的时候,只需要一一比对(当然这里为了速度会用到「倒排索引」等高深的算法),只要找出能够匹配的内容即可。

文本信息的匹配很简单,但是换成图片就不一样了。以图搜图面临的首要问题,就是如何判断两张图片是相似的。最简单的办法是,图片本身就是二进制数据,可以通过比对二进制数据来判断。但这样做要求的精度太高,图片的格式不一样,尺寸不一样,相应的二进制数据天壤之别,所以几乎是不可行的。从另一个角度讲,如果按二进制比对,每张图片都要保存它原始的二进制数据,互联网上的图片是海量的,这个存储压力一般人扛不住。

有一个算法可以做到,叫「感知哈希算法」。顾名思义,它仿照人眼对图片相似的判断,只需要轮廓、大体颜色一致,就认为两张图片是相似的,至于图片是什么格式,大小如何,在比较的时候都排除在外。

1、把图片缩小成8*8,缩小之后,整个图片就变模糊了,但是基本的结构还在。这就人为降低了匹配的精度,要的就是这种效果。

老司机放招:以图搜图到底是怎么回事?2、把图片的颜色信息转化成64阶灰度。怎么理解呢?现在既然图片压缩成了8*8大小,一共64个像素,这样只需要64个等级,就能表示每个像素的颜色强弱。我们的目标是比较颜色的相对强弱,并不关心每个像素原来是红色还是黄色。

老司机放招:以图搜图到底是怎么回事?

3、计算所有像素的灰度的平均值,然后记录信息,每个像素,大于均值的标1,小均值的标0,最后形成一个64个bit的二进制数,这个数就是这张图的hash值。这样做的好处是存储空间大大降低了。最后的结果是:

1100000011000001111000011110100011111101111010011110100111100000

4、两张图进行对比的时候,对比他们的hash值,如果64位里,相同的越多,越相似。

感知哈希算法说简单其实很简单,它把图片的大致结构,大致颜色抽出来,做成一个数字,既容易存储,又容易比较,而且效果还不错。发散一下,感知哈希算法如果拿来鉴别小黄图,应该也不错。

解决了比较的问题,剩下的,就是搜索引擎的老一套了,输入,对比,展示相似的结果。