当前位置: 首页 > 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;正逐步成为企业数字化转型的重要驱动力。…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

STM32---外部32.768K晶振(LSE)无法起振问题

晶振是否起振主要就检查两个1、晶振与MCU是否兼容&#xff1b;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容&#xff08;CL&#xff09;与匹配电容&#xff08;CL1、CL2&#xff09;的关系 2. 如何选择 CL1 和 CL…...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后&#xff0c;迭代器会失效&#xff0c;因为顺序迭代器在内存中是连续存储的&#xff0c;元素删除后&#xff0c;后续元素会前移。 但一些场景中&#xff0c;我们又需要在执行删除操作…...

go 里面的指针

指针 在 Go 中&#xff0c;指针&#xff08;pointer&#xff09;是一个变量的内存地址&#xff0c;就像 C 语言那样&#xff1a; a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10&#xff0c;通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...