OpenCV 4.12.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:830
一个用于测量流逝时间的类。
定义 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
Definition 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 库

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

类  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

使用块(步长/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高斯核标准差
角度线数量要考虑的角度数量