23 OpenCV 直方图比较

文章目录

  • 直方图比较的目的
  • 相关性计算 (CV_COMP_CORREL)
  • 卡方计算 (CV_COMP_CHISQR)
  • 十字计算(CV_COMP_INTERSECT)
  • 巴氏距离计算 (CV_COMP_BHATTACHARYYA )
  • compareHist 直方图比较算子
  • 示例

直方图比较的目的

直方图比较的目的是衡量两幅图像之间的相似度或差异度。通过计算图像的颜色直方图并对其进行归一化处理,可以得到描述图像颜色分布的特征向量。然后,通过比较这些特征向量,我们可以评估两幅图像在颜色分布上的相似程度。
在计算直方图相似度时,常用的方法包括交叉相关性(Correlation)、卡方(Chi-Square)、巴氏距离(Bhattacharyya distance)等。这些方法可以帮助我们量化图像之间的相似性,从而在图像检索、匹配和分类等领域发挥重要作用。
在图像处理中,使用色调(Hue)和饱和度(Saturation)来计算直方图是一种常见的做法,主要有以下几个原因:

颜色信息较为重要:色调和饱和度包含了图像中的颜色信息,而亮度(Value)通道往往受光照等因素影响较大,不太适合用于颜色分布的比较。

计算效率高:计算二维色调-饱和度直方图相对计算三维色调-饱和度-亮度直方图更为高效,可以降低计算复杂度。

颜色差异明显:色调和饱和度能够有效地表现不同颜色之间的差异,对于许多图像分析和检索任务已经足够。

相关性计算 (CV_COMP_CORREL)

在这里插入图片描述

卡方计算 (CV_COMP_CHISQR)

在这里插入图片描述

十字计算(CV_COMP_INTERSECT)

在这里插入图片描述

巴氏距离计算 (CV_COMP_BHATTACHARYYA )

在这里插入图片描述

compareHist 直方图比较算子

compareHist(
InputArray h1, // 直方图数据,下同
InputArray H2,
int method// 比较方法,上述四种方法之一
)

示例

#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>

using namespace std;
using namespace cv;

string convertToString(double d);

int main(int argc, char** argv) {
    // 读取图像
    Mat base, test1, test2;
    Mat hsvbase, hsvtest1, hsvtest2;
    base = imread("D:/vcprojects/images/test.jpg");
    if (!base.data) {
        printf("could not load image...\n");
        return -1;
    }
    test1 = imread("D:/vcprojects/images/lena.png");
    test2 = imread("D:/vcprojects/images/lenanoise.png");

    // 转换为HSV格式
    cvtColor(base, hsvbase, CV_BGR2HSV);
    cvtColor(test1, hsvtest1, CV_BGR2HSV);
    cvtColor(test2, hsvtest2, CV_BGR2HSV);

    // 设置直方图参数
    int h_bins = 50; // 色调(Hue)分组数量
    int s_bins = 60; // 饱和度(Saturation)分组数量
    int histSize[] = { h_bins, s_bins }; // 直方图的 bin 数量,二维直方图
    float h_ranges[] = { 0, 180 }; // 色调取值范围
    float s_ranges[] = { 0, 256 }; // 饱和度取值范围
    const float* ranges[] = { h_ranges, s_ranges }; // 取值范围数组
    int channels[] = { 0, 1 }; // 要计算直方图的通道
    
    // 计算直方图
    MatND hist_base;
    MatND hist_test1;
    MatND hist_test2;

    calcHist(&hsvbase, 1,  channels, Mat(), hist_base, 2, histSize, ranges, true, false);
    normalize(hist_base, hist_base, 0, 1, NORM_MINMAX, -1, Mat());

    calcHist(&hsvtest1, 1, channels, Mat(), hist_test1, 2, histSize, ranges, true, false);
    normalize(hist_test1, hist_test1, 0, 1, NORM_MINMAX, -1, Mat());

    calcHist(&hsvtest2, 1, channels, Mat(), hist_test2, 2, histSize, ranges, true, false);
    normalize(hist_test2, hist_test2, 0, 1, NORM_MINMAX, -1, Mat());
    
    // 计算直方图相似度
    double basebase = compareHist(hist_base, hist_base, CV_COMP_INTERSECT);
    double basetest1 = compareHist(hist_base, hist_test1, CV_COMP_INTERSECT);
    double basetest2 = compareHist(hist_base, hist_test2, CV_COMP_INTERSECT);
    double tes1test2 = compareHist(hist_test1, hist_test2, CV_COMP_INTERSECT);
    printf("test1 compare with test2 correlation value :%f", tes1test2);

    // 在图像上显示相似度值
    Mat test12;
    test2.copyTo(test12);
    putText(base, convertToString(basebase), Point(50, 50), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(0, 0, 255), 2, LINE_AA);
    putText(test1, convertToString(basetest1), Point(50, 50), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(0, 0, 255), 2, LINE_AA);
    putText(test2, convertToString(basetest2), Point(50, 50), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(0, 0, 255), 2, LINE_AA);
    putText(test12, convertToString(tes1test2), Point(50, 50), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(0, 0, 255), 2, LINE_AA);
    
    // 创建窗口并显示图像
    namedWindow("base");
    namedWindow("test1");
    namedWindow("test2");
    namedWindow("test12");

    imshow("base", base);
    imshow("test1", test1);
    imshow("test2", test2);
    imshow("test12", test12);

    waitKey(0);
    return 0;
}

// 将double类型转换为字符串
string convertToString(double d) {
    ostringstream os;
    if (os << d)
        return os.str();
    return "invalid conversion";
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/477626.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据可视化实战(三)

图书销量情况对比 import pandas as pd import matplotlib.pyplot as plt # 读取Excel数据 dfpd.read_excel(mrbook.xlsx) df序号书号序号.1月份销量rate0B189.787569e1211月15060.31B199.787569e1222月1200-0.32B259.787569e1233月33050.63B219.787569e1244月66100.54NaNNaN5…

redis从入门到实战

Redis基础 简介 Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的、基于内存的数据存储和缓存系统。它是一个高性能的键值存储数据库&#xff0c;&#xff0c;以其快速的读写能力、丰富的数据结构和多种应用场景而受到广泛关注。默认的database有16个&…

使用Docker搭建YesPlayMusic网易云音乐播放器并发布至公网访问

目录 ⛳️推荐 1. 安装Docker 2. 本地安装部署YesPlayMusic 3. 部署公有云YesPlayMusic播放器 3.1 安装cpolar内网穿透 3.2 固定YesPlayMusic公网地址 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一…

Docker网桥、DockerFile自定义镜像、DockerCompose工具(二)

这里写目录标题 1、网桥1.1、网络相关操作1.1.1、创建网络1.1.2、列出网络1.1.3、加入网络1.1.4、查看网络详情1.1.5、删除网络 2、Dockerfile自定义镜像2.1、镜像结构2.2、Dockerfile语法2.2.1、概述2.2.2、快速入门2.2.1、FROM2.2.2、CMD2.2.3、ENV2.2.4、WORKDIR2.2.5、run2…

银行OA系统|基于SpringBoot架构+ Mysql+Java+ B/S结构的银行OA系统设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java&#xff0c;ssm&#xff0c;springboot的平台设计与实现项目系统开发资源&#xff08;可…

基于FPGA的FFT图像滤波设计

1.FFT滤波算法介绍 FFT滤波就是通过傅里叶运算将图像转换到频域空间&#xff0c;然后在频域中对图像进行处理&#xff0c;最后将处理后的图像通过傅里叶逆运算将图像转会到时域空间。 在频域空间中&#xff0c;我们能够更好的对图像的噪声进行分析&#xff0c;然后找出相关规律…

MAC废纸篓删掉还能复原吗 MAC废纸篓倾倒掉的文件怎么恢复 删除的东西在哪里可以找回来 怎么找回已删除的文件

MAC系统中的废纸篓&#xff08;Trash&#xff09;通常指用来临时存放用户即将丢弃的文件的地方。MAC系统的废纸篓功能相当于Windows系统的垃圾回收站&#xff0c;通过废纸篓删除的文件&#xff0c;一般是无法从系统中操作还原。那么&#xff0c;MAC废纸篓删掉还能复原吗&#x…

5-隐藏层:神经网络为什么working

声明 本文章基于哔哩哔哩付费课程《小白也能听懂的人工智能原理》。仅供学习记录、分享&#xff0c;严禁他用&#xff01;&#xff01;如有侵权&#xff0c;请联系删除 目录 一、知识引入 &#xff08;一&#xff09;隐藏层 &#xff08;二&#xff09;泛化 &#xff08;三…

UE4 Json事件设置Asset值(Asset如果都在同一目录下)

通过Json事件来设置&#xff0c;比如骨骼网格体&#xff08;换皮&#xff09;等等

202112青少年软件编程(Scratch图形化)等级考试试卷(三级)

第1题:【 单选题】 下列程序哪个可以实现: 按下空格键, 播放完音乐后说“你好! ” 2 秒? ( ) A: B: C: D: 【正确答案】: C 【试题解析】 : 第2题:【 单选题】 执行下列程序, 变量 N 的值不可能是? ( ) A:1 B:4 C:5 D:6 【正确答案】: D 【试题解析】…

Git进阶用法:Git分支轻松使用,配有图文

一、文章内容 git和分支相关的概念.git和分支有关的命令.git项目实战环节. 二、相关概念 分支&#xff1a;分支的概念好比树干的分支&#xff0c;每一跟分支都是从主干分出来的&#xff0c;营养是主干给的&#xff0c;所以在git里主干和分支也是如此&#xff0c;在git里主分…

day02_mysql-DDLDMLDQL_课后练习 - 参考答案

文章目录 day02_mysql_课后练习第1题第2题 day02_mysql_课后练习 第1题 案例&#xff1a; 1、创建数据库test02_library 2、创建表格books 字段名字段说明数据类型b_id书编号int(11)b_name书名varchar&#xff08;50&#xff09;authors作者varchar(100)price价格floatpub…

opengl 学习(六)-----坐标系统与摄像机

坐标系统与摄像机 分类引言坐标系统摄像机教程在CMake中使用全局定义预编译宏,来控制是否开启错误检查补充 分类 opengl c 引言 OpenGL希望在每次顶点着色器运行后&#xff0c;我们可见的所有顶点都为标准化设备坐标(Normalized Device Coordinate, NDC)。也就是说&#xff…

pcl采样:随机采样

pcl 随机采样,实际上就是抽稀 头文件 代码 结果

ubuntu系统下如何使用vscode编译和调试#小白入门#

编程环境&#xff1a;ubuntu系统为18.04.1&#xff0c;vscode版本为1.66.2 一、VSCode切换中文显示&#xff1a; 1、vscode安装完成后启动,在左侧externsions中搜索“简体中文”插件&#xff0c;并完成安装&#xff1a; 2、选择右下角齿轮形状的"Manage"&#xff…

【C++】弥补C语言的不足(①命名冲突问题)

Hello&#xff0c;这里是关于C的入门&#xff0c;C的命名冲突问题&#xff0c;如果你像我一样对命名空间满是疑惑&#xff0c;只知道using namespace std,那么可以看下这篇文章&#xff0c;我自己之前的一些疑惑以及一些形象的理解。 命名冲突问题与命名空间 &#x1f33b;命名…

【图解物联网】第1章 物联网的基础知识

1.1 物联网入门 1.1.1 物联网 物联网的英语是Internet of Things&#xff0c;缩写为IoT&#xff0c;这里的“物”指的是我们身边一切能与网络相连的物品。只要能与网络相连&#xff0c;就都是物联网说的“物”。 物联网就是“物”之间通过连接互联网来共享信息并产生…

CSS 让元素根据内容自适应宽度

一、需求 点击链接跳转&#xff0c;只点击标红区域才跳转&#xff0c;右侧空白区域不要跳转 二、实现 宽度太宽&#xff0c;导致右侧空白区域也加了跳转效果&#xff0c;修改为 将元素的最大宽度设置为其内容所需的宽度。 方法一&#xff1a;建议方式 使用 display: inline…

MyBatis框架简述

作用 降低开发人员使用JDBC的难度降低开发人员进行Dao层的开发难度 MyBatis本质上就是对JDBC的封装&#xff0c;通过MyBatis完成CRUD。MyBatis在三层架构中负责持久层的&#xff0c;属于持久层框架。MyBatis的发展历程&#xff1a;【引用百度百科】 MyBatis本是apache的一个开…

数据结构—稀疏多项式相加

利用链表实现两个稀疏多项式相加。 代码 #include <iostream> using namespace std;// 定义多项式项结构体 typedef struct {int x; // 系数int y; // 指数 } Elemtype;// 定义链表节点结构体 typedef struct Node {Elemtype data;struct Node* next; } *LinkList, N…