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 哈希值。

cpp 复制代码
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)

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

cpp 复制代码
double compare(const cv::Mat& code1, const cv::Mat& code2);

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

示例代码

cpp 复制代码
#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;
}

运行结果

bash 复制代码
汉明距离: 1
图像非常相似!

补充:

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

在图像哈希中的应用

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

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

计算汉明距离的方法

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

  • 将两个字符串逐位进行异或操作(XOR),得到一个新的字符串,其中每个位置上的值为 1 表示原两个字符串在此位置上的值不同,为 0 表示相同。
  • 统计新字符串中 1 的数量,即为汉明距离。
相关推荐
lpfasd1231 小时前
2026年第30周科技社区趋势周报:开放权重之争与AI Agent的破局
人工智能·科技
奋发向前wcx3 小时前
y1,y2总复习笔记10 2026.7.24
笔记·哈希算法·散列表
佛光芳林3 小时前
AI 情报局:用 PowerMem + SeekDB 做一个多 Agent 记忆小游戏
人工智能
通问AI3 小时前
2026年AI短剧技术现状:全链路AIGC生产已达95%,但用户完播率不足15%
人工智能·aigc
_Jimmy_3 小时前
Agent引用数据库知识过时的增量同步方案
人工智能·python·langchain
qq_454245034 小时前
Systemprompt 体系全览:形式化公理驱动的分层系统设计
人工智能
大龄码农有梦想4 小时前
传统的 BPMN 工作流审批和 AI 工作流有什么区别?
人工智能·流程引擎·工作流·ai agent·ai工作流·审批流·智能体平台
DO_Community4 小时前
Claude Opus 5 现已上线 DigitalOcean AI 推理云
人工智能·llm·agent·claude
幸福指北4 小时前
🚀 开源了,一个人 + AI 肝出一个 AI 终端 | AShell 技术分享
运维·人工智能·ai·终端
可以飞的话4 小时前
一、机器学习概述
人工智能·机器学习