原文

目录

  • 背景介绍
  • 背景知识
    • 原理过程介绍
      • 1. 减小图像的尺寸
      • 2. 编程灰度图像
      • 3. 计算颜色的平均值
      • 4. 计算64位中的每一位
      • 5. 计算hash值
  • Go语言实践
  • 参考文档

背景介绍

2008年TinEye上线了图片搜索,开始是注册制,后来逐步放开。2011年, Google也上线了相似图片搜索,通过用户上传的图片,可以搜索相似的图片。
参考文档中提供了一些介绍图像搜索的一些文章, 尤其是阮一峰2011年和2013年两篇普及性的文章,可以帮助你了解图像相似搜索的原理。

图像相似性搜索应用广泛、除了使用搜索引擎搜索类似图片外,像淘宝可以让顾客直接拍照搜索类似的商品信息、应用在商品购物上。也可以应用物体识别比如拍图识花等领域。目前我在调研图片鉴权的方案,通过一张图片和图片库中的图片进行比对,来确定这张图片是否侵权,或者退一步讲,图片库中是否包含和这张图片类似。 这个需求和目前深度学习应用中的图像识别还不一样, 图像识别是需要将图像中的物体识别出来, 猫啊狗啊什么的,而我所要做的就是一个查找相似图片的东西。

Neal Krawetz博士看到了一些关于TinEye原理的询问, 虽然他并不知道TinEye是怎么实现的,但是根据搜索结果,他判断是基于感知哈希算法(Perceptual hash algorithm)的变种,他于2011年5月写了一篇文章,介绍相关的技术。

背景知识

感知哈希算法根据图像的特征生成一个确定的指纹,这些指纹可以用来比较。指纹越接近,说明图片越接近。在文章中他介绍了一个非常简单的感知哈希算法, Average Hash algorithm,以美女Alyson Hannigan照片为例,计算指纹(hash)的步骤如下:

原理过程介绍

1. 减小图像的尺寸

生成一个8 X 8的缩略图,一共64个像素。

2. 编程灰度图像

这样就从64个像素(64 Red, 64 Green, 64 Blue)变为64中颜色。

3. 计算颜色的平均值

4. 计算64位中的每一位

简单和平均值比较,根据大小设置1和0

5. 计算hash值

把这64bit赋值给一个64bit的整数,顺序是无关的,只要保持一致即可。

这样,这个图片的指纹就通过一个64位的整数表示出来了。图像放大缩小、旋转、对比度、饱和度的变换不会显著改变指纹。其实最大的好处就是

天下武功,无坚不摧,唯快不破

当你比较两张图片的时候,计算它们的hash值,然后再计算它们的汉明距离即可。

虽然平均散列是快速和容易的,但是photoshop的力量是无穷的,如果你对图片进行伽玛校正或者直方图的调整,对颜色进行非线性的改变,上述算法可能就不太准确了。

博士又介绍了pHash算法, 它扩展了Average Hash algorithm,使用DCT(离散余弦变换)减少图像的高频数据。

博士又动手写了一个工具,搜索了一批图片进行测试。研究发现, Average Hash非常快,在特定场景下是一个非常好的算法。

这篇文章非常值得你阅读,也引起了广泛的讨论,以及一些编程语言的实现。 博士在2013年又介绍了第三种算法:difference hash,准确性和aHash(Average Hash algorithm)查不多,但是更快。 aHash基于平均值,pHash基于图像频率,而dHash基于直方图。

阅读博士的文章的时候我在想,对于aHash, 分别计算RGB的指纹,用这三个指纹比较是不是会更好?

这里再介绍另外一种技术: SIFT,即尺度不变特征变换(Scale-invariant feature transform,SIFT),是用于图像处理领域的一种描述。这种描述具有尺度不变性,可在图像中检测出关键点,是一种局部特征描述子。 该方法于1999年由David Lowe首先发表于计算机视觉国际会议(International Conference on Computer Vision,ICCV),2004年再次经David Lowe整理完善后发表于International journal of computer vision(IJCV。截止2014年8月,该论文单篇被引次数达25000余次。SIFT在数字图像的特征描述方面当之无愧可称之为最红最火的一种,许多人对SIFT进行了改进,诞生了SIFT的一系列变种。SIFT已经申请了专利。

SIFT好是好,但是是有专利保护的,并且也慢。

这是雷经纬的整理的算法比较:

Go语言实践

以上是图片比对的背景知识,这一节我们介绍一个计算图像指纹,并且和对象进行比较的例子。

这次,我们使用的库是goimagehash,它实现了aHash、dHash、pHash算法, wHash正准备实现。

例子中我们使用的三张图片分别是:



分别使用三种算法,计算第一张图片和第二张、第三张图片的汉明距离。

package main
import ("fmt""image/png""os""github.com/corona10/goimagehash"
)
func main() {queryFile, _ := os.Open("Alyson_Hannigan.jpg")file1, _ := os.Open("Alyson_Hannigan2.jpg")file2, _ := os.Open("Lena.jpg")defer queryFile.Close()defer file1.Close()defer file2.Close()imgQuery, _ := png.Decode(queryFile)img1, _ := png.Decode(file1)img2, _ := png.Decode(file2)queryHash, _ := goimagehash.AverageHash(imgQuery)hash1, _ := goimagehash.AverageHash(img1)hash2, _ := goimagehash.AverageHash(img2)distance1, _ := queryHash.Distance(hash1)distance2, _ := queryHash.Distance(hash2)fmt.Printf("Distance between images: %d %d\n", distance1, distance2)queryHash, _ = goimagehash.DifferenceHash(imgQuery)hash1, _ = goimagehash.DifferenceHash(img1)hash2, _ = goimagehash.DifferenceHash(img2)distance1, _ = queryHash.Distance(hash1)distance2, _ = queryHash.Distance(hash2)fmt.Printf("Distance between images: %d %d\n", distance1, distance2)queryHash, _ = goimagehash.PerceptionHash(imgQuery)hash1, _ = goimagehash.PerceptionHash(img1)hash2, _ = goimagehash.PerceptionHash(img2)distance1, _ = queryHash.Distance(hash1)distance2, _ = queryHash.Distance(hash2)fmt.Printf("Distance between images: %d %d\n", distance1, distance2)
}

执行结果:

Distance between images: 6 45
Distance between images: 1 38
Distance between images: 4 38

可以看到,三种方法都能正确的识别出第一张和第二张图片是类似的(<= 6), 而和第三张图片的差别比较大。

对于这次测试,第二个图片我调整了一下饱和度,加了一个小小的水印。 而aHash表现最好。

对于简单的图像查重和相似图片的查找,使用这三种算法就可以了,要是你想根据一个人的正脸,去搜索这个人的侧脸图片,那可能就需要使用SIFT或者其他的算法了。

参考文档

http://www.hackerfactor.com/blog/index.php?/archives/432-Looks-Like-It.html
http://www.ruanyifeng.com/blog/2011/07/principle_of_similar_image_search.html
http://www.ruanyifeng.com/blog/2013/03/similar_image_search_part_ii.html
https://cloud.tencent.com/developer/article/1006121
https://fullstackml.com/wavelet-image-hash-in-python-3504fdd282b5
http://www.infoq.com/cn/articles/image-similarity-algorithm-on-mobile-client
https://github.com/nivance/image-similarity
https://www.cnblogs.com/wangyaning/p/7854046.html
https://github.com/facebookresearch/faiss
https://en.wikipedia.org/wiki/Perceptual_hashing
https://www.zhihu.com/question/19606748
https://baike.baidu.com/item/SIFT/1396275

用go来做图像相似性比较相关推荐

  1. matlab 文本相似度,图像相似性搜索的MATLAB实现

    图像相似性搜索的MATLAB实现(论文11000字) 摘要:随着计算机的普及率增加,用户越来越注重网络体验,同时对图像检索的要求越来越高,快速.准确是从业者和用户永恒的目标和期望.这就对图像相似性检索 ...

  2. 深度学习在gilt应用——用图像相似性搜索引擎来商品推荐和服务属性分类

    机器学习起源于神经网络,而深度学习是机器学习的一个快速发展的子领域.最近的一些算法的进步和GPU并行计算的使用,使得基于深度学习的算法可以在围棋和其他的一些实际应用里取得很好的成绩. 时尚产业是深度学 ...

  3. 救救小王吧:如何快速解决图像相似性检测问题?

    相似性图像检测,是模型训练过程中常出现的问题,本文介绍了 4 个常用的哈希算法,并通过 Colab 代码,展示了完整的训练过程. 新晋炼丹师小王最近遇到了一个难题,愁的头发掉了好几根儿. 一问才知道, ...

  4. 使用双线性插值做图像旋转

    依然是"表格识别"课题,目前还在讨论图像倾斜校正. 上一篇中,对于倾斜的表格图像,通过拉冬变换得到了图像的倾斜角,下面探讨如何利用这个倾斜角进行图像变换 在论文<社区选举系统 ...

  5. 深度学习:使用UNet做图像语义分割,训练自己制作的数据集,详细教程

    语义分割(Semantic Segmentation)是图像处理和机器视觉一个重要分支.与分类任务不同,语义分割需要判断图像每个像素点的类别,进行精确分割.语义分割目前在自动驾驶.自动抠图.医疗影像等 ...

  6. 图像相似性评价指标(SSIM、MSE、PSNR)简单介绍及计算方法

    图像相似性评价指标 图像相似性评价指标 SSIM(结构相似性) MSE(均方误差) PSNR(峰值信噪比 ) 使用python进行计算 图像相似性评价指标 对于图像生成质量的通用性评价指标主要有SSI ...

  7. 图像相似性评价指标SSIM/PSNR

    图像相似性评价指标SSIM/PSNR 1.结构相似性指标SSIM 参考自维基百科SSIM 1.1介绍 结构相似性指标(英文:structural similarity index,SSIM index ...

  8. 图像相似性搜索的原理

    本文转自: 相似图片搜索的原理 相似图片搜索的原理(二) http://www.hackerfactor.com/blog/index.php?/archives/432-Looks-Like-It. ...

  9. GAN做图像翻译的一点总结

    作者丨洪佳鹏 学校丨北京大学 研究方向丨生成式对抗网络 本文经授权转载自公众号「学术兴趣小组」. 如今,随着 GAN 在生成清晰图像(sharp images)上的成功,GAN 在图像翻译任务上的方法 ...

最新文章

  1. 万字长文详解如何用Python玩转OpenGL | CSDN 博文精选
  2. rabbitmq的整体架构一览
  3. down 网卡端口周期性的up_Linux 中如何启用和禁用网卡?
  4. linux xps 13 wifi,XPS13-9350安装linux以及网卡连接失败修复的临时方案
  5. 非常值得一看—九种滤波算法C语言实现
  6. sqoop导出数据|Hive|HDFS和脚本编写
  7. Ubuntu学习日记--Lesson7:文件权限管理chmod
  8. 简单分析暴风影音的最新0DAY菜鸟版
  9. OneNote同步问题,提示没有权限
  10. Day20(lambda、stream、微服务、大数据、nginx)
  11. 开一家最美证件照照相馆需要注意什么
  12. 已解决NameError: name ‘XXX‘ is not defined
  13. 裁剪TIF图像,代码简单,易懂(Arcpy)
  14. 从简历被拒到收割今日头条offer经验总结
  15. 模糊神经网络(三)模糊逻辑和神经网络的对比
  16. 休闲互动游戏有哪些?互动游戏对战平台是什么?
  17. 【转载】真实一个初中生黑客梦的道路
  18. 【愚公系列】2021年11月 攻防世界-进阶题-MISC-007(Aesop_secret)
  19. 行业短信应用的类型与短信模板
  20. 快速学习利用Idea构建一个SSM框架项目

热门文章

  1. linux用户修改和密码管理
  2. 【学习方法】无论学什么东西,三个步骤:①大致粗通 ②重点精通 ③融会贯通...
  3. SpringBoot(二): 使用Dokcer+SpringCloud+Consul+Fabio搭建微服务
  4. 【计算机视觉】张正友相机标定Calibration原理过程结果
  5. 【个人亲历】上海市人才引进落户最详细的流程记录说明
  6. java1.8离线安装包_离线安装JDK1.8
  7. Android studio离线安装教程
  8. MATLAB信号处理---学习小案例(10)---Z反变换
  9. 二极管IN4148和IN4007的应用区别
  10. Frida调用静态函数和非静态函数