前言

之前对图片聚类有一丢丢的研究,最近发现,使用一些相似图片搜索算法也可以实现图片聚类的目标:将同类别或差不多的图片聚在一起。所以整理出相似图片搜索算法介绍这篇文章,主要介绍AutoEncoder、based CNN、Hash等算法,细分又包括:AutoEncoder、Siamese Network、2-channel、Central-surround two-stream network、aHash、pHash、dHash等算法。

AutoEncoder

AE作为一种无监督算法,通过encode和decode两个过程实现,当encode和decode过程均为一层时,AE很类似PCA;多层时,又有些类似神经网络。
如上图所示,code左侧的为encode层,右侧为decode层,目的是使得输入的x和输出的x_head越接近越好,所以在误差反向传播时需要优化x和x_head的差异值。通过encode和decode两个过程,AE可以提取图片特征,不断的训练之后就可以通过得到的特征参数对相似图片进行搜索。AutoEncoder详细介绍点击这里。
我的一篇文章实现了AutoEncoder对MNIST数据集的特征提取;另一篇文章实现了AutoEncoder对相似图片的搜索。

Based CNN

这个板块中的算法来自这篇论文,主要介绍了Siamese Network、2-channel、Central-surround two-stream network、SSP几种算法,并对比他们之间的联系和区别。

Siamese Network

这个算法最初用于手写签字的识别,之后又应用在相似图片的处理上面,如下图所示,patch1和patch2为输入图片,两张图片分别经过卷积层(包括卷积、ReLU、最大池化等过程),得到两个特征向量,接着进入黄色的全连接层,最后输出两个图片的相似度。在Siamese Network算法中,两个patch在卷积层中的权值共享。
论文中有对Siamese Network算法进行改进,变为Pseudo-siamese算法,这个算法与Siamese Network的区别为:卷积层中的权值不共享,在下图中间部分可以看到。

2-channel

channel这个词最先是在图片灰度上面提到的,像MNIST数据集,图片都是黑白的,channel为1,彩色图片channel为3,分为R、G、B三个channel,顾名思义,这个算法就是由两个channel组成,这两个channel就是要比较的两张图片,如下图所示,与上面Siamese Network算法的不同之处在于,这个算法合并了上面的两个卷积层,使两张图片编程一张,举个例子,有两张(1,32,32)的黑白图片,放在这个算法中,就相当于是对卷积层输入一个(2,32,32)的图片,然后在经过一层全连接,输出一个值,这个输出的值就表示两张图片的差异。

Central-surround two-stream network

这个算法在2-channel的基础上进行了改进,对比上下两张图,如果不考虑右侧蓝色块,仅考虑左侧的结构,和2-channel是一样的,这个算法的改进之处在于:
首先,左侧输入的图片不再是原图,而是经过了处理,如图所示,经过了下采样,使得图像变小,Paper中介绍的原图patch大小为64*64,那么在左侧的输入为32*32。其次,右侧的输入图片为原始图片的中心部分,大小也是32*32,这样一来,左右两侧的输入图片大小相等。

SSP

我们平时的输入图片多为32*32、64*64、128*128这种,图片的长和宽都是确定的,如果原始图片的长和宽不确定,我们使用前需要进行预处理,这样就影响了图片的精度,SSP算法就是为了解决这个问题。

Hash Method

Hash算法作为大多图片搜索引擎的核心算法,其准确率和效率均很高,本板块将介绍Hash的三种核心算法:aHash、pHash、dHash。

aHash

此算法是基于比较灰度图每个像素与平均值来实现的。
步骤:
1.缩放图片:为了保留结构去掉细节,去除大小、横纵比的差异,把图片统一缩放到8*8,共64个像素的图片。
2.转化为灰度图:把缩放后的图片转化为256阶的灰度图。
3.计算平均值: 计算进行灰度处理后图片的所有像素点的平均值。
4.比较像素灰度值:遍历灰度图片每一个像素,如果大于平均值记录为1,否则为0.
5.得到信息指纹:组合64个bit位,顺序随意保持一致性即可。
6.对比指纹:计算两幅图片的指纹,计算汉明距离(从一个指纹到另一个指纹需要变几次),汉明距离越大则说明图片越不一致,反之,汉明距离越小则说明图片越相似,当距离为0时,说明完全相同。(通常认为距离>10 就是两张完全不同的图片)

pHash

平均哈希算法过于严格,不够精确,更适合搜索缩略图,为了获得更精确的结果可以选择感知哈希算法,它采用的是DCT(离散余弦变换)来降低频率的方法
步骤:
1.缩小图片:32 * 32是一个较好的大小,这样方便DCT计算
2.转化为灰度图:把缩放后的图片转化为256阶的灰度图。(具体算法见平均哈希算法步骤)
3.计算DCT:DCT把图片分离成分率的集合
4.缩小DCT:DCT是32*32,保留左上角的8*8,这些代表的图片的最低频率
5.计算平均值:计算缩小DCT后的所有像素点的平均值。
6.进一步减小DCT:大于平均值记录为1,反之记录为0.
7.得到信息指纹:组合64个信息位,顺序随意保持一致性即可。
8.对比指纹:计算两幅图片的指纹,计算汉明距离(从一个指纹到另一个指纹需要变几次),汉明距离越大则说明图片越不一致,反之,汉明距离越小则说明图片越相似,当距离为0时,说明完全相同。(通常认为距离>10 就是两张完全不同的图片)

dHash

相比pHash,dHash的速度要快的多,相比aHash,dHash在效率几乎相同的情况下的效果要更好,它是基于渐变实现的。
步骤:
1.缩小图片:收缩到9*8的大小,一遍它有72的像素点
2.转化为灰度图:把缩放后的图片转化为256阶的灰度图。(具体算法见平均哈希算法步骤)
3.计算差异值:dHash算法工作在相邻像素之间,这样每行9个像素之间产生了8个不同的差异,一共8行,则产生了64个差异值
4.获得指纹:如果左边的像素比右边的更亮,则记录为1,否则为0.

参考资料

http://www.phash.org/download/
http://soledede.iteye.com/blog/1940910
https://github.com/hjaurum/DHash/blob/master/dHash.py
http://python.jobbole.com/81277/

相似图片搜索算法介绍相关推荐

  1. 图片文字介绍滑动效果代码介绍

    代码 链接 结果展示 代码 <!DOCTYPE html> <html lang="en"><head><meta charset=&qu ...

  2. LPA* 路径搜索算法介绍及完整代码

    1.简介 LPA*算法(全称Lifelong Planning A*算法)是由Koenig和Likhachev在2004年提出的,是一种参考人工智能的增量搜索进行改进的A*算法.它被用来处理动态环境下 ...

  3. 一维搜索算法介绍及其实现

    一维搜索算法介绍及其实现 当进行优化算法实现时.一般都要进行一系列如下格式的迭代运算 x(k+1) = x(k) + a(k) *s(k),其中s(k)是变量变化的方向,而a(k)可以确定变量变化的大 ...

  4. 科讯CMS--使用sql标签在商品内容页调用品牌详情,如品牌名称,图片,介绍等...

    使用sql标签在商品内容页调用品牌详情,如品牌名称,图片,介绍等 转自:http://hi.baidu.com/wufeng20128/item/f3a69295016a08df1a49df38 sq ...

  5. Bitmap.Config 属性详解及不同格式图片区别介绍

    博主声明: 转载请在开头附加本文链接及作者信息,并标记为转载.本文由博主 威威喵 原创,请多支持与指教. 本文首发于此   博主:威威喵  |  博客主页:https://blog.csdn.net/ ...

  6. 20X46 FCPX模板美好回忆电子相册图片文字介绍展示Past Memories

    20X46 FCPX模板美好回忆电子相册图片文字介绍展示Past Memories [插件介绍] FCPX模板-美好回忆照片墙电子相册图片文字介绍展示 Past Memories + 使用教程,时长1 ...

  7. 工业互联网---人工智能技术-仿谷歌图片搜索算法SimilarImageSearch

    仿谷歌图片搜索算法SimilarImageSearch,汉明距离 import com.datac.opencv.domain.ImgInfo; import com.datac.opencv.uti ...

  8. CSS3 background-image背景图片相关介绍

    这里将会介绍如何通过background-image设置背景图片,以及背景图片的平铺.拉伸.偏移.设置大小等操作. 1. 背景图片样式分类 CSS中设置元素背景图片及其背景图片样式的属性主要以下几个: ...

  9. 【转载】选择性搜索算法介绍——Selective Search

    RCNN中提出了SS算法用于初步产生2k左右的候选框,最开始觉得这个算法很普通,和滑动窗口这类的笨方法一样.然而现在发现并不是这样,这个方法很精巧,其中包含的图像相似度计算似乎还能用到其他地方.这一切 ...

  10. redmine 图片_redmine介绍

    一.基本介绍 Redmine是一个开源的.基于web的项目管理和缺陷跟踪工具.它用日历和甘特图辅助项目及进度可视化显示,同时它支持多项目管理.Redmine是一个自由开放源码软件的解决方案,它提供集成 ...

最新文章

  1. 作业要求 20181127-1 附加作业 软件工程原则的应用实例分析
  2. [MetalKit]34-Working-with-memory-in-Metal内存管理
  3. armv8/armv9页表属性(page descriptor)的详细介绍
  4. 初学__Python——Python数据类型之列表和元组
  5. linux 串口工具_Zynq下linux系统搭建
  6. shiro框架采取MD5+salt方式加密密码
  7. python 创建json_使用Django和Python创建Json response的方法
  8. PAT (Basic Level) 1091 N-自守数(模拟+stl)
  9. 华为鸿蒙全能家居,能兑现多少?华为智慧屏十年不过时,用鸿蒙理念做智能家居...
  10. python每隔30s检查一次_用Python写一个“离线语音提示器”来提醒我们别忘记了时间...
  11. react学习(4)----两个全选中就是key值一样了
  12. sphinx (coreseek)——2、区段查询实例
  13. Voovan网络编程介绍
  14. android 模拟蓝牙,【android 模拟器支持蓝牙】 CSDN
  15. android在体检报告叫什么,体检报告检测分析app
  16. 雄迈视频板使用调试串口作为普通串口通信
  17. java毕业设计鞋类秒杀商城Mybatis+系统+数据库+调试部署
  18. /usr/bin/xauth: file /home/wj/.Xauthority does not exist
  19. java软连接_硬链接和软连接
  20. pulsesensor传感器以及STM32相关学习笔记

热门文章

  1. SpringBoot官方文档学习
  2. 文本分类——怎么将二分类模型应用到多分类问题?
  3. 101 200 之间的素数
  4. python数字图像处理——边缘检测算子(Laplacian算子、Roberts算子、Prewitt算子和Sobel算子)
  5. vscode中文vsix_离线安装vscode vsix插件
  6. 高级电工、模电、数电、电力拖动实验室成套设备
  7. Redis缓存——快速入门
  8. 【UE4】UE4蓝图基础
  9. 手机版qq邮箱一直连接服务器失败,手机qq邮箱网页版无法登录 求高手 QQ邮箱登不上去 显示找不到服务器15?请问我咋用不...
  10. 一句话说明sync, fsync, fdatasync的区别