- 操作系統:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 編程語言:C++11
算法描述
該類實現了顏色矩哈希算法(Color Moment Hash),用于圖像相似性比較。它基于圖像在HSV顏色空間中的顏色矩統計特征來生成哈希值,對顏色分布的變化具有較好的魯棒性。
適用于以下場景:
- 圖像檢索
- 圖像去重
- 水印檢測
- 色彩變化較大的圖像匹配
公共成員函數
- compute(InputArray inputArr, OutputArray outputArr)
計算輸入圖像的顏色矩哈希值。
參數說明:
參數 | 類型 | 描述 |
---|---|---|
inputArr | InputArray | 輸入圖像,必須是三通道彩色圖像 (CV_8UC3) |
outputArr | OutputArray | 輸出的哈希值,類型為 CV_64F 的一維 Mat |
示例: |
Mat hash;
color_moment_hash->compute(image, hash);
- compare(const Mat& hashOne, const Mat& hashTwo)
比較兩個哈希值之間的差異,返回歐幾里得距離。
參數說明:
參數 | 類型 | 描述 |
---|---|---|
hashOne | const Mat& | 第一個哈希值 |
hashTwo | const Mat& | 第二個哈希值 |
返回值: |
- 返回兩個哈希之間的歐幾里得距離。
- 值越小表示圖像越相似。
示例:
double distance = color_moment_hash->compare(hash1, hash2);
if (distance < threshold) {std::cout << "圖像相似" << std::endl;
}
哈希值格式說明
- 長度:18 個雙精度浮點數(共 144 bits)
- 數據內容:
- 每個像素轉換為 HSV 顏色空間
- 對 Hue、Saturation、Value 三個通道分別計算前 3 階顏色矩(均值、標準差、偏度)
- 總共 3 通道 × 3 矩 = 9 個特征,每個特征用 2 個 double 表示(共 18 個)
示例代碼
#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/img1.jpg", IMREAD_COLOR );Mat img2 = imread( "/media/dingxin/data/study/OpenCV/sources/images/img2.jpg", IMREAD_COLOR );if ( img1.empty() || img2.empty() ){cerr << "無法加載圖像!" << endl;return -1;}// 創建 ColorMomentHash 對象Ptr< ColorMomentHash > color_moment_hash = ColorMomentHash::create();// 計算哈希值Mat hash1, hash2;color_moment_hash->compute( img1, hash1 );color_moment_hash->compute( img2, hash2 );// 比較哈希值(返回歐幾里得距離)double distance = color_moment_hash->compare( hash1, hash2 );cout << "歐幾里得距離: " << distance << endl;if ( distance < 0.1 ){ // 這里的閾值可以根據實際情況調整cout << "圖像非常相似!" << endl;}else{cout << "圖像不相似。" << endl;}return 0;
}
運行結果
歐幾里得距離: 7.22988
圖像不相似。