当前位置: 首页 > news >正文

OpenCV颜色矩哈希算法------cv::img_hash::ColorMomentHash

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

该类实现了颜色矩哈希算法(Color Moment Hash),用于图像相似性比较。它基于图像在HSV颜色空间中的颜色矩统计特征来生成哈希值,对颜色分布的变化具有较好的鲁棒性。

适用于以下场景:

  • 图像检索
  • 图像去重
  • 水印检测
  • 色彩变化较大的图像匹配

公共成员函数

  1. compute(InputArray inputArr, OutputArray outputArr)

计算输入图像的颜色矩哈希值。
参数说明:

参数类型描述
inputArrInputArray输入图像,必须是三通道彩色图像 (CV_8UC3)
outputArrOutputArray输出的哈希值,类型为 CV_64F 的一维 Mat
示例:
Mat hash;
color_moment_hash->compute(image, hash);
  1. compare(const Mat& hashOne, const Mat& hashTwo)

比较两个哈希值之间的差异,返回欧几里得距离。
参数说明:

参数类型描述
hashOneconst Mat&第一个哈希值
hashTwoconst Mat&第二个哈希值
返回值:
  • 返回两个哈希之间的欧几里得距离。
  • 值越小表示图像越相似。

示例:

double distance = color_moment_hash->compare(hash1, hash2);
if (distance < threshold) {std::cout << "图像相似" << std::endl;
}

哈希值格式说明

  • 长度:18 个双精度浮点数(共 144 bits)
  • 数据内容:
    • 每个像素转换为 HSV 颜色空间
    • 对 Hue、Saturation、Value 三个通道分别计算前 3 阶颜色矩(均值、标准差、偏度)
    • 总共 3 通道 × 3 矩 = 9 个特征,每个特征用 2 个 double 表示(共 18 个)

示例代码

#include <iostream>
#include <opencv2/img_hash.hpp>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace cv::img_hash;
using namespace std;int main()
{// 加载图像(仅支持彩色图)Mat img1 = imread( "/media/dingxin/data/study/OpenCV/sources/images/img1.jpg", IMREAD_COLOR );Mat img2 = imread( "/media/dingxin/data/study/OpenCV/sources/images/img2.jpg", IMREAD_COLOR );if ( img1.empty() || img2.empty() ){cerr << "无法加载图像!" << endl;return -1;}// 创建 ColorMomentHash 对象Ptr< ColorMomentHash > color_moment_hash = ColorMomentHash::create();// 计算哈希值Mat hash1, hash2;color_moment_hash->compute( img1, hash1 );color_moment_hash->compute( img2, hash2 );// 比较哈希值(返回欧几里得距离)double distance = color_moment_hash->compare( hash1, hash2 );cout << "欧几里得距离: " << distance << endl;if ( distance < 0.1 ){  // 这里的阈值可以根据实际情况调整cout << "图像非常相似!" << endl;}else{cout << "图像不相似。" << endl;}return 0;
}

运行结果

欧几里得距离: 7.22988
图像不相似。
http://www.lryc.cn/news/583153.html

相关文章:

  • STM32-待机唤醒实验
  • [Leetcode] 预处理 | 多叉树bfs | 格雷编码 | static_cast | 矩阵对角线
  • User手机上如何抓取界面的布局uiautomatorviewer
  • 【机器人】Aether 多任务世界模型 | 4D动态重建 | 视频预测 | 视觉规划
  • 速卖通跨境运营破局:亚矩阵云手机如何用“本地化黑科技”撬动俄罗斯市场25%客单价增长
  • React 编译器与性能优化:告别手动 Memoization
  • 开始读 PostgreSQL 16 Administration Cookbook
  • 苍穹外卖项目日记(day04)
  • 【Netty+WebSocket详解】WebSocket全双工通信与Netty的高效结合与实战
  • 冷冻电镜重构的GPU加速破局:从Relion到CryoSPARC的并行重构算法
  • 《重构项目》基于Apollo架构设计的项目重构方案(多种地图、多阶段、多任务、状态机管理)
  • 仓颉语言 1.0.0 升级指南:工具链适配、collection 操作重构与 Map 遍历删除避坑
  • IT系统安全刚需:绝缘故障定位系统
  • Tailwind CSS纵向滚动条设置
  • PiscTrace深蹲计数功能实现:基于 YOLO-Pose 和人体关键点分析
  • 基于Java+Maven+Testng+Selenium+Log4j+Allure+Jenkins搭建一个WebUI自动化框架(4)集成Allure报表
  • JavaScript数组方法——梳理和考点
  • SpringBoot实现动态Job实战
  • DRT-Net: Dual-Branch Rectangular Transformer with Contrastive Learning
  • 离线二维码生成器,无需网络快速制作
  • springBoot使用XWPFDocument 和 LoopRowTableRenderPolicy 两种方式填充数据到word模版中
  • Android-重学kotlin(协程源码第一阶段)新学习总结
  • npm init vue@latestnpm error code ETIMEDOUT
  • 网络请求与现实生活:用办理业务类比理解HTTP通信
  • kotlin学习,val使用get()的问题
  • AI 知识库 2.0 时代!2025 设备管理系统如何实现 “智慧运维”?
  • Docker完全指南:从入门到生产环境实战
  • 将.net应用部署到Linux服务器
  • 深入解析 .NET 泛型:从原理到实战优化
  • Docker 搭建 Harbor 私有仓库