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

Opencv学习-直方图比较

        由于图像的直方图表示图像像素灰度值的统计特性,因此可以通过两幅图像的直方图特性比较 两幅图像的相似程度。从一定程度上来讲,虽然两幅图像的直方图分布相似不代表两幅图像相似,但是两幅图像相似则两幅图像的直方图分布一定相似。例如,在通过插值对图像进行缩放后,虽然图像的直方图不会与之前完全一致,但是两者之间一定具有很高的相似性,因而可以通过比较两幅图像的直方图分布相似性对图像进行初步的筛选与识别。
        OpenCV 4 中提供了用于比较两个图像直方图相似性的 compareHist() 函数。

1.  compareHist()函数原型

double cv::compareHist(InputArray H1, 
InputArray H2, 
int method 
)
  • H1:第一幅图像直方图。
  • H2:第二幅图像直方图,与 H1 具有相同的尺寸。
  • method:比较方法标志。 
        该函数前两个参数为需要比较相似性的图像直方图,由于不同尺寸的图像中像素数目可能不相同,为了能够得到两个图像直方图正确的相似性,需要输入同一种方式归一化后的图像直方图,并且要求两个图像直方图具有相同的尺寸。该函数中第三个参数为比较相似性的方法,选择不同的方法会得到不同的相似性系数,会将计算得到的相似性系数以 double 类型返回。由于不同计算方法的规则不一,因此相似性系数代表的含义也不相同。接下来介绍每种方法比较相似性的原理。
compareHist()函数比较直方图方法的可选择标志参数

1.1 HISTCMP_CORREL 

        该方法名为相关法, 在该方法中,如果两个图像直方图完全一致,那么计算数值为 1 ;如果两个图像直方图完全不相关,那么计算值为 0

        其中,N 是直方图的灰度值个数。 

1.2 HISTCMP_CHISQR

        该方法名为卡方法,在该方法中,如果两个图像直方图完全一致,那么计算数值为 0;两个图像的相似性越小,计算数值越大。

1.3 HISTCMP_INTERSECT 

        该方法名为直方图相交法, 该方法不会将计算结果归一化,因此,即使是两个完全一致的图像直方图,来自于不同图像,也会有不同的数值。例如,由A 图像缩放后得到的两个完全一样的直方图相似性结果与由 B 图像缩放后得到的两个完全一样的直方图相似性结果可能不相同。但是,当任意图像的直方图与 A 图像的直方图比较时,数值越大, 相似性越高,数值越小,相似性越低。

1.4 HISTCMP_BHATTACHARYYA  

        该方法名为巴塔恰里雅距离(巴氏距离)法, 在该方法中,如果两个图像直方图完全一致,那么计算数值为 0 ;两个图像的相似性越小,计算数值越大。

1.5 HISTCMP_CHISQR_ALT 

        该方法称为替代卡方法,其判断两个直方图是否相似的方法与巴氏距离法相同,常用于替代巴氏距离法用于纹理比较。

1.6 HISTCMP_KL_DIV 

        该方法名为相对熵法,又名 Kullback-Leibler 散度法, 在该方法中,如果两个图像直方图完全一致,那么计算数值为 0 ;两个图像的相似性越小,计算数值越大。

2. 示例代码

#include <opencv2/opencv.hpp> 
#include <iostream> using namespace cv; 
using namespace std; void drawHist(Mat &hist, int type, string name) //归一化并绘制直方图函数
{ int hist_w = 512; int hist_h = 400; int width = 2; Mat histImage = Mat::zeros(hist_h, hist_w, CV_8UC3); normalize(hist, hist, 1, 0, type, -1, Mat()); for (int i = 1; i <= hist.rows; i++) { rectangle(histImage, Point(width*(i - 1), hist_h - 1), Point(width*i - 1, hist_h - cvRound(hist_h*hist.at<float>(i - 1)) - 1), Scalar(255, 255, 255), -1); } imshow(name, histImage); 
} 
//主函数
int main() 
{ //system("color F0"); //更改输出界面颜色Mat img = imread("../pic/gril_1.jpg"); if (img.empty()) { cout << "请确认图像文件名称是否正确" << endl; return -1; } Mat gray, hist, gray2, hist2, gray3, hist3; cvtColor(img, gray, COLOR_BGR2GRAY); resize(gray, gray2, Size(), 0.5, 0.5); gray3 = imread("../pic/hand.jpg", IMREAD_GRAYSCALE); const int channels[1] = { 0 }; float inRanges[2] = { 0,255 }; const float* ranges[1] = { inRanges }; const int bins[1] = { 256 }; calcHist(&gray, 1, channels, Mat(), hist, 1, bins, ranges); calcHist(&gray2, 1, channels, Mat(), hist2, 1, bins, ranges); calcHist(&gray3, 1, channels, Mat(), hist3, 1, bins, ranges); drawHist(hist, NORM_INF, "hist"); drawHist(hist2, NORM_INF, "hist2"); drawHist(hist3, NORM_INF, "hist3"); //原图直方图与原图直方图的相关系数double hist_hist = compareHist(hist, hist, HISTCMP_CORREL); cout << "apple_apple=" << hist_hist << endl; //原图直方图与缩小原图后的直方图的相关系数double hist_hist2 = compareHist(hist, hist2, HISTCMP_CORREL); cout << "apple_apple256=" << hist_hist2 << endl; //两幅不同图像直方图相关系数double hist_hist3 = compareHist(hist, hist3, HISTCMP_CORREL); cout << "apple_lena=" << hist_hist3 << endl; waitKey(0); return 0; 
}

3. 测试结果 

 

相关文章:

Opencv学习-直方图比较

由于图像的直方图表示图像像素灰度值的统计特性&#xff0c;因此可以通过两幅图像的直方图特性比较 两幅图像的相似程度。从一定程度上来讲&#xff0c;虽然两幅图像的直方图分布相似不代表两幅图像相似&#xff0c;但是两幅图像相似则两幅图像的直方图分布一定相似。例如&…...

一文入门:正则表达式基础

正则表达式简介 正则表达式&#xff08;Regular Expression&#xff0c;简称regex或RE&#xff09;是一种用于匹配字符串中字符组合的模式。它广泛应用于编程语言、文本编辑器和各种工具中&#xff0c;用于执行复杂的字符串搜索和替换任务。 为什么使用正则表达式&#xff1f…...

深入理解 `@DateTimeFormat` 和 `@JsonFormat` 注解

前言 在Java应用程序中&#xff0c;处理日期和时间是一个常见的需求。无论是从数据库读取还是通过API接收数据&#xff0c;正确的日期和时间格式都是确保应用正确运作的关键因素。本文将深入探讨两个常用的注解——DateTimeFormat和JsonFormat——以及它们如何帮助我们在Sprin…...

微服务架构设计中的常见的10种设计模式

微服务架构设计的概念 微服务架构&#xff08;Microservices Architecture&#xff09;是一种用于构建分布式系统的软件设计模式。它将大型应用程序拆分成一组小型、自治的服务&#xff0c;每个服务都运行在其独立的进程中&#xff0c;服务之间通过轻量级的通信机制&#xff08…...

stripe Element 如何使用

这里要准备好几个东西&#xff1a; 一个支付成功过后的回调 还有一个下单的接口 一旦进入这个下单界面&#xff0c;就要去调下单的接口的&#xff0c;用 post, 这个 接口你自己写&#xff0c;可以写在后端中&#xff0c;也可以放到 nextjs 的 api 中。 首先说的是这个下单…...

vue3动态引入图片不显示问题

方法1.(打包后动态引用的图片未被打包入工程中,webpack,vite) 1.图片放到public 目录会更省事&#xff0c;不管是开发环境还是生产环境&#xff0c;可以始终以根目录保持图片路径的一致. 假设&#xff1a; 静态文件目录&#xff1a;src/assets/images/ 我们的目标静态文件在 …...

【流媒体】RTMPDump—AMF编码

目录 1. AMF类型2. AMF编码2.1 AMF_Number (AMF_EncodeNumber)2.2 AMF_BOOLEAN (AMF_EncodeBoolean)2.3 AMF_STRING 和 AMF_LONG_STRING (AMF_EncodeString)2.3.1 AMF_EncodeInt162.3.2 AMF_EncodeInt32 2.4 AMF_OBJECT (AMF_Encode)2.4.1 AMF_EncodeInt24 2.5 AMF_ECMA_ARRAY …...

Mysql双主双从

双主双从 1.安装Mysql1.1 查看linux版本1.2 下载Mysql安装包1.3 上传并解压1.4 安装Mysql1.5 编辑端口号1.6 Mysql启动命令1.7 更新密码 2.搭建Mysql主从复制2.1 搭建Master主服务器2.1.1 修改mysql配置文件2.1.2 重启Mysql服务2.1.3 创建Slave用户, 并授权2.1.4 查看主服务器当…...

安卓主板_MTK联发科主板定制开发|PCBA定制开发

MTK联发科安卓主板&#xff0c;采用MT6762八核平台方案&#xff0c;支持谷歌Android 11.0系统&#xff0c;MT6762采用ARM八核A53内核芯片、主频高达2.0GHz&#xff0c;GPU采用ARM PowerVR GE8329650MHZ&#xff0c;支持主流19201080分辨率&#xff0c;支持硬解H.264&#xff0c…...

结合GPT与Python实现端口检测工具(含多线程)

端口检测器是一个非常实用的网络工具&#xff0c;它主要用于检测服务器或本地计算机上的特定端口是否处于开放状态。通过这个工具&#xff0c;你可以快速识别和诊断网络连接问题&#xff0c;确保关键服务的端口能够正常接收和处理数据。这对于网络管理员和开发者来说是一个不可…...

数字媒体产业发展现状剖析,洞悉数字产业园的创新之举

在当今数字化时代&#xff0c;数字媒体产业发展迅猛&#xff0c;呈现出一片繁荣景象。然而&#xff0c;在这繁荣的背后&#xff0c;数字媒体产业发展现状也存在着诸多挑战与机遇。 数字媒体产业发展现状的一个显著特点是技术的快速更新换代。从虚拟现实&#xff08;VR&#xf…...

PDF文件转换为HTML文件

推荐使用 pdf2htmlEX&#xff08;因为确实做的比较全&#xff09; pdf2htmlEX 是一个开源工具&#xff0c;可以将PDF文件转换为HTML文件。你需要先安装pdf2htmlEX工具&#xff0c;并确保它在你的系统路径中可用。&#xff08;花时间最多就是找包&#xff09; 安装 pdf2htmlEX …...

简易版PHP软文发稿开源系统

软文发稿系统源码&#xff08;软文发布系统&#xff09;基于旧版本的媒介软文项目基础上整理出一套简易版&#xff0c;以满足不同客户群体。虽然是简易版 但麻雀虽小五脏俱全&#xff0c;基本能满足小众群体需求 具体功能如下&#xff1a; 大模块功能&#xff1a; 1、媒体发布 …...

React.createContext 的 多种使用方法 详细实现方案代码

React.createContext 是 React 的上下文 API 的核心方法之一&#xff0c;提供了一种无需通过组件树逐层传递 props 的方式来共享数据。它特别适合于全局状态的管理&#xff0c;比如用户信息、主题设置等。下面我将详细介绍 React.createContext 的多种使用方法&#xff0c;并提…...

计算机网络之IPv4深度解析

一.IP地址 IP地址的组成方式&#xff1a;网络号 主机号 可以这样理解&#xff0c;根据网络号找路由器&#xff0c;根据主机号找连着路由器的主机 早期分类的IP地址 表示如下&#xff1a; 其中&#xff0c;有些特殊的IP地址&#xff1a; 主机号全为0&#xff0c;表示本网…...

TinyGPT-V:微型视觉语言模型【VLM】

AI技术正在不断融入我们的日常生活。人工智能的一个应用包括多模态化&#xff0c;例如将语言与视觉模型相结合。这些视觉语言模型可以应用于视频字幕、语义搜索等任务。 本周&#xff0c;我将重点介绍一种名为 TinyGPT-V&#xff08;Arxiv | GitHub&#xff09;的最新视觉语言…...

pytorch自动微分

一、torch.autograd.backward(tensors, grad_tensorsNone, retain_graphNone, create_graphFalse)功能&#xff1a;自动求取梯度 grad_tensors&#xff1a;多梯度权重 # 自动求取梯度 # import torch # w torch.tensor([1.],requires_gradTrue) # x torch.tensor([2.],requir…...

TCP协议为什么是三次握手和四次挥手

1.一次握手&&二次握手 一次握手就能成功的话&#xff0c;也就代表着不需要进行确认&#xff0c;那么万一有恶意的服务器一直发送SYN&#xff0c;而服务器需要维护大量的连接&#xff0c;维护连接又需要成本&#xff0c;那么就很容易引发SYN洪水&#xff0c;导致服务器…...

利用ChatGPT提升学术论文撰写效率:从文献搜集到综述撰写的全面指南

大家好,感谢关注。我是七哥,一个在高校里不务正业,折腾学术科研AI实操的学术人。关于使用ChatGPT等AI学术科研的相关问题可以和作者七哥(yida985)交流,多多交流,相互成就,共同进步,为大家带来最酷最有效的智能AI学术科研写作攻略。 本文旨在介绍如何利用AI辅助工具,…...

智能、高效、安全,企业桌面软件管理系统,赋能企业数字化转型!提升工作效率不是梦!

为了在激烈的市场竞争中脱颖而出&#xff0c;实现可持续发展&#xff0c;数字化转型已成为企业不可或缺的战略选择&#xff01;而在这一过程中&#xff0c;一款智能、高效、安全的企业桌面软件管理系统&#xff0c;如安企神&#xff0c;正逐步成为企业数字化转型的重要驱动力。…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...

Windows安装Miniconda

一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...

Python Einops库:深度学习中的张量操作革命

Einops&#xff08;爱因斯坦操作库&#xff09;就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库&#xff0c;用类似自然语言的表达式替代了晦涩的API调用&#xff0c;彻底改变了深度学习工程…...

MinIO Docker 部署:仅开放一个端口

MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...

离线语音识别方案分析

随着人工智能技术的不断发展&#xff0c;语音识别技术也得到了广泛的应用&#xff0c;从智能家居到车载系统&#xff0c;语音识别正在改变我们与设备的交互方式。尤其是离线语音识别&#xff0c;由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力&#xff0c;广…...

Android写一个捕获全局异常的工具类

项目开发和实际运行过程中难免会遇到异常发生&#xff0c;系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler&#xff0c;它是Thread的子类&#xff08;就是package java.lang;里线程的Thread&#xff09;。本文将利用它将设备信息、报错信息以及错误的发生时间都…...