以图搜图:Python实现dHash算法

共 3905字,需浏览 8分钟

 ·

2022-02-19 16:12

4d0ea5432f32f973690e0dc95027db24.webp

向AI转型的程序员都关注了这个号👇👇👇

机器学习AI算法工程   公众号:datayx


期研究了一下以图搜图这个炫酷的东西。百度和谷歌都有提供以图搜图的功能,有兴趣可以找一下。当然,不是很深入。深入的话,得运用到深度学习这货。Python深度学习当然不在话下。


这个功能最核心的东西就是怎么让电脑识别图片。


这个问题也是困扰了我,在偶然的机会,看到哈希感知算法。这个分两种,一种是基本的均值哈希感知算法(dHash),一种是余弦变换哈希感知算法(pHash)。dHash是我自己命名的,为了和pHash区分。这里两种方法,我都用Python实现了^_^


哈希感知算法基本原理如下:

1、把图片转成一个可识别的字符串,这个字符串也叫哈希值

2、和其他图片匹配字符串


算法不是耍耍嘴皮子就行了,重点是怎么把图片变成一个可识别的字符串。(鄙视网上那些抄来抄去的文章,连字都一模一样)拿一张图片举例。


836ae8daf7803c9d254b3d4fcc1bf993.webp




首先,把这个图片缩小到8x8大小,并改成灰度模式。这样是为了模糊化处理图片,并减少计算量。

8x8的图片太小了,放大图片给大家看一下。



a47f5ec89b4ad727a71125666ddbb489.webp




x8大小的图片就是有64个像素值。计算这64个像素的平均值,进一步降噪处理。


像素值=[

     247, 245, 250, 253, 251, 244, 240, 240, 

     247, 253, 228, 208, 213, 243, 247, 241, 

     252, 226, 97, 80, 88, 116, 231, 247, 

     255, 172, 79, 65, 51, 58, 191, 255, 

     255, 168, 71, 60, 53, 69, 205, 255, 

     255, 211, 65, 58, 56, 104, 244, 252, 

     248, 253, 119, 42, 53, 181, 252, 243, 

     244, 240, 218, 175, 185, 230, 242, 244]


平均值=185.359375



得到这个平均值之后,再和每个像素对比。像素值大于平均值的标记成1,小于或等于平均值的标记成0。组成64个数字的字符串(看起来也是一串二进制的)。


降噪结果=[

       1, 1, 1, 1, 1, 1, 1, 1, 

       1, 1, 1, 1, 1, 1, 1, 1, 

       1, 1, 0, 0, 0, 0, 1, 1, 

       1, 0, 0, 0, 0, 0, 1, 1, 

       1, 0, 0, 0, 0, 0, 1, 1, 

       1, 1, 0, 0, 0, 0, 1, 1, 

       1, 1, 0, 0, 0, 0, 1, 1, 

       1, 1, 1, 0, 0, 1, 1, 1]


64位字符串 =

'1111111111111111110000111000001110000011110000111100001111100111'


由于64位太长,比较起来也麻烦。每4个字符为1组,由2进制转成16进制。这样就剩下一个长度为16的字符串。这个字符串也就是这个图片可识别的哈希值。

哈希值 = 'ffffc38383c3c3e7'


Python代码如下:

6daf29557b9162bdef53aad8e6f28eff.webp


看看其他图片的哈希值:


37f4d48710f829fb1d8f02bc4218f55a.webp



2ac8d009b159d56c3b37a61c67fe265d.webp



2bae7d308f691db7ed0b7fd93244506c.webp



这3张图片的哈希值分别和a.jpg(举例的那张图片)的哈希值对比。对比方法用汉明距离:相同位置上的字符不同的个数。例如a.jpg和b.jpg对比


abfb77e1bd62f46ea6a51ae9ed250cbd.webp


有11个位置的字符不一样,则汉明距离是11。汉明距离越小就说明图片越相识。超过10就说明图片很不一样。


a.jpg和c.jpg的汉明距离是8;

a.jpg和d.jpg的汉明距离是7。

说明在这3张图片中,d.jpg和a.jpg最相似。


大致算法就是这样,汉明距离的代码我没给出,这个比较简单。一般都是在数据库里面进行计算,得到比较小的那些图片感知哈希值。

当然,实际应用中很少用这种算法,因为这种算法比较敏感。同一张图片旋转一定角度或者变形一下,那个哈希值差别就很大。不过,它的计算速度是最快的,通常可以用于查找缩略图。


现有3张图片,用前面的dHash均值哈希感知算法计算哈希值。

adcda90eed6a3099f59db5b4098626c2.webp




6fcc87a1119b82f9959f827a6c41f082.webp



77435e234fe300b9b0245dded9857897.webp


Hash均值哈希感知算法计算结果:

1.jpg:270f078fd1fdffff

2.jpg:f8f0e1f0eaefcfff

3.jpg:e70f058f81f1f1ff


1.jpg和2.jpg(旋转90度)的汉明距离是13;1.jpg和3.jpg(旋转5度)的汉明距离是5。(汉明距离是两个字符串对应位置对比,总共不同的个数)

很明显,旋转了90度汉明距离变得很大。在dHash算法中,它们是不同的。而我们肉眼可以看出其实是一样的。前面说过dHash算法比较较真、比较敏感。若要处理一定程度的变形,得要调整一下这个算法。

pHash算法就是基于dHash算法调整而来的,用第一次计算得到的值进行余弦变换。所以命名为余弦哈希感知算法。它可以识别变形程度在25%以内的图片。


大致原理和处理过程是这样:

把图片缩小到32x32的尺寸,并转为灰度模式。


9d5d5be80ec1696443a9a481eaca7327.webp


得到这个平均值之后,再和每个像素对比。像素值大于平均值的标记成1,小于或等于平均值的标记成0。组成64个数字的字符串(看起来也是一串二进制的)。


降噪结果 = [

    0, 1, 1, 1, 0, 0, 1, 1,

    0, 1, 1, 0, 0, 0, 0, 1,

    0, 0, 0, 0, 0, 0, 0, 0,

    0, 0, 0, 0, 0, 0, 0, 0,

    1, 1, 1, 1, 1, 1, 1, 1,

    1, 1, 1, 1, 1, 1, 1, 1,

    0, 0, 0, 1, 1, 1, 0, 0,

    0, 0, 0, 0, 0, 0, 0, 0]

64位字符串 = '0111001101100001000000000000000011111111111111110001110000000000'

每4个数字,由2进制转成16进制,得到哈希值 = '73610000ffff1c00'


Python代码如下:


ffc0ebded3355784c161fe6be49a9fb6.webp

a5d26327250aee04e31724ea8318caf1.webp


用这个算法计算2.jpg和3.jpg的哈希值和与1.jpg对比的汉明距离分别是:

2.jpg:7ffc0000ffffe000,汉明距离是5

3.jpg:7fff0000fffff800,汉明距离是5

很明显,pHash算法得到的汉明距离更加符合我们的要求。

    

原文地址

https://yshblog.com/blog/44



机器学习算法AI大数据技术

 搜索公众号添加: datanlp

长按图片,识别二维码




阅读过本文的人还看了以下文章:


TensorFlow 2.0深度学习案例实战


基于40万表格数据集TableBank,用MaskRCNN做表格检测


《基于深度学习的自然语言处理》中/英PDF


Deep Learning 中文版初版-周志华团队


【全套视频课】最全的目标检测算法系列讲解,通俗易懂!


《美团机器学习实践》_美团算法团队.pdf


《深度学习入门:基于Python的理论与实现》高清中文PDF+源码


《深度学习:基于Keras的Python实践》PDF和代码


特征提取与图像处理(第二版).pdf


python就业班学习视频,从入门到实战项目


2019最新《PyTorch自然语言处理》英、中文版PDF+源码


《21个项目玩转深度学习:基于TensorFlow的实践详解》完整版PDF+附书代码


《深度学习之pytorch》pdf+附书源码


PyTorch深度学习快速实战入门《pytorch-handbook》


【下载】豆瓣评分8.1,《机器学习实战:基于Scikit-Learn和TensorFlow》


《Python数据分析与挖掘实战》PDF+完整源码


汽车行业完整知识图谱项目实战视频(全23课)


李沐大神开源《动手学深度学习》,加州伯克利深度学习(2019春)教材


笔记、代码清晰易懂!李航《统计学习方法》最新资源全套!


《神经网络与深度学习》最新2018版中英PDF+源码


将机器学习模型部署为REST API


FashionAI服装属性标签图像识别Top1-5方案分享


重要开源!CNN-RNN-CTC 实现手写汉字识别


yolo3 检测出图像中的不规则汉字


同样是机器学习算法工程师,你的面试为什么过不了?


前海征信大数据算法:风险概率预测


【Keras】完整实现‘交通标志’分类、‘票据’分类两个项目,让你掌握深度学习图像分类


VGG16迁移学习,实现医学图像识别分类工程项目


特征工程(一)


特征工程(二) :文本数据的展开、过滤和分块


特征工程(三):特征缩放,从词袋到 TF-IDF


特征工程(四): 类别特征


特征工程(五): PCA 降维


特征工程(六): 非线性特征提取和模型堆叠


特征工程(七):图像特征提取和深度学习


如何利用全新的决策树集成级联结构gcForest做特征工程并打分?


Machine Learning Yearning 中文翻译稿


蚂蚁金服2018秋招-算法工程师(共四面)通过


全球AI挑战-场景分类的比赛源码(多模型融合)


斯坦福CS230官方指南:CNN、RNN及使用技巧速查(打印收藏)


python+flask搭建CNN在线识别手写中文网站


中科院Kaggle全球文本匹配竞赛华人第1名团队-深度学习与特征工程



不断更新资源

深度学习、机器学习、数据分析、python

 搜索公众号添加: datayx  


浏览 64
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报