图片相似检测:三行代码实现

背景

检查两个图片的相似度,一个简单而快速的算法:感知哈希算法(Perceptual Hash),通过某种提取特征的方式为每个图片计算一个指纹(哈希),这样对比两个图片相似与否就变成了对比两个指纹异同的问题。

实现

Step1.缩小尺寸

将图片缩小到8*8的大小,这样做可以去除图片的细节,只保留结构和明暗等基本信息,同时摒弃不同尺寸和比例带来的图片差异。

Step2.灰度处理

把缩小后的图片转化为64级灰度图(每个像素只有64种颜色)。

Step3.计算平均值

计算所有64个像素的灰度平均值。

Step4.计算哈希

这里哈希的计算方法是:上面说的64个像素的灰度与平均值进行比较,大于或等于平均值记为1,小于记为0。

将每个像素的比较结果组合在一起成为一个64位的二进制整数,这个整数就是此图片的指纹。

Step5.对比哈希

不同图片对比的方法,就是对比它们的64位哈希中,有多少位不一样(汉明距离)。一般来说如果不同的位数不超过5,就说明两张图片很相似,如果大于10,就很可能是两张不同的图片。

代码(Python)

计算pHash:

def phash(img):
    img = img.resize((8, 8), Image.ANTIALIAS).convert('L')
    avg = reduce(lambda x, y: x + y, img.getdata()) / 64.
    return reduce(
        lambda x, (y, z): x | (z << y),
        enumerate(map(lambda i: 0 if i < avg else 1, img.getdata())),
        0
    )

计算汉明距离:

def hamming_distance(a, b):
    return bin(a^b).count('1')

计算两个图片是否相似:

def is_imgs_similar(img1,img2):
	return True if hamming_distance(phash(img1),phash(img2)) <= 5 else False

其中计算部分用到了lambda表达式和reduce,可参考此文:廖雪峰:map和reduce

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏游戏开发那些事

【Unity3d游戏开发】Unity3D中的3D数学基础---向量

向量是2D、3D数学研究的标准工具,在3D游戏中向量是基础。因此掌握好向量的一些基本概念以及属性和常用运算方法就显得尤为重要。在本篇博客中,马三就来和大家一起回...

14310
来自专栏瓜大三哥

基于FPGA的非线性滤波器(一) 之概述

一类比较重要的非线性滤波器就是统计排序滤波器。 统计排序滤波器对窗口内的像素值进行排序并通过多路选择选择器选择排序后的值,例如中值滤波、最大/最...

19890
来自专栏李智的专栏

Python针对图像的基础操作

5. 返回目录中所有JPG 图像的文件名列表,直方图均衡化,平均图像,主成分分析等

17520
来自专栏梦里茶室

TensorFlow深度学习笔记 循环神经网络实践

加载数据 使用text8作为训练的文本数据集 text8中只包含27种字符:小写的从a到z,以及空格符。如果把它打出来,读起来就像是去掉了所有标点的wikip...

30150
来自专栏深度学习与数据挖掘实战

干货|深度学习面试问答集锦

No.19 CNN中,conv layer、ReLu layer、Pooling layer、Fully connected layer的区别?

13240
来自专栏数据结构与算法

09:图像旋转翻转变换

09:图像旋转翻转变换 总时间限制: 1000ms 内存限制: 65536kB描述 给定m行n列的图像各像素点灰度值,对其依次进行一系列操作后,求最终图像。...

47850
来自专栏算法channel

机器学习决策树:提炼出分类器算法

? 前面三天推送了决策树的基本原理和选择最佳分裂特征的几种公式,用到决策树一般都会出现过拟合问题,因此需要对决策树进行剪枝,阐述了常用的几种剪枝的方法(这些方...

35580

机器学习之随机森林

机器执行的每一个步都依赖于我们的指令。它们需要指导去哪里做什么,就像一个不了解周围环境而无法自己做决定的孩子。因此,开发人员会需要为机器编写指令。然而当我们谈论...

21080
来自专栏绿巨人专栏

神经网络学习笔记-02-循环神经网络

36770
来自专栏AI研习社

一文详解 DNN 在声学应用中的模型训练

本文通过简单kaldi源码,分析DNN训练声学模型时神经网络的输入与输出。在进行DNN训练之前需要用到之前GMM-HMM训练的模型,以训练好的mono模型为例,...

50560

扫码关注云+社区

领取腾讯云代金券