当前位置: 首页 > news >正文

OpenCV多种图像哈希算法的实现比较

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

OpenCV提供用于提取图像哈希值的算法,以及在大规模数据集中快速找出最相似图像的方法。
所有函数的命名空间为:cv::img_hash。
支持的算法:

  • 平均哈希(也称为差分哈希)Average hash (also called Different hash)
  • PHash(也称为感知哈希)PHash (also called Perceptual hash)
  • Marr Hildreth 哈希 Marr Hildreth Hash
  • 径向方差哈希 Radial Variance Hash
  • 分块均值哈希(支持模式 0 和 1)Block Mean Hash (modes 0 and 1)
  • 颜色矩哈希 Color Moment Hash
    (这是目前唯一一个对旋转攻击具有抗性的哈希算法(-90~90 度))

你可以通过以下论文和网站了解更多关于图像哈希的内容:

  • “Implementation and benchmarking of perceptual image hash functions” 310
  • “Looks Like It” 145

示例代码


#include "opencv2/core.hpp"
#include "opencv2/core/ocl.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/img_hash.hpp"
#include <iostream>using namespace cv;
using namespace cv::img_hash;
using namespace std;template < typename T > inline void test_one( const std::string& title, const Mat& a, const Mat& b )
{cout << "=== " << title << " ===" << endl;TickMeter tick;Mat hashA, hashB;Ptr< ImgHashBase > func;func = T::create();tick.reset();tick.start();func->compute( a, hashA );tick.stop();cout << "compute1: " << tick.getTimeMilli() << " ms" << endl;tick.reset();tick.start();func->compute( b, hashB );tick.stop();cout << "compute2: " << tick.getTimeMilli() << " ms" << endl;cout << "compare: " << func->compare( hashA, hashB ) << endl << endl;;
}int main( int argc, char** argv )
{ocl::setUseOpenCL( false );Mat input  = imread( "/media/dingxin/data/study/OpenCV/sources/images/img1.jpg");Mat target = imread( "/media/dingxin/data/study/OpenCV/sources/images/img1.jpg");test_one< AverageHash >( "AverageHash", input, target );test_one< PHash >( "PHash", input, target );test_one< MarrHildrethHash >( "MarrHildrethHash", input, target );test_one< RadialVarianceHash >( "RadialVarianceHash", input, target );test_one< BlockMeanHash >( "BlockMeanHash", input, target );return 0;
}

运行结果

=== AverageHash ===
compute1: 22.391 ms
compute2: 0.01228 ms
compare: 0=== PHash ===
compute1: 0.048038 ms
compute2: 0.028032 ms
compare: 0=== MarrHildrethHash ===
compute1: 40.5077 ms
compute2: 7.61326 ms
compare: 0=== RadialVarianceHash ===
compute1: 0.640129 ms
compute2: 0.670026 ms
compare: 1=== BlockMeanHash ===
compute1: 0.173648 ms
compute2: 0.169781 ms
compare: 0

不同攻击下的性能表现

在这里插入图片描述

性能图表

与 PHash 库的速度比较(来自 ukbench 的 100 张图像)
在这里插入图片描述

哈希计算图表

在这里插入图片描述

哈希比较图表
如你所见,img_hash 模块的哈希计算速度远超 PHash 库。

附注:我没有列出平均哈希、PHash 和颜色矩哈希的比较,因为在 PHash 库中找不到它们。

动机

将有用的图像哈希算法集成到 OpenCV 中,这样我们就无需反复重写这些算法或依赖第三方库(例如 PHash 库)。BOVW(Bag of Visual Words)或相关匹配虽然好且鲁棒,但与图像哈希相比非常慢。如果你需要处理大规模基于内容的图像检索(CBIR)问题,图像哈希是一个更为合理的解决方案。

更多信息

你可以从以下链接了解更多关于 img_hash 模块的信息。这些链接展示了如何从 ukbench 数据集中找到相似图像,并提供了对不同类型攻击(对比度、模糊、噪声(高斯、椒盐)、JPEG 压缩、水印、调整大小)的全面基准测试。

OpenCV 图像哈希模块简介
加速OpenCV图像哈(img_hash)并介绍颜色矩哈希

贡献者

Tham Ngap Wei, thamngapwei@gmail.com

http://www.xdnf.cn/news/1104517.html

相关文章:

  • 代码随想录|图论|10水流问题
  • 项目捷报 | 冠捷科技泰国工厂THA MES项目成功验收!TPV国际化布局再添里程碑!
  • 机器学习之线性回归(七)
  • 【unitrix】 4.20 类型级二进制数减法实现解析(sub.rs)
  • C++ auto与 for循环
  • 玖玖NFT数字藏品源码(源码下载)
  • Adobe Acrobat DC JavaScript 基础到应用
  • c++STL-优先队列priority_queue和仿函数
  • Docker高级管理--Dockerfile 镜像制作
  • 伺服驱动控制CANopen协议
  • 弧焊机器人气体全方位节能指南
  • Shein在欧又遭针对?从4000万欧到1.5亿欧,Shein两个月内连收两张法国罚单!
  • TCP详解——流量控制、滑动窗口
  • 【Linux】系统引导修复
  • [精选]如何解决pip安装报错ModuleNotFoundError: No module named ‘subprocess’问题
  • C++设计秘籍:为什么所有参数都需类型转换时,非成员函数才是王道?
  • V少JS基础班之第七弹
  • 从一到无穷大 #47:浅谈对象存储加速
  • 自动驾驶线控系统与动力电池系统
  • 基于MuJoCo的宇树科技G1机器人基础动作仿真研究
  • BLE低功耗设计:从广播模式到连接参数优化的全链路分析与真题解析
  • 2025 年第十五届 APMCM 亚太地区大学生数学建模竞赛-A题 农业灌溉系统优化
  • DOM编程实例(不重要,可忽略)
  • Telegraf vs. Logstash:实时数据处理架构中的关键组件对比
  • 【数据结构与算法】206.反转链表(LeetCode)
  • 麦迪逊悬架cad【14张】+三维图+设计说明书
  • 基于生产者消费者模型的线程池【Linux操作系统】
  • 《PyQtGraph:Python绘图领域的“超级引擎”》
  • 加工进化论:SPL 一键加速日志转指标
  • Genus:设计信息结构以及导航方式(路径种类)