OpenCV  4.10.0
开源计算机视觉
加载中...
搜索中...
无匹配项
| 枚举 | 函数
该模块提供不同图像哈希算法的实现。

详细说明

提供用于提取图像哈希值和快速找出大型数据集中最相似图像的算法。

所有函数的命名空间为 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;
}
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:812
用于测量经过时间的类。
定义 utility.hpp:295
void start()
开始计数滴答。
定义 utility.hpp:304
void stop()
停止计数滴答。
定义 utility.hpp:310
void reset()
重置内部值。
定义 utility.hpp:374
double getTimeMilli() const
返回以毫秒为单位的经过时间。
定义 utility.hpp:333
std::shared_ptr< _Tp > Ptr
定义 cvstd_wrapper.hpp:23
void setUseOpenCL(bool flag)
CV_EXPORTS_W Mat imread(const String &filename, int flags=IMREAD_COLOR)
从文件加载图像。
int main(int argc, char *argv[])
定义 highgui_qt.cpp:3
定义 average_hash.hpp:11
与磁盘上文件关联的文件存储的“黑盒”表示。
定义 core.hpp:102
STL 命名空间。

在不同攻击下的性能

性能图表

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

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

PS:我没有列出平均哈希、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

class  cv::img_hash::AverageHash
 计算输入图像的平均哈希值。 更多...
 
class  cv::img_hash::BlockMeanHash
 基于块均值的图像哈希。 更多...
 
class  cv::img_hash::ColorMomentHash
 基于颜色矩的图像哈希。 更多...
 
class  cv::img_hash::ImgHashBase
 图像哈希算法的基类。 更多...
 
class  cv::img_hash::MarrHildrethHash
 基于 Marr-Hildreth 算子的哈希,速度最慢但更具辨别力。 更多...
 
class  cv::img_hash::PHash
 pHash 更多...
 
class  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)
 计算输入图像的径向方差哈希。
 

枚举类型文档

◆ BlockMeanHashMode

#include <opencv2/img_hash/block_mean_hash.hpp>

枚举器
BLOCK_MEAN_HASH_MODE_0 
Python: cv.img_hash.BLOCK_MEAN_HASH_MODE_0

使用更少的块并生成 16*16/8 uchar 哈希值

BLOCK_MEAN_HASH_MODE_1 
Python: cv.img_hash.BLOCK_MEAN_HASH_MODE_1

使用块块(步长大小/2),生成 31*31/8 + 1 uchar 哈希值

函数文档

◆ 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要考虑的角度数量