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),可以快速计算图像的“指纹”或“感知哈希值”,用于判断两张图像是否相似。
主要成员函数
- compute(InputArray image, OutputArray code)
计算输入图像的 aHash 哈希值。
void compute(InputArray image, OutputArray code);
- image: 输入图像(支持 CV_8UC1 或 CV_8UC3)
- code: 输出的哈希值(类型为 CV_8U 的一维 Mat)
- 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 的数量,即为汉明距离。