导语: 本文从从图片的dhash,ahash,phash,颜色分布向量到基于语义的sift,surf,gist特征,构建一套分层相似图片检测系统。本文致力于零基础单机快速搭建一个可用的相似图片识别系统。

1 背景

相似图片检测的定义是人眼看起来像,比如下面的俩图。

相似图片的检测广泛用于图片去重,仿冒图标检测,图片检索等。本文也是基于图标相似检测的需求去做的,本意是用于打假。然而专家老中医告诉我,打假不如推荐相似app受市场欢迎,并且不同应用场景下我们做事的思路也会不同。不管了,先把相似图片识别出来

2 检测的原理

图片相似检测无非是提取图片某个维度的特征,根据算法两两计算相似度。(基于机器学习,深度学习的方法则会先构建一个模型,然后将新样本特征输入模型即可。)简单流程可以描述为:

检测过程中可能用到的7个基础特征如下:

简单解释下,dhash,ahash,phash是根据基于分块等某种算法得到的基于图片RGB值的某个哈希(其详细描述可参考http://itindex.net/detail/42723 );RGB向量则是将色彩从256256256映射到较小的区间如444,然后计算图片在每个区间的分布形成一个数组;

SIFT,SURF,GIST则不再是RGB值的某种统计,而是试图构建人能理解的图片意义,如SIFT,SURF关注图片关键点(或者理解为重要的点)的信息,GIST则从自然度,开放度,粗糙度等描述图像。下图是这种专业的图片处理,很高大上有没有。

3 如何搭建一个仿冒图标检测系统

相似图片的检测可以用于去重,图片搜索等。底层技术是基于上文描述的方法,但是在根据目标不同,又有不同的结构。本工程的初衷是检测图标仿冒,系统结构如下:

思路:先把已标位正牌的图标特征(dhash,ahash,phash等)收集起来形成一个特征库,新图标来了则提取其特征去特征库里匹配,如果匹配到了相似度极高的则直接认定其为仿冒图标;如果匹配到了相似度较高的则转入sift,gist高级特征匹配。

4 show me the 效果

下面是一些相似图标示例:

图标大小缩放,添加元素,添加文字,颜色块变化等都是可以识别的。仿冒数量不便展示(/ □ )

5 提升性能和效果的关键点,坑

本工程最终在单机完成了数百万官方图标库,每天新进数十万图标的检测。在构建过程中遇到了不少坑,这些坑一部分是计算速度(单一图标匹配从300秒降低到0.2秒,鬼知道我的小心脏经历了什么),还有的是识别效果:

1.官方图标特征需先聚类,数百万的特征存储和匹配都比较麻烦。对官方库聚类后可以形成特征对图标的一对多关系,而不是维持原有的图标对特征的一对一关系;

2.匹配策略分层,如本工程一开始综合dhash及sift等,参数和策略调整非常复杂。分为两层后(哈希策略过滤,sift精确匹配),每一层的准确率和参数,策略调整非常方便;

3.哈希值的海明码距离计算耗时较多,在明确海明码距离范围的情况下可以采用分段匹配而非计算不同的位数。具体见http://www.cnblogs.com/gantoday/p/6404923.html

4.工程经验上:opencv-python不直接提供sift,surf算法了。可以用opencv-contrib-python这个库。gist可以用pyleargist这个库,其依赖安装见http://blog.csdn.net/sensicall/article/details/77803915

6 潜在的改进点

海量图片匹配,第一步必须是生成图片的特征哈希,且改hash必须是局部敏感hash。局部敏感hash的特点是:原始数据相似的情况下,生成的hash值也会尽可能的保持相似。从图片dhash,ahash,phash的算法过程可以认为它们就是一种局部敏感哈希。所以可以用来检测相似。

但是在gist特征中,即使图片相似,生成的960维向量的每一个值几乎都不同,不直接具备利用它生成局部敏感哈希lsh的条件。这个时候需要对向量元素归一化,使得相似图片的大部分gist特征相同。这一点在pyleargist的官方页面https://pypi.python.org/pypi/pyleargist 下方有说明,但并没有讲怎么做。有文章说用simhash,但是对于simhash生成过程中的每个维度的权重一笔带过。个人很怀疑不采用归一化就生成simhash的做法。这里待研究

7 总结

当前图像处理发展多年,已经提出了多种特征,算法。在工程应用中需要结合自己的场景选用适当的特征(怎么适当?不确定的话就多试试(/ □ )),注重底层数据的质量,优化性能以便快速调整匹配策略。

python类似图片查找_python检测相似图片相关推荐

  1. python类似图片查找_python查找重复图片并删除(图片去重)

    本文实例为大家分享了python查找重复图片并删除的具体代码,供大家参考,具体内容如下 和网络爬虫配套的,也可单独使用,从网上爬下来的图片重复太多,代码支持识别不同尺寸大小一致的图片,并把重复的图片删 ...

  2. python递归查找_Python程序使用递归查找数字的幂

    python递归查找 Given the base x and the power y and we have to find the x to the power y using recursion ...

  3. python 中文查找_python 查找数据库

    django.db.utils.ProgrammingError: 1146 的解决办法 在models中设置完数据库相关的东西后执行命令 python manage.py makemigration ...

  4. python正则查找_python正则查找

    [转摘]PYTHON 正则表达式 网上转的一篇,把正则的规则系统的分类了.. 好文,共享,备查 ~~~~~~~~~~~ http://www.cnblogs.com/huxi/archive/2010 ...

  5. python探测端口_python检测远程服务器tcp端口的方法

    本文实例讲述了python检测远程服务器tcp端口的方法.分享给大家供大家参考.具体如下: python检测远程服务器tcp端口的代码,这段代码可以用来做服务器监控实用 #!/usr/bin/env ...

  6. python 二分查找_Python实现二分法搜索

    二分法是一种效率比较高的搜索方法,时间复杂度为 O(log2n) .假设有一个1~100之间的数字,你来猜这个数是多少,每猜一次可以得到三种回答:正确.大了或小了.如何保证用最少的次数猜对?很多人会想 ...

  7. python生成数字_Python生成数字图片代码分享

    本文向大家分享了几段Python生成数字图片的代码,喜欢的朋友可以参考.具体如下: 最终版本 # -*- coding:utf-8 -*- from PIL import Image,ImageFon ...

  8. python图像对比_python+PIL实现图片对比(一)

    前提 前阵子报了个班,学了一些android UI自动化相关的东西,于是想到第一家单位在做android手机自动化的时候,有用到图片对比,来确定是否点到指定的页面,遂想在appium+python做U ...

  9. python保存图片格式_python 存储网页图片格式

    Python爬虫入门一之综述 大家好哈,最近博主在学习Python,学习期间也遇到一些问题,获得了一些经验,在此将自己的学习系统地整理下来,如果大家有兴趣学习爬虫的话,可以将这些文章作为参考,也欢迎大 ...

  10. python正则检验_Python 检测生僻字

    最近碰到一个需求,要求检测字段是否包含生僻字以及一些非法字符如 ~!@#$%^&*. 首先想到的就是利用 python 的正则表达式来匹配非法字符,然后找出非法记录.然而理想总是丰满的,现实却 ...

最新文章

  1. DB2数据库备份转成MySQL_DB2 数据库备份(集中化)
  2. lucene底层数据结构——底层filter bitset原理,时间序列数据压缩将同一时间数据压缩为一行...
  3. PHP 数组函数分类和整理
  4. java遍历目录下的包括子目录下的所有文件
  5. vue引入全局less实现全局变量的控制
  6. 准确估计透明物体的 3D 姿态:机器人收集 + Keypose 算法
  7. Javascript中四种函数调用方式
  8. 跟着开源项目学因果推断——mr_uplift(十五)
  9. 【Python基础】文件读写
  10. pdf幻灯片:圆锥曲线中的“三定”问题探究(一)
  11. Unix文件系统基本结构
  12. elementUI中日期时间插件(DateTimePicke) 限制结束时间大于开始时间且开始时间小于当前时间
  13. 【社招】 中/高级C++ Developer - 美国顶尖交易公司Akuna Capital–上海
  14. 央行降准:对股市、楼市、债市、商品、人民币汇率的影响
  15. 2018年深圳,武汉房价走势分析
  16. 织梦(dedecms)标签大全(非常全面)
  17. ngx_thread_pool_init()
  18. CANopen总线的高级协议详解
  19. python爬表情包_【从零开始写爬虫一】批量下载表情包
  20. python+tensorflow-gpu+CUDA+cudnn+显卡配置关键步骤详解

热门文章

  1. c# mysql分页_c#-数据库分页查询
  2. 无法打开计算机分区,电脑硬盘分区打不开怎么办
  3. 达尔豪斯大学 计算机专业排名,加拿大留学计算机专业排名
  4. 在阿里做了五年技术主管,我有话想说
  5. 小米游戏本8代加装固态硬盘系统迁移
  6. 从零开始微信小游戏(cocos creator)
  7. python使用匿名函数计算长方形的面积
  8. c语言统计单词平均长度,C++ 字符数组 - 统计一段英文单词的平均长度
  9. 无PS只需几步操作轻松改变图片尺寸大小,而且一点都不失真!
  10. HD地址批量生成 java