- 操作系統:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 編程語言:C++11
算法描述
PHash是OpenCV中實現感知哈希(Perceptual Hash)算法的類。該算法用于快速比較圖像的視覺相似性。它將圖像壓縮為一個簡短的哈希值(通常為64位),可用于圖像去重、版權識別、內容匹配等場景。
PHash 基于圖像的低頻信息(通過 DCT 變換提取)來生成哈希值,對輕微的噪聲、縮放和旋轉具有一定的魯棒性。
成員函數
virtual void compute (InputArray input, OutputArray output)
參數說明:
- input:輸入圖像(支持灰度圖或彩色圖,建議先轉換為灰度圖以提高一致性)。
- output:輸出哈希值,類型為 CV_8U,長度通常是 8 字節(64 位)。
功能:
計算輸入圖像的 PHash 哈希值,并保存到 output 中。
virtual double compare (InputArray hash1, InputArray hash2)
參數說明:
- hash1, hash2:兩個哈希值(必須是相同格式的 8 字節數組)。
返回值:兩個哈希之間的漢明距離(Hamming Distance),表示差異程度。數值越小表示圖像越相似。
功能:
比較兩個哈希值的相似性,常用于判斷兩幅圖像是否“看起來一樣”。
代碼示例
#include <opencv2/img_hash.hpp>
#include <opencv2/opencv.hpp>int main()
{// 加載圖像cv::Mat img1 = cv::imread( "/media/dingxin/data/study/OpenCV/sources/images/img1.jpg", cv::IMREAD_GRAYSCALE );cv::Mat img2 = cv::imread( "/media/dingxin/data/study/OpenCV/sources/images/img2.jpg", cv::IMREAD_GRAYSCALE );if ( img1.empty() || img2.empty() ){std::cerr << "無法加載圖像" << std::endl;return -1;}// 創建 PHash 算法對象cv::Ptr< cv::img_hash::PHash > phash = cv::img_hash::PHash::create();// 計算哈希值cv::Mat hash1, hash2;phash->compute( img1, hash1 );phash->compute( img2, hash2 );// 比較哈希值double distance = phash->compare( hash1, hash2 );std::cout << "漢明距離: " << distance << std::endl;return 0;
}
運行結果
漢明距離: 1