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

OpenCV 图像哈希类cv::img_hash::AverageHash

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

算法描述

cv::img_hash::AverageHash是OpenCV中用于图像哈希(Image Hashing)的一个类,属于opencv_img_hash模块。它实现了平均哈希算法(Average Hash, aHash),可以快速计算图像的“指纹”或“感知哈希值”,用于判断两张图像是否相似。

主要成员函数

  1. compute(InputArray image, OutputArray code)

计算输入图像的 aHash 哈希值。

void compute(InputArray image, OutputArray code);
  • image: 输入图像(支持 CV_8UC1 或 CV_8UC3)
  • code: 输出的哈希值(类型为 CV_8U 的一维 Mat)
  1. compare(const cv::Mat& code1, const cv::Mat& code2)

比较两个哈希值之间的差异(返回汉明距离)。

double compare(const cv::Mat& code1, const cv::Mat& code2);

返回值越小表示图像越相似(0 表示完全相同)

示例代码

#include <iostream>
#include <opencv2/img_hash.hpp>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace cv::img_hash;
using namespace std;int main()
{// 加载图像(支持彩色图或灰度图)Mat img1 = imread( "/media/dingxin/data/study/OpenCV/sources/images/img2.jpg", IMREAD_COLOR );Mat img2 = imread( "/media/dingxin/data/study/OpenCV/sources/images/img1.jpg", IMREAD_COLOR );if ( img1.empty() || img2.empty() ){cerr << "无法加载图像!" << endl;return -1;}// 创建 AverageHash 对象Ptr< AverageHash > ahash = AverageHash::create();// 计算哈希值Mat hash1, hash2;ahash->compute( img1, hash1 );ahash->compute( img2, hash2 );// 比较哈希值(返回汉明距离)double distance = ahash->compare( hash1, hash2 );cout << "汉明距离: " << distance << endl;if ( distance < 10 ){cout << "图像非常相似!" << endl;}else{cout << "图像不相似。" << endl;}return 0;
}

运行结果

汉明距离: 1
图像非常相似!

补充:
汉明距离(Hamming Distance) 是一种用于测量两个等长字符串或数据序列之间差异的度量方法。具体来说,它定义为两个字符串在对应位置上不同字符的数量。对于二进制串(如哈希值),汉明距离就是两个串中不相同位的个数。
在图像哈希中的应用

在图像处理和计算机视觉领域,汉明距离常用于比较两个图像的哈希值(指纹)。例如,在使用感知哈希算法(如 aHash、pHash 等)生成图像的哈希值后,可以通过计算它们之间的汉明距离来衡量这两幅图像的相似度:

  • 汉明距离越小,表示两幅图像越相似。
  • 汉明距离为 0 表示两幅图像完全相同(至少在哈希级别上是相同的)。
  • 如果汉明距离超过某个阈值,则认为两幅图像不相似。

计算汉明距离的方法

假设我们有两个等长的二进制字符串 str1 和 str2,其汉明距离可以通过以下步骤计算:

  • 将两个字符串逐位进行异或操作(XOR),得到一个新的字符串,其中每个位置上的值为 1 表示原两个字符串在此位置上的值不同,为 0 表示相同。
  • 统计新字符串中 1 的数量,即为汉明距离。
http://www.dtcms.com/a/269694.html

相关文章:

  • ​扣子Coze飞书多维表插件通用参数和通用返回值
  • Mysql常用内置函数,复合查询及内外连接
  • 利用外部Postgresql及zookeeper,启动Apache Dolphinscheduler3.1.9
  • 小程序订阅消息设计:用户触达与隐私保护的平衡法则
  • STM32-定时器
  • 冷链物流配送中心选址与路径优化模型研究
  • SpringBoot基础特性:自定义Banner与Swagger文档
  • houdini云渲染和云解算新选择
  • 易境通海运系统:赋能海运企业全链路数字化运营!
  • 【Note】《Kafka: The Definitive Guide》第11章:Stream Processing
  • BERT代码简单笔记
  • C#中封装halcon函数的报错
  • 代码详细注释:C语言实现控制台用户注册登录系统
  • Google AI 刚刚开源 MCP 数据库工具箱,让 AI 代理安全高效地查询数据库
  • 前后端分离(java) 和 Nginx在服务器上的完整部署方案(redis、minio)
  • JxBrowser 7.43.4 版本发布啦!
  • 人工智能驱动下的可再生能源气象预测:构建绿色能源时代的新大脑
  • 微服务化采集平台:可扩展性与容错机制
  • 相机Camera日志实例分析之五:相机Camx【萌拍闪光灯后置拍照】单帧流程日志详解
  • AiPy实战:问界汽车交付速度破纪录的背后是什么?
  • Vue的初步学习
  • 146.在 Vue3 中使用 OpenLayers 地图上 ECharts 模拟飞机循环飞行
  • OS学习笔记
  • B站视频下载器 Bili23-Downloader v1.63.1 绿色版
  • LLMs之DeepSeek:AI模型市场深度分析:DeepSeek的挑战与机遇,模型市场份额、Token经济学与未来发展
  • 力扣 239 题:滑动窗口最大值的两种高效解法
  • 【python】 time_str = time_str.strip() 与 time_str = str(time_str).strip() 的区别
  • 基于物联网的智能交通灯控制系统设计
  • 使用 Docker 搭建 Java(SpringBoot)开发环境——AI教你学Docker
  • 零基础|宝塔面板|frp内网穿透|esp32cam远程访问|微信小程序