文章简介

在网上看到python做图像识别的相关文章后,真心感觉python的功能实在太强大,因此将这些文章总结一下,建立一下自己的知识体系。

当然了,图像识别这个话题作为计算机科学的一个分支,不可能就在本文简单几句就说清,所以本文只作基本算法的科普向。

如有错误,请多包涵和多多指教。

参考的文章和图片来源会在底部一一列出。

以及本篇文章所用的代码都会在底下给出github地址。

安装相关库

python用作图像处理的相关库主要有openCV(C++编写,提供了python语言的接口),PIL,但由于PIL很早就停了,所以不支持python3.x,所以建议使用基于PIL的pillow,本文也是在python3.4和pillow的环境下进行实验。

至于opencv,在做人脸识别的时候会用到,但本文不会涉及到,在本专栏的后续中会谈及openCV的人脸识别和基于此的python图片爬虫,有兴趣的朋友可以关注本专栏。

相关背景

要识别两张相似图像,我们从感性上来谈是怎么样的一个过程?首先我们会区分这两张相片的类型,例如是风景照,还是人物照。风景照中,是沙漠还是海洋,人物照中,两个人是不是都是国字脸,还是瓜子脸(还是倒瓜子脸……哈哈……)。

那么从机器的角度来说也是这样的,先识别图像的特征,然后再相比。

很显然,在没有经过训练的计算机(即建立模型),那么计算机很难区分什么是海洋,什么是沙漠。但是计算机很容易识别到图像的像素值。

因此,在图像识别中,颜色特征是最为常用的。(其余常用的特征还有纹理特征、形状特征和空间关系特征等)

其中又分为

直方图

颜色集

颜色矩

聚合向量

相关图

直方图计算法

这里先用直方图进行简单讲述。

先借用一下恋花蝶的图片,

从肉眼来看,这两张图片大概也有八成是相似的了。

在python中可以依靠Image对象的histogram()方法获取其直方图数据,但这个方法返回的结果是一个列表,如果想得到下图可视化数据,需要另外使用 matplotlib,这里因为主要介绍算法思路,matplotlib的使用这里不做介绍。

是的,我们可以明显的发现,两张图片的直方图是近似重合的。所以利用直方图判断两张图片的是否相似的方法就是,计算其直方图的重合程度即可。

计算方法如下:

其中gi和si是分别指两条曲线的第i个点。

最后计算得出的结果就是就是其相似程度。

不过,这种方法有一个明显的弱点,就是他是按照颜色的全局分布来看的,无法描述颜色的局部分布和色彩所处的位置。

也就是假如一张图片以蓝色为主,内容是一片蓝天,而另外一张图片也是蓝色为主,但是内容却是妹子穿了蓝色裙子,那么这个算法也很可能认为这两张图片的相似的。

缓解这个弱点有一个方法就是利用Image的crop方法把图片等分,然后再分别计算其相似度,最后综合考虑。

图像指纹与汉明距离

在介绍下面其他判别相似度的方法前,先补充一些概念。第一个就是图像指纹

图像指纹和人的指纹一样,是身份的象征,而图像指纹简单点来讲,就是将图像按照一定的哈希算法,经过运算后得出的一组二进制数字。

说到这里,就可以顺带引出汉明距离的概念了。

假如一组二进制数据为101,另外一组为111,那么显然把第一组的第二位数据0改成1就可以变成第二组数据111,所以两组数据的汉明距离就为1

简单点说,汉明距离就是一组二进制数据变成另一组数据所需的步骤数,显然,这个数值可以衡量两张图片的差异,汉明距离越小,则代表相似度越高。汉明距离为0,即代表两张图片完全一样。

如何计算得到汉明距离,请看下面三种哈希算法

平均哈希法(aHash)

此算法是基于比较灰度图每个像素与平均值来实现的

一般步骤

1.缩放图片,可利用Image对象的resize(size)改变,一般大小为8*8,64个像素值。

2.转化为灰度图

转灰度图的算法。

1.浮点算法:Gray=Rx0.3+Gx0.59+Bx0.11

2.整数方法:Gray=(Rx30+Gx59+Bx11)/100

3.移位方法:Gray =(Rx76+Gx151+Bx28)>>8;

4.平均值法:Gray=(R+G+B)/3;

5.仅取绿色:Gray=G;

在python中,可用Image的对象的方法convert('L')直接转换为灰度图

3.计算平均值:计算进行灰度处理后图片的所有像素点的平均值。

4.比较像素灰度值:遍历灰度图片每一个像素,如果大于平均值记录为1,否则为0.

5.得到信息指纹:组合64个bit位,顺序随意保持一致性。

最后比对两张图片的指纹,获得汉明距离即可。

感知哈希算法(pHash)

平均哈希算法过于严格,不够精确,更适合搜索缩略图,为了获得更精确的结果可以选择感知哈希算法,它采用的是DCT(离散余弦变换)来降低频率的方法

一般步骤:

缩小图片:32 * 32是一个较好的大小,这样方便DCT计算

转化为灰度图:把缩放后的图片转化为256阶的灰度图。(具体算法见平均哈希算法步骤)

计算DCT:DCT把图片分离成分率的集合

缩小DCT:DCT计算后的矩阵是32 * 32,保留左上角的8 * 8,这些代表的图片的最低频率

计算平均值:计算缩小DCT后的所有像素点的平均值。

进一步减小DCT:大于平均值记录为1,反之记录为0.

得到信息指纹:组合64个信息位,顺序随意保持一致性。

最后比对两张图片的指纹,获得汉明距离即可。

这里给出别人的DCT的介绍和计算方法(离散余弦变换的方法)

dHash算法

相比pHash,dHash的速度要快的多,相比aHash,dHash在效率几乎相同的情况下的效果要更好,它是基于渐变实现的。

步骤:

缩小图片:收缩到9*8的大小,以便它有72的像素点

转化为灰度图:把缩放后的图片转化为256阶的灰度图。(具体算法见平均哈希算法步骤)

计算差异值:dHash算法工作在相邻像素之间,这样每行9个像素之间产生了8个不同的差异,一共8行,则产生了64个差异值

获得指纹:如果左边的像素比右边的更亮,则记录为1,否则为0.

最后比对两张图片的指纹,获得汉明距离即可。

总结

这几种算法是识别相似图像的基础,显然,有时两图中的人相似比整体的颜色相似更重要,所以我们有时需要进行人脸识别,

然后在脸部区进行局部哈希,或者进行其他的预处理再进行哈希,这里涉及其他知识本文不作介绍。

下一次将讲述利用opencv和以训练好的模型来进行人脸识别。

本文算法的实现在下面,点一下下面的连接就好

各位亲,走过路过给一个star鼓励一下呗,当然也欢迎提意见。

本文参考文章和图片来源

python图片-利用python进行识别相似图片(一)相关推荐

  1. python常用的OCR文字识别与图片定位方式

    python常用的OCR文字识别与图片定位方式 前言 统一版本 更换pip源 1. Python调用百度文字识别ocr的实现方式 1.1 使用PyCharm安装依赖 baidu-aip chardet ...

  2. 【Python】利用python进行数据分析——以新型冠状病毒疫情为例

    [Python]利用python进行数据分析--以新型冠状病毒疫情为例 重要说明 只提交该文档这一个文件,做完后提交到学习通"结课大作业"中. 1. 文件命名: 必须以学号-姓名- ...

  3. Python:利用python编程实现三维图像绘制展示(六面体旋转、三维球柱状体、下雪场景等)

    Python:利用python编程实现三维图像绘制展示(六面体旋转.三维球柱状体.下雪场景等) 目录 利用python编程实现三维图像绘制展示(六面体旋转.三维球柱状体.下雪场景等) 1.实现六面体旋 ...

  4. Python:利用python编程将上海十六区,2020年5月份房价实时地图(数据来源房天下)进行柱状图、热图可视化

    Python:利用python编程将上海十六区,2020年5月份房价实时地图(数据来源房天下)进行柱状图.热图可视化 目录 上海十六区,2020年5月份房价实时地图(数据来源房天下)可视化 雷达图.柱 ...

  5. Python:利用python语言绘制多个子图经典案例、代码实现之详细攻略

    Python:利用python语言绘制多个子图经典案例.代码实现之详细攻略 目录 利用python语言绘制多个子图代码实现.经典案例 1.绘制多个子图框架 多个子图绘制的经典案例 1.绘制多个直方图 ...

  6. python怎么实现检验_[python skill]利用python实现假设性检验方法

    [python skill]利用python实现假设性检验方法 刀尔東 2018-08-03 09:19:13 1244 收藏 2 版权 hello,大噶好,最近新学习了利用python实现假设性检验 ...

  7. 【Python】利用Python实现精准三点定位(经纬度坐标与平面坐标转换法求解)

    [Python]利用Python实现精准三点定位(经纬度坐标与平面坐标转换法求解) 众所周知,如果已知三个点的坐标,到一个未知点的距离,则可以利用以距离为半径画圆的方式来求得未知点坐标. 如果只有两个 ...

  8. 用python实现星期的转换_[Python实践] 利用python实现的日期映射礼拜X的简单实现...

    [Python实践] 利用python实现的日期映射礼拜X的简单实现 2018年12月19日 最近在处理分析数据的时候,突发奇想试着从用户离职的日期上判断是主动辞职还是被动解雇?数据的背景是美国某企业 ...

  9. android 名片识别 简书,python 腾讯API 名片识别 通用图片转文字

    记录名片识别和图片转文字. 腾讯AI开放平台提供的名片OCR很强大, 而且可以免费使用, 所以本文使用的是腾讯AI开放平台. 腾讯AI开放平台API调用需要注意签名方法, 请查看之前文章传送门 名片O ...

  10. python爬虫——利用超级鹰识别验证码并进行古诗网进行模拟登录

    目录 前言 一.超级鹰的注册 二.利用xpath解析登录页面的验证码图片 三.利用超级鹰识别获取验证码 四.模拟浏览器发送请求进行模拟登录 五.验证是否模拟登录成功 前言 本文章是利用python爬虫 ...

最新文章

  1. java和php本质_JAVA和PHP的区别
  2. #JS:this的指向及函数调用对this的影响
  3. 在VS中建立一个易于管理的C++工程
  4. 神奇的问题记录【SqlDataAdapter Fill DataSet】
  5. 关于决策树,你一定要知道的知识点!(文末送书)
  6. 张娟娟(为奥运冠军名字作诗)
  7. pdo mysql下载,yum安装mysql5.7 和 pdo_mysql扩展
  8. Android Studio 第六十三期 - Android框架 -RecycleView所有用法
  9. 华为回应“锁屏广告”事件:非官方所为
  10. ubuntu如何调出python_ubuntu|linux下 如何用python 模拟按键
  11. Iframe背景透明
  12. OSChina 周三乱弹 ——你是有多寂寞啊,看光头强都……
  13. python解析pdf中文乱码_Python解决中文乱码.pdf
  14. 企业宣传软文怎么写?手把手教大家撰写企业宣传软文
  15. 计算机应用知识试题 上学吧,自考计算机应用高分技巧,自考计算机应用作答技巧...
  16. SpringBoot实现微信登录
  17. 我是一个线程(修订版)
  18. STM32 EXTI外部中断及NVIC的抢占优先级和响应优先级解释
  19. linux 查看环境变量和修改环境变量
  20. Web\App\接口自动测试常见面试题

热门文章

  1. DDos攻击,使用深度学习中 栈式自编码的算法
  2. jira 8.2.1 安装 及一些常见的坑
  3. Cordova error:npm install -g ios-deploy
  4. java中线程切换的开销
  5. linux下tomcat安装
  6. MySQL分区的限制(最多有多少个分区)
  7. MyBatis 物理分页
  8. Tiny210编译和烧写u-boot步骤
  9. 辞旧迎新,总结2010,展望2011
  10. ASP.Net 获取当前时间