百度,我们常用的搜索引擎,搜索框里有一个小摄像头。不知道你有没有注意到。我们可以通过上传它们的来源找到相似的图片和图片。比如我上传一张Ng的照片,百度就会给出它的搜索答案。这是怎么做到的?如何比较和发现相似的图片?最基本的算法之一是“感知哈希”。该算法的原理非常直观易懂。它的作用是为每张图片生成一个“指纹”,然后比较不同图片的指纹。如果结果接近,则图片相似。让我们简单地实现一下这个算法。1)缩小图片尺寸可以将图片缩小到8x8的尺寸,共64个像素。它用来去除这些图片的细节,只保留结构、明暗等基本信息,没有考虑不同尺寸、不同比例造成的图片差异。这里我们只需要安装pillow,使用resize函数修改图片大小即可。2)转换为灰度图像并计算灰度值的平均值。将缩小的图像转换为灰度。一共可以得到64个灰度值。然后计算这些灰度值的平均值。这一步也很简单,我们可以使用convert函数将图像转换成灰度图。im=im.resize((8,8),Image.ANTIALIAS).convert('L')avg=reduce(lambdax,y:x+y,im.getdata())/64.3)比较每个灰度值灰度值与平均灰度值进行比较,如果灰度值大于等于平均值??,记为1,否则记为0。zero_one=[]data=list(im.getdata())foriinrange(64):ifdata[i]>avg:zero_one.append(1)else:zero_one.append(0)这里定义了一个zero_one列表0-1的值,用于存储灰度。而这份名单,也是这张图片的“指纹”。4)“指纹”对比得到图片的“指纹”后,我们可以对比不同的图片,看看64位中有多少位不同。不同比特数的差异可以作为图片差异的对比。一般来说,如果有5位数以内的差异,就可以认为是相似图片;如果超过5位数,则可视为异种图片。基于这种算法,我们可以通过计算机识别相似的图片。朋友圈的假图(网图)会看不出来。
