OpenCV 4.11.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;
}
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:829
用于测量时间的类。
**定义**: 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
CV_EXPORTS_W 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变换的图像哈希。 更多...
 

枚举

枚举 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)
 计算输入的颜色矩哈希,算法来自论文“使用不变矩的颜色图像感知哈希”。
 
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

使用块blocks(步长/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>

计算输入的颜色矩哈希,算法来自论文“使用不变矩的颜色图像感知哈希”。

参数
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个uchar值

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