感知哈希是用来做图像拷贝检索(Copy Detection)最容易操作的一种方法,实际上除了感知哈希、均值哈希,还有很多的从图像本身出发计算出来的图像哈希值,在OpenCV 3.3及其以后的版本中,包含了很多图像哈希的计算方法,具体的可以参考The module brings implementations of different image hashing algorithms,其中各种图像哈希方法对8种不同变化的抗干扰程度,文档中做了一个很好的总结:

从图中可以看到,Phash具备较好的对不同变化的抗干扰性,因为在一般要求不高的图像拷贝检索场景中,应用得较多。下面小白菜就PHash的原理(计算步骤)、在使用中存在的问题以及改进方案做一个记录与总结。

PHash原理

感知哈希(Perceptual Hash, PHash)比均值哈希要稳健,PHash使用DCT将图像由空域转为频域,并对频域的低频成分进行散列化。PHash算法可分为以下几个步骤:

  1. 将图片resize到32*32最好,这样可以简化DCT计算;
  2. 将彩色图像转为灰度图像;
  3. 计算DCT,使用32*32的DCT变换;
  4. DCT的结果是32*32的矩阵,只要保留左上角的8*8矩阵就可以了,因为这部分呈现了图片中的最低频率;
  5. 计算DCT的平均值;
  6. 根据8*8的DCT矩阵来与平均值进行比较,大于平均值的为1,小于的为0。

注意:在保留左上角的8*8矩阵的时候,不一定非得是最左上角,可以往右下移一个或几个像素。下面是采用PHash做拷贝检索结果:

可以看到,对于上面查询,PHash能够获得很好的拷贝检索准确率,但是PHash除了上面图表所示的对椒盐噪声、旋转几乎不具有抗干扰特性外,还有其他的方面的一些局限。

PHash的局限:PHash为了容忍图像的一些形变而只取了图像的低频部分,从而造成了特征捕获不到图像的细节部分,使得对于纯色或者近似纯色图像在做查重的时候并不是很理想。具体地说,由于PHash取的是dct的左上角部分,属于低频成分,也就是关注的是图像的大致外形,没有关注细节,所以对于纯色图片或者近似纯色图片,就没法捕获到它的轮廓细节,导致对纯色图像或者近似纯色图片的查重准确率不高。一种改进的方式是:把这个取的部分往右下移,这样就可以获得图像的轮廓细节,纯色图像或者近似纯色图片查重准确率就会提升,坏处就是轮廓细节取多了,容忍细节变化就小了,导致图像容忍的形变变小,但是这种思路是值得借鉴的。

PHash特性

PHash对噪声、模糊、jpeg压缩等具备较好的不变性,此外,在实际应用中还有另一类变换也是值得非常关注的,即对图像做水平镜像操作。PHash对镜像不具备不变性,可以通过一个简单的实验予以验证。

实验过程:测试了两对图片,每一对图片包含图片自身,已经其对应的镜像图片(图片对的大小是一样的,说明为jpeg压缩影响),分别计算图片对之间的距离,一对算出来的距离是35,一对算出来的是33。说明PHash对镜像无召回能力。

既然谈到了图像的镜像变换,我们不妨对PHash、基于SIFT特征的Fisher Vector以及DL相似特征对镜像变换是否有不变形做一个整理:

特征 形变 是否抗干扰 备注
PHash特征 镜像 见上面说的验证过程
FV特征 镜像 很弱 SIFT对镜像不具备不变性,故FV对镜像召回能力很弱,具体参考论文Flip-Invariant SIFT for Copy and Object Detection
DL相似特征 镜像 由于DL相似特征在训练的时候,数据增强里面包含镜像,DL相似特征对镜像具备旋转特性,检索显示的top@K里面,可以找回镜像的视频,见结果镜像检索结果

PHash改进方案

在前面已经提到了PHash对于纯色或近似纯色图像做拷贝检索存在的缺陷,当DCT进行散列化时如果选取的DCT的频率过低,则对纯色或近似纯色图像的拷贝检索存在badcase,如下图所示:

从上图可以看到,由于查询图像是接近纯色的图片,导致取得DCT的低频只能捕获到图像的大致外观,因而很多接近纯色的图片到排在了前面。对这类case的改进优化,我们知道无论是取低频还是高频部分做散列化都不合适,如果只取高频,则会影响正常图片的召回。因此,比较容易想到的一种改进方式是:对于正常的图片,只需采用低频DCT哈希值做排序;对于纯色或近似纯色图像,先用低频DCT哈希值检索排序,然后再用高频DCT哈希值检索再做重排。这种改进方式的好处是显而易见的,对于每一张图片,只需要额外增加64个比特位的存储空间,并且不用对整个拷贝检索的架构做很大的调整,我们所要做的就是再计算一下高频DCT的哈希值,并且增加一个对纯色或接近纯色的检索服务,就能使PHash在图像拷贝检索上获得较大的精度提升,同时又不至于较大的减少召回。

对于图像纯色或接近纯色的检索,小白菜以为应该做得轻巧简洁,因为本身PHash做拷贝检索就是一个很轻量的服务,如果图像纯色或接近纯色的检索做的过重,比如用DL对图像纯色与非纯色进行分类,就失去了用PHash做拷贝检索的意义,另外采用还需消耗大量的GPU,因而图像纯色或接近纯色的服务越轻巧越好。下面小白菜提供的一个极轻量的图像纯色或接近纯色的检索方法:

cv::Mat imGray = cv::imread("123.jpg", CV_LOAD_IMAGE_GRAYSCALE);int histSize = 256;
float range[] = {0, 255} ;
const float* histRange = {range};
cv::Mat hist;
cv::calcHist(&imGray, 1, 0, cv::Mat(), hist, 1, &histSize, &histRange);cv::Mat idx;
cv::sortIdx(hist, idx, CV_SORT_EVERY_COLUMN + CV_SORT_DESCENDING);
cv::sort(hist, hist, CV_SORT_EVERY_COLUMN + CV_SORT_DESCENDING);float maxFre = hist.at<float>(0,0);
float secFre = hist.at<float>(0,1);
float allFre = cv::sum(hist)[0];float ratio1 = (maxFre + secFre)/allFre;
if(ratio1 >= 0.51){cout << "pure image" << endl;
}

根据灰度测试的结果,在阈值为0.51时,粗略评估对于纯色或接近纯色图像的召回率至少在85%以上,准确率在90%以上,检测速度在10ms左右。这里,对于召回率和准确率的要求是,召回越高越好,对准确率的要求可以相对低一点,因为我们的目的是要改善纯色或接近纯色图像的拷贝检索的准确率,可以小幅牺牲点非纯色图像拷贝检索的召回。

改善性能验证

按上述所提的改进方案重排后,即:

  • 对于一个查询,先使用低频分量DCT哈希值进行排序;
  • 对查询图像进行纯色或者近似纯色图像检测,如果不是纯色或者近似纯色图像,当前排序结果为最终拷贝检索排序结果;
  • 如果是纯色或者近似纯色图像,使用高频DCT哈希值对初排结果进行重新排序,对重排序结果只保留汉明距离只小于等于某一阈值的那些结果,将其作为最终排序结果;

下面是上面查询图像采用该改进方案重排后的一个结果,如下图所示:

从上面可以看到,经过重排后,对于纯色或者接近纯色图像的拷贝检索,结果有了很大的提升,实际中测试了很多的case,发现都能够获得很好的改善。

总结

在本篇文章中,小白菜就PHash的原理、存在的缺陷以及改进的方案做了详细的总结,这个问题的存在以及想到的解决方法并不是凭空产生和获得的,而是实际应用中确确实实会存在这样或那样的问题,需要不断从原理上推敲,然后反复进行实验。当然对PHash的改进应该有非常多,这种改进方案不一定是最好的,但是可以值得借鉴,希望对有需要的同学有所帮助或者启发。

from: http://yongyuan.name/blog/improve-phash-for-copy-detection.html

图像检索:图像拷贝检索PHash改进方案相关推荐

  1. 机器学习笔记 - 结合深度学习的基于内容的图像实例检索 利用现成的DCNN模型进行检索

    一.简述 上一篇,基于内容的图像实例检索综述. https://mp.csdn.net/mp_blog/creation/editor/131415155https://mp.csdn.net/mp_ ...

  2. 十大经典排序算法(附代码、动画及改进方案)

    前言说明 十大排序算法可以说是每个程序员最早接触的也是最重要的算法,这一块必须要非常熟练的掌握,应该要理解每种排序的思想,对各个排序的性能的了解也是基础且重要的.为了方便自己和大家学习,决定整合成一篇 ...

  3. 对于XL改进方案的初步分析

    根据前一篇博客中统计的单个事务耗时分布,我们发现每个请求在datanode执行的时间与PG执行时间几乎一样. 之前测试的是短事务,一个事务一个insert语句写入一条数据,这种场景对于xl来说没有什么 ...

  4. asp.net通讯录管理系统课程设计ASP.NET图像的检索技术毕业设计(源代码+论文+开题报告+外文翻译+文献综述+答辩PPT)

    第一章  前言 1.1引言 随着多媒体技术及 Internet网络的迅速发展,图像来源不断扩大,大容量高速存储系统为图像的海量存储提供了基本保障,各行各业对图像的使用越来越多,图像信息资源的管理和检索 ...

  5. 关于consistent hash的思考及改进方案

    这里默认读者已经知道了一致性hash算法的原理. 1. 为什么在某台机器宕机之后consistent hash算法能够避免所有或者大部分key重新hash? 首先需要弄清的是,如果某一台机器宕机之后, ...

  6. [分享]技术改进方案模板

    来自: http://www.cnblogs.com/raol/archive/2013/04/25/program_template.html 关于XX改进方案 现状描述: 不满意的地方: 1. 2 ...

  7. 无监督端到端检索式问答系统方案实践

    01   背景 暨2021年"十四五"规划将数字政府提上国家顶层设计后,今年两会期间,数字经济.智慧城市再一次成为各界关注的焦点. 3月5日,<政府工作报告>提出要加强 ...

  8. ReID行人重识别(训练+检测,附代码),可做图像检索,陌生人检索等项目

    利用ReID和目标检测对视频进行检测,可以对视频中的人进行重识别,支持更换数据集可以做车辆重识别等.可应用于图像.视频检索,行人跟踪等 在以前学习ReID的时候,是跟着下面视频学习的,该论文和代码也可 ...

  9. 欢迎广大编程爱好者为MyPage网站提供改进方案

    MyPage网站现投资一大笔资金用于网站的改进,欢迎广大编程爱好者为其提供改进的方案.每个改进的方案一经采纳后将根据方案的优秀程度得到100-500元不等的经费资助.如果方案特别优秀,MyPage网站 ...

最新文章

  1. Python面试题集合
  2. Python StringIO实现内存缓冲区中读写数据
  3. 树的度,结点,叶子结点,二叉树
  4. [Android]在Dagger 2中使用RxJava来进行异步注入(翻译)
  5. [每天一个知识点]26-软件工程-有多少管理是为了满足管理者的掌控感
  6. 阿里巴巴数据报告:消费向境内回流 低线城市消费蓬勃
  7. ❤️一分钟学会python条件语句❤️
  8. 51nod1118--简单DP
  9. 国外项目跳板机访问时差问题
  10. linux 有道 离线词典,有道词典离线版
  11. oracle的floor用法,oracle ceil floor 函数的用法
  12. 通达OAV12报表中心
  13. 通过dhcp被动识别指纹原理
  14. linux 全文查找、替换命令
  15. Linux Socket接口使用方法
  16. 广度优先算法之狄克斯特拉算法
  17. 【AutoSAR CAN】01 - CAN模块的功能及提供的API
  18. android studio引入lib,Android studio项目引入另外一个项目做为Lib
  19. JS 刷新当前页面 返回上一页并刷新的方法
  20. Map与Json之间的转换(fastjson)

热门文章

  1. java RSA加密解密--转载
  2. 金融风控实战——生肖属性单变量分析
  3. 机器学习是如何运作的?谷歌来告诉你
  4. 世界上最浪费时间的三件事
  5. linux fedora14 u盘运行,Win7下Fedora 14 硬盘或U盘安装指南
  6. java time 周期性执行,详解ScheduledExecutorService的周期性执行方法
  7. SpringBoot - 优雅的实现【业务校验】高级进阶
  8. 线性表(一)——顺序表
  9. jenkins运行日志时间与linux,持续集成之Jenkins结合脚本实现代码自动化部署及一键回滚至上一版本...
  10. 云起智慧中心连接华为_云起LifeSmart全系接入HUAWEI HiLink生态系统