前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >你朋友圈发的假图被我发现了!

你朋友圈发的假图被我发现了!

作者头像
老肥码码码
发布2020-01-17 15:14:16
4830
发布2020-01-17 15:14:16
举报

我们常用的搜索引擎百度,它的搜索框内有一个小相机,不知道大家有没有注意,我们将照片上传可以找到相似图片以及图片的出处。

比方我上传一张Ng的图片,

百度就会给出它的搜索答案。

这件事是如何做到的呢?相似的图片是如何比对找到的呢?

其中有一个最基础的算法:“感知哈希”。这个算法的原理是非常直观且易于理解的,它的作用是对每张图片生成一个"指纹",然后比较不同图片的指纹。如果结果接近,就说明图片相似。

下面我们就来对这个算法做一个简单实现。

1)缩小图片的尺寸

可以将图片缩小到8x8的尺寸,总共64个像素。用来去除这些图片的细节,只保留结构、明暗等基本信息,不考虑不同尺寸以及不同比例带来的图片差异。

这里我们只需要用安装pillow,利用 resize 函数修改图片的尺寸即可。

2)转成灰度图像并计算灰度值的平均值

把缩小后的图像转换成灰度,一共可以得到64个灰度值。接着计算这些灰度值的平均值。

这一步同样容易,我们可以用 convert 函数把图片转化成灰度图像。

im = im.resize((8, 8), Image.ANTIALIAS).convert('L')
avg = reduce(lambda x, y: x + y, im.getdata()) / 64.

3)灰度值比较

把每一个灰度值与平均灰度值进行比较,如果灰度值大于或等于平均,则记为1,反之记为0。

zero_one=[]
data=list(im.getdata()) 
for i in range(64):
    if data[i]>avg:
        zero_one.append(1)
    else:
        zero_one.append(0)

这里定义了一个 zero_one 列表用于存储灰度的0-1值。而这个列表也正是这张图片的“指纹”。

4)“指纹”比较

在得到图片的“指纹”以后,我们就可以对比不同的图片,看看在这64位中共有多少位是不一样的。可以按照不同位个数的差异,来作为图片差异的对照。

一般来说,有5位之内的差异,可以看作是相似的图片;超过5位,便可以当作不相似的图片。

基于这个算法,我们可以通过计算机来识别相似图片。朋友圈的假图(网图)便无所遁形啦。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-09-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 算法与数据之美 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档