OpenCV 4.13.0
开源计算机视觉库 (Open Source Computer Vision)
正在加载...
正在搜索...
未找到匹配项
该模块提供了不同图像哈希算法的实现。

详细说明

提供提取图像哈希值的算法,以及在大规模数据集中快速查找最相似图像的方法。

所有函数的命名空间是 cv::img_hash

支持的算法

您可以从以下论文和网站了解更多关于图像哈希的信息

代码示例

#include "opencv2/core.hpp"
#include <iostream>
using namespace cv;
using namespace cv::img_hash;
using namespace std;
template <typename T>
inline void test_one(const std::string &title, const Mat &a, const Mat &b)
{
cout << "=== " << title << " ===" << endl;
TickMeter tick;
Mat hashA, hashB;
func = T::create();
tick.reset(); tick.start();
func->compute(a, hashA);
tick.stop();
cout << "compute1: " << tick.getTimeMilli() << " ms" << endl;
tick.reset(); tick.start();
func->compute(b, hashB);
tick.stop();
cout << "compute2: " << tick.getTimeMilli() << " ms" << endl;
cout << "compare: " << func->compare(hashA, hashB) << endl << endl;;
}
int main(int argc, char **argv)
{
if (argc != 3)
{
cerr << "必须输入输入图像和目标图像的路径。例如:hash_samples lena.jpg lena2.jpg" << endl;
return -1;
}
ocl::setUseOpenCL(false);
Mat input = imread(argv[1]);
Mat target = imread(argv[2]);
test_one<AverageHash>("AverageHash", input, target);
test_one<PHash>("PHash", input, target);
test_one<MarrHildrethHash>("MarrHildrethHash", input, target);
test_one<RadialVarianceHash>("RadialVarianceHash", input, target);
test_one<BlockMeanHash>("BlockMeanHash", input, target);
return 0;
}
n 维密集数组类
定义于 mat.hpp:840
一个用于测量经过时间的类。
定义在 utility.hpp:326
void start()
开始计算周期数。
定义在 utility.hpp:335
void stop()
停止计算周期数。
定义在 utility.hpp:341
void reset()
重置内部值。
定义 utility.hpp:430
double getTimeMilli() const
返回以毫秒为单位经过的时间。
定义 utility.hpp:365
std::shared_ptr< _Tp > Ptr
定义 cvstd_wrapper.hpp:23
Mat imread(const String &filename, int flags=IMREAD_COLOR_BGR)
从文件加载图像。
int main(int argc, char *argv[])
定义 highgui_qt.cpp:3
定义 average_hash.hpp:11
定义 core.hpp:107
STL 命名空间。

不同攻击下的性能

性能图表

与 PHash 库的速度比较(来自 ukbench 的 100 张图像)

如您所见,img_hash 模块的哈希计算速度远超 PHash 库

附注:我没有列出平均哈希、PHash 和颜色矩哈希的比较,因为我在 PHash 中找不到它们。

动机

将有用的图像哈希算法收集到 OpenCV 中,这样我们就无需一次又一次地重写它们,或依赖于其他第三方库(例如 PHash 库)。BOVW 或相关匹配是良好且鲁棒的方法,但与图像哈希相比,它们非常慢。如果您需要处理大规模 CBIR(基于内容的图像检索)问题,图像哈希是一个更合理的解决方案。

更多信息

您可以从以下链接了解更多关于 img_hash 模块的信息,这些链接展示了如何从 ukbench 数据集中查找相似图像,并提供了对不同攻击(对比度、模糊、噪声(高斯、椒盐)、jpeg 压缩、水印、缩放)的全面基准测试。

OpenCV 图像哈希模块简介 加速 OpenCV (img_hash) 的图像哈希并介绍颜色矩哈希

贡献者

Tham Ngap Wei, thamn.nosp@m.gapw.nosp@m.ei@gm.nosp@m.ail..nosp@m.com

类  cv::img_hash::AverageHash
 计算输入图像的平均哈希值。 更多...
 
类  cv::img_hash::BlockMeanHash
 基于块均值的图像哈希。 更多...
 
类  cv::img_hash::ColorMomentHash
 基于颜色矩的图像哈希。 更多...
 
类  cv::img_hash::ImgHashBase
 图像哈希算法的基类。 更多...
 
类  cv::img_hash::MarrHildrethHash
 基于 Marr-Hildreth 算子的哈希,速度最慢但区分度更高。 更多...
 
类  cv::img_hash::PHash
 pHash 更多...
 
类  cv::img_hash::RadialVarianceHash
 基于 Radon 变换的图像哈希。 更多...
 

枚举

enum  cv::img_hash::BlockMeanHashMode {
  cv::img_hash::BLOCK_MEAN_HASH_MODE_0 = 0 ,
  cv::img_hash::BLOCK_MEAN_HASH_MODE_1 = 1
}
 

函数

void cv::img_hash::averageHash (cv::InputArray inputArr, cv::OutputArray outputArr)
 一次调用计算 img_hash::AverageHash
 
void cv::img_hash::blockMeanHash (cv::InputArray inputArr, cv::OutputArray outputArr, int mode=BLOCK_MEAN_HASH_MODE_0)
 计算输入图像的块均值哈希。
 
void cv::img_hash::colorMomentHash (cv::InputArray inputArr, cv::OutputArray outputArr)
 计算输入的颜色矩哈希,该算法来源于论文“Perceptual Hashing for Color Images Using Invariant Moments”。
 
void cv::img_hash::marrHildrethHash (cv::InputArray inputArr, cv::OutputArray outputArr, float alpha=2.0f, float scale=1.0f)
 计算输入图像的平均哈希值。
 
void cv::img_hash::pHash (cv::InputArray inputArr, cv::OutputArray outputArr)
 计算输入图像的 pHash 值。
 
void cv::img_hash::radialVarianceHash (cv::InputArray inputArr, cv::OutputArray outputArr, double sigma=1, int numOfAngleLine=180)
 计算输入图像的径向方差哈希。
 

枚举类型文档 (Enumeration Type Documentation)

◆ BlockMeanHashMode

#include <opencv2/img_hash/block_mean_hash.hpp>

枚举值 (Enumerator)
BLOCK_MEAN_HASH_MODE_0 
Python: cv.img_hash.BLOCK_MEAN_HASH_MODE_0

使用较少的块生成 16*16/8 字节的哈希值

BLOCK_MEAN_HASH_MODE_1 
Python: cv.img_hash.BLOCK_MEAN_HASH_MODE_1

使用块(步长/2),生成 31*31/8 + 1 字节的哈希值

函数文档 (Function Documentation)

◆ averageHash()

void cv::img_hash::averageHash ( cv::InputArray inputArr,
cv::OutputArray outputArr )
Python
cv.img_hash.averageHash(inputArr[, outputArr]) -> outputArr

#include <opencv2/img_hash/average_hash.hpp>

一次调用计算 img_hash::AverageHash

参数
inputArr需要计算哈希值的输入图像,类型应为 CV_8UC4、CV_8UC3 或 CV_8UC1。
outputArr输入的哈希值,它将包含 16 个十六进制数字,返回类型为 CV_8U。

◆ blockMeanHash()

void cv::img_hash::blockMeanHash ( cv::InputArray inputArr,
cv::OutputArray outputArr,
int mode = BLOCK_MEAN_HASH_MODE_0 )
Python
cv.img_hash.blockMeanHash(inputArr[, outputArr[, mode]]) -> outputArr

#include <opencv2/img_hash/block_mean_hash.hpp>

计算输入图像的块均值哈希。

参数
inputArr需要计算哈希值的输入图像,类型应为 CV_8UC4、CV_8UC3 或 CV_8UC1。
outputArr输入的哈希值,它将包含 16 个十六进制数字,返回类型为 CV_8U。
mode模式

◆ colorMomentHash()

void cv::img_hash::colorMomentHash ( cv::InputArray inputArr,
cv::OutputArray outputArr )
Python
cv.img_hash.colorMomentHash(inputArr[, outputArr]) -> outputArr

#include <opencv2/img_hash/color_moment_hash.hpp>

计算输入的颜色矩哈希,该算法来源于论文“Perceptual Hashing for Color Images Using Invariant Moments”。

参数
inputArr需要计算哈希值的输入图像,类型应为 CV_8UC4、CV_8UC3 或 CV_8UC1。
outputArr42 个双精度浮点数(CV_64F(double))的哈希值

◆ marrHildrethHash()

void cv::img_hash::marrHildrethHash ( cv::InputArray inputArr,
cv::OutputArray outputArr,
float alpha = 2.0f,
float scale = 1.0f )
Python
cv.img_hash.marrHildrethHash(inputArr[, outputArr[, alpha[, scale]]]) -> outputArr

#include <opencv2/img_hash/marr_hildreth_hash.hpp>

计算输入图像的平均哈希值。

参数
inputArr需要计算哈希值的输入图像,类型应为 CV_8UC4、CV_8UC3、CV_8UC1。
outputArr输入的哈希值,它将包含 16 个十六进制数字,返回类型为 CV_8U。
alphaMarr 小波的尺度因子(默认=2)。
scale尺度因子的级别(默认 = 1)。

◆ pHash()

void cv::img_hash::pHash ( cv::InputArray inputArr,
cv::OutputArray outputArr )
Python
cv.img_hash.pHash(inputArr[, outputArr]) -> outputArr

#include <opencv2/img_hash/phash.hpp>

计算输入图像的 pHash 值。

参数
inputArr需要计算哈希值的输入图像,类型应为 CV_8UC4、CV_8UC3、CV_8UC1。
outputArr输入的哈希值,它将包含 8 个字节的值。

◆ radialVarianceHash()

void cv::img_hash::radialVarianceHash ( cv::InputArray inputArr,
cv::OutputArray outputArr,
double sigma = 1,
int numOfAngleLine = 180 )
Python
cv.img_hash.radialVarianceHash(inputArr[, outputArr[, sigma[, numOfAngleLine]]]) -> outputArr

#include <opencv2/img_hash/radial_variance_hash.hpp>

计算输入图像的径向方差哈希。

参数
inputArr需要计算哈希值的输入图像,类型应为 CV_8UC4、CV_8UC3、CV_8UC1。
outputArr输入的哈希值
sigma高斯核的标准差
numOfAngleLine考虑的角度数