- 操作系統: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 的數量,即為漢明距離。