26-直方图比较

OpenCV 直方图比较 直方图比较 直方图其他基础知识 直方图均值化:https://yangyongli.blog.youkuaiyun.com/article/details/122663843 直方图计算:https://yangyongli.blog.youkuaiyun.com/article/details/122663843 直方图比较方法——概述 对输入的两张图像计算得到直方图H1与H2,归一化到相同的尺度空间 然后可以通过计算H1与H2的之间的距离得到两个直方图的相似程度进 而比较图像本身的相似程度。Opencv提供的比较方法有四种: 阅读详情

直方图比较

1、直方图比较方法;
2、相关API;
3、代码演示;

直方图比较方法

1、直方图比较方法用来衡量两张图片之间的相似程度;
2、比较方法:将输入的两张图片归一化到相同的尺度空间才能进行比较,先进行归一化,再计算H1与H2之间的距离得到两个直方图的相似程度进而比较图像本身的相似程度 ,OpenCV提供了相关性比较的4种方法(数学知识):①相关性比较;②卡方比较;③十字交叉性;④巴氏距离;
在这里插入图片描述
在这里插入图片描述

相关性比较(CV_COMP_CORREL)

1、计算公式如下:
在这里插入图片描述
注:BIN表示像素划分的梯度等级的个数
2、如果H1 == H2, 则 d ( H 1 , H 2 ) d(H_1,H_2) d(H1​,H2​) = 1,表示两幅图像具有很强的相关性;计算结果 d ( H 1 , H 2 ) d(H_1,H_2) d(H1​,H2​)位于(-1,+1)之间;

卡方计算(CV_COMP_CHISQR)

1、计算公式:
在这里插入图片描述

2、如果 H 1 H_1 H1​ == H 2 H_2 H2​,d( H 1 H_1 H1​, H 2 H_2 H2​) =0, 此时表示两幅图像具有最强的相关性;

十字计算(CV_COMP_INTERSECT)

1、计算公式:
在这里插入图片描述

2、度量不好用;

巴氏距离计算(CV_COMP_BHATTACHARYYA)

1、计算公式:
在这里插入图片描述
2、d( H 1 H_1 H1​, H 2 H_2 H2​) 位于(0,1)之间;如果d( H 1 H_1 H1​, H 2 H_2 H2​) = 0,表示两幅图像相关性最强(H1==H2);如果d( H 1 H_1 H1​, H 2 H_2 H2​) = 1,表示两幅图像没有相关性(最不相似);

直方图计算

1、直方图比较方法建立在已经计算出直方图的基础上,OpenCV支持多通道图像的直方图计算,计算步骤如下:
①先将图像从RGB彩色空间转换到HSV色彩空间(取H,S分量);
②计算图像直方图,然后归一化到[0~1]之间;
③使用直方图比较方法进行比较;
在这里插入图片描述

直方图比较API

1、API : cv::compareHist(); 计算之后得到一个double返回值,根据返回值判断图像相关性;

在这里插入图片描述

Code

#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("C:\\Users\\hello\\Desktop\\lena.tiff",IMREAD_ANYDEPTH | IMREAD_ANYCOLOR);
	test1 = imread("C:\\Users\\hello\\Desktop\\lena.bmp", IMREAD_ANYDEPTH | IMREAD_ANYCOLOR);
	test2 = imread("C:\\Users\\hello\\Desktop\\lena.jpg", IMREAD_ANYDEPTH | IMREAD_ANYCOLOR);
	if (base.empty() || test1.empty() || test2.empty())
	{
		cout << "could not load the image..." << endl;
		return -1;
	}
	//色彩空间转换
	cvtColor(base, hsvbase, CV_BGR2HSV);
	cvtColor(test1, hsvtest1, CV_GRAY2BGR); //原图像是灰度图像
	cvtColor(hsvtest1, hsvtest1, CV_BGR2HSV);
	cvtColor(test2, hsvtest2, CV_BGR2HSV);

	//定义一些数据给calcHist()使用
	//设置灰度等级
	int h_bins = 50; int s_bins = 60;
	int histSize[] = { h_bins,s_bins };
	//hue varies from 0 to 179 ; saturation饱和度 from 0 to 255
	float h_ranges[] = { 0,180 };
	float s_ranges[] = { 0,256 };
	const float* ranges[] = { h_ranges,s_ranges };
	//use the 0-th and 1-th channnels
	int channels[] = { 0 ,1 };

	MatND hist_base;    //ND表示多维
	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());   //归一化到0-1之间

	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_CORREL);
	double basetest1 = compareHist(hist_base, hist_test1, CV_COMP_CORREL);
	double basetest2 = compareHist(hist_base, hist_test2, CV_COMP_CORREL);
	double test1test2 = compareHist(hist_test1, hist_test2, CV_COMP_CORREL);

	printf("test1 compare with test2 correlation value : %f", test1test2);
	//绘制文本     fontScale : 字体缩放
	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(test2, convertToString(test1test2), Point(50, 150), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(0, 0, 255), 2, LINE_AA);

	namedWindow("base", WINDOW_AUTOSIZE);
	namedWindow("test1", WINDOW_AUTOSIZE);
	namedWindow("test2", WINDOW_AUTOSIZE);

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

	waitKey(0);
	return 0;

}


string convertToString(double d)
{
	ostringstream os;
	if (os << d)
		return os.str();
	return "invalid convertion";
}

效果

1、CV_COMP_CORREL: (接近1代表相似度高)
在这里插入图片描述

2、CV_COMP_BHATTACHARYYA: 接近0代表相似度高

在这里插入图片描述
3、CV_COMP_CHISQR: 相似度越高越接近0 ,越低值越大

在这里插入图片描述
4、CV_COMP_INTERSECT:趋近于0,相似度低;

在这里插入图片描述

【源码】matlab编码和c语言实现产生高斯随机变量、瑞利变量(参数可调整)并画出归一化的直方图与理论的PDF曲线做对比,说明产生的变量的正确性 简要原理说明 matlab提供rand()函数,默认是产生在区间(0,1)上均匀分布的随机变量,根据相关的研究可知任何随机变量均可以通过(0,1)上的均匀分布变量通过一定的变换得来,这里我们直接给出相关的结论不做证明。 假设U为服从区间(0,1)上均匀分布的变量,U(i){i=1,2,3…}为之间独立同分布(IID)。 那么由12个独立同分布(IID)的U变量即可获得一个标准高斯分布的变量,如下图 通过两个独立同分布的标准高斯分布变量又可以得到一个瑞利分布的变量如下图,可以看到需要先产生N(0,a2)( 阅读详情

相关推荐

26 OpenCV 直方图均衡化

话说回直方图,我们引入直方图,很大程度上是为了让我们可以根据直方图的形态,判断图像的质量,比如根据下图所示,会很快发现一张图片是过亮还是过暗。图像直方图均衡化可以用于图像增强、对输入图像进行直方图均衡化处理,提升后续对象检测的准确率等。而在HSV色彩空间中,V通道关于亮度的,所以我们实现彩色图像的均衡化可以从V通道着手。直方图均衡化是将原图像通过某种变换,得到一幅灰度直方图为均匀分布的新图像的方法。中,如果要实现灰度图像直方图的均衡化,只要用到一个。我们本课涉及的直方图均衡化,就是比较常用的那一种。

L7O7的博客 815

直方图比较(图片相关性比较)

直方图比较方法 对输入的两张图像计算得到直方图H1和H2,归一化得到相同的尺度空间然后可以通过计算H1和H2之间的距离得到两个直方图相似程度进而比较图像本身的相似程度。opencv提供的比较方法有四种: Correlation相关性比较(CV_COMP_CORREL)越接近1越相似 Chi-Square卡方比较(CV_COMP_CHISQR)越接近0越相似 Intersection十字交叉性(C...

笔记用 7574

R语言学习笔记 ①绘制直方图 histogram

在上数据分析这门课时,老师要求使用R语言绘制直方图,以作业为例,带大家走一遍步骤 要求:Copy and Paste Your R Output From the R Script (or the output of Excel) 步骤: 首先打开RStudio,输入以下代码,目的是导入数据 v <- c(27, 27, 27, 28, 27, 25, 25, 28, 26, 28, 26, 28, 31, 30, 26, 26) 其中 v是包含直方图中使用的数值的向量 ....

Q1an的博客 1万+

【opencv学习笔记】026之直方图比较 - compareHist函数详解

1.前言 想了解直方图比较中每种比较的方式,比较的原理,希望大家能有一定的概率论基础,或者统计学基础,如果对这块理论不太了解,还想深入学习算法,建议先学习一下概率论或统计学。2.直方图比较概述对输入的两张图像进行直方图均衡化及直方图计算步骤后,可以对两个图像的直方图进行对比,并通过对比的结果得到一些我们想要的结论。3.直方图比较应用(1)图像相似度比较...

水亦心的博客 2万+

R语言ggplot2直方图、密度曲线、背景着色、直线与注释

关于基本的直方图设置、纵坐标对数变换以及基本的颜色设置,可以参考R语言ggplot2直方图设置。 本文使用的数据为:R语言自带的mtcars数据集的mpg变量。以下内容中将首先给出目标图片和代码,并逐一解释。欢迎批评指正! 目录1. 图片及所有代码2. 按步骤说明2.1 最基本的直方图(颜色,柱宽,位置)2.2 在直方图上加密度曲线2.3 添加(修改)标题与横纵轴名称,并修改标题格式。2.4 添加背景填充并且设置其颜色2.5 改变背景填充颜色2.6 添加竖直线条2.7 图中添加文字与矩形注释2.8 改变图片

weixin_45387324的博客 4万+

41.图像直方图比较

图像直方图比较(Histogram Comparison)是一种用于比较两个图像直方图相似性的方法。请注意,这里的示例代码仅演示了如何使用OpenCV进行图像直方图比较,实际应用中可能需要对图像进行预处理、参数调整等操作以获得更好的比较结果。其中,H1(i)和H2(i)分别是第一个和第二个直方图的第i个bin的值,mean()和stddev()分别表示均值和标准差函数。图像相似性度量:通过比较图像直方图的差异,可以量化地衡量两张图像之间的相似性。3.4 巴氏距离的数学推导公式为。

twnkie的博客 429

26.直方图比较

1.主要内容 直方图比较方法 相关API 代码演示 2.直方图比较方法——概述 对输入的两张图像计算得到直方图H1与H2,归一化到相同的尺度空间,然后可以通过计算H1与H2的之间的距离得到两个直方图的相似程度进而比较图像本身的相似程度。Opencv提供的比较方法有四种: Correlation 相关性比较 Chi-Square 卡方比较 Intersection 十字交叉性 Bhattach...

罗伊的博客 865

Matlab绘图------特殊图形------直方图

一、hist函数 (1)hist(x),其中x是一维向量,该函数是将x的最小值与最大值之间的区间等分为10份,输出的直方图横坐标为x,纵坐标为相应区间数值的个数。相当于hist(x,10)。从下图可以测试,可以看出两种用法是相同的。 (2)[a,b] = hist(x,n):这里是将区间分为n份,横坐标是x,纵坐标是个数。a为落在该区间的个数,b为该区间中心线位置坐标。其中,[a,b] =...

qq_25018077的博客 5万+

第26课 直方图比较

文章目录1. 直方图比较方法1.1 相关性比较1.2 卡方比较1.3 十字计算1.4 巴氏距离计算2.步骤3. 相关API3.1直方图比较compareHist()4. 例程 1. 直方图比较方法 对输入的两张图像计算得到直方图H1与H2,归一化到相同的尺度空间;然后可以通过计算H1与H2的之间的距离得到两个直方图的相似程度进而比较图像本身的相似程度。 Opencv4提供的比较方法有6种: e...

weixin_42877426的博客 445

OpenCV-Python实战(8)——直方图均衡化

图像处理技术是计算机视觉项目的核心,通常是计算机视觉项目中的关键工具,可以使用它们来完成各种计算机视觉任务。在本文中,将介绍如何使用 OpenCV 函数 cv2.equalizeHist() 执行直方图均衡,并将其应用于灰度和彩色图像,cv2.equalizeHist() 函数将亮度归一化并提高图像的对比度。

盼小辉丶的博客 2万+

OpenCV-Python实战(7)——直方图详解

直方图是一种强大的技术,可以用于更好地理解图像内容。例如,许多相机在拍照时会实时显示正在捕获的场景的直方图,以调整相机拍摄的一些参数(例如曝光时间、亮度或对比度等)。在本文中,我们将学习直方图的相关概念,以及如何创建直方图。

盼小辉丶的博客 2万+

opencv_26直方图比较

对输入的两张图像计算得到直方图H1,H2,归一化到相同的尺度空间然后可以通过计算H1和H2之间的距离得到两个直方图的相似程度,今儿比较两幅图像的相似程度。 opencv 提供四种方法 Correlation 相关性比较 Chi-Square 卡方交叉性 Intersection 十字交叉性 Bhattacharyya distance 巴氏距离 一.直方图相关性计算 HISTCMP_CORREL d 的范围是(-1,1),越靠近1表示两个直方图越相似。N是BIN的个数。 二.卡方计算 HISTCM.

weixin_41405284的博客 276

Linux运维踩坑实录:手把手教你修复LVM中PV显示[unknown]的诡异问题

本文详细解析了Linux运维中LVM物理卷(PV)显示[unknown]的故障现象及修复方法。通过分析问题根源、提供标准修复流程和特殊场景处理方案,帮助运维人员快速解决VG容量异常、PV状态丢失等问题,并分享预防措施与最佳实践,确保LVM存储系统的稳定运行。

weixin_26869081的博客 347

OpenCV基础课程笔记26直方图比较

写在前面 ☆ CV_COMP_BHATTACHARYYA 数值越小代表越接近 (巴适距离) ☆ CV_COMP_CORREL 数值越大代表越接近 (相关性计算) CV_COMP_CHISQR 数值越小说明越接近(K²) CV_COMP_INTERSECT 十字交叉(老师不懂,我更不懂,先不求甚解 ) 这里只演示相关性计算,其他的就换对应参数即可。 代码 #include<iostream> #include<opencv2/opencv.hpp&gt

爱和九九的博客 664

LLC谐振变换器设计实战:从工作原理到参数设计与调试

开关电源设计是电力电子领域的核心技术,其核心目标在于提升效率与功率密度。为实现这一目标,软开关技术应运而生,它通过精心控制开关器件的电压与电流波形,使其在开通或关断瞬间实现零电压或零电流切换,从而从根本上降低开关损耗。LLC谐振变换器正是这一技术的杰出代表,它通过引入谐振网络,巧妙地实现了主开关管的零电压开关和次级整流管的零电流开关。这种拓扑结构在服务器电源、通信设备及高端显示驱动等要求高效率、高功率密度的应用场景中价值显著。本文将以半桥LLC为例,深入剖析其工作模态与增益特性,并系统阐述其参数设计、仿真验

weixin_34129696的博客 559

浅谈专项测试之弱网络测试

浅谈专项测试之弱网络测试 一.弱网络测试背景 移动端产品的使用并非完全都是在流畅的wifi环境,大部分用户主要使用4G,3G,2G等网络,另外因为移动端产品使用的场景多变,如进公交,上地铁,坐电梯,使得弱网测试显得尤为重要。考虑到各种场景的客户端展示及容错,提升产品的印象和用户体验,提高产品的健壮性,弱网测试必不可少。 二.弱网络测试建议 网下需要进行功能点测试,无网络测试,网络切换测试等,测试过程除了关注功能点的实现,还应关注用户体验等各个方面 三.弱网络测试通用功能点总结 四.弱网络测试用例实例

ITstudy001的博客 1010

hdu 2708

import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc=new Scanner(System.in); int n=0; int[] word=new int[72]; int[] space=new int[72]; while(s...

CodeMonkey 400

一文读懂 MAVLink、PPM、SBUS:无人机通信协议的工作原理与适用场景

本文系统对比无人机领域三大核心通信协议:MAVLink作为全链路数据协议,支持飞控与地面站的双向通信,适合航拍测绘等专业场景;SBUS是数字化的高效控制协议,具备16通道、抗干扰特性,成为中高端设备标配;PPM作为传统模拟协议,成本低廉但性能有限,适合入门级应用。文章深入解析各协议的工作原理、帧结构、适用场景及调试技巧,指出MAVLink侧重状态监控、SBUS/PPM专注控制指令的互补关系,并给出新手选型建议:入门选PPM,进阶用SBUS,开发必备M

bother3000的博客 7123

opencv#26 直方图匹配

图像直方图均衡化是将原有的图像直方图的分布形式调整的更为均匀,而如果我希望将图像直方图的分布形式调整的更加集中在某个区域上,那么图像直方图均衡化是没办法实现这个功能的,这就需要本节介绍的内容:直方图匹配。

2303_77166351的博客 647

BIOS硬件监控实战:如何手动读取IT8738芯片的温度与风扇数据(附代码)

本文深入探讨了如何绕过操作系统和HWMonitor等监控软件,直接通过寄存器级操作读取IT8738超级I/O芯片的硬件监控数据。文章提供了从动态定位EC空间、构建底层读写函数到解码传感器寄存器映射的完整实战指南,并附有C语言代码示例,帮助开发者理解BIOS硬件监控的底层原理,适用于定制硬件开发与故障诊断。

weixin_29192211的博客 108

Transformer在CV里太耗算力?手把手拆解Restormer的MDTA与GDFN模块

本文深度解析了CVPR2022最佳论文提名作品Restormer的创新模块MDTA与GDFN,有效解决了Transformer在计算机视觉领域的高计算复杂度问题。通过通道注意力降维和门控前馈网络设计,Restormer在图像恢复重建任务中显著降低计算量,同时保持高性能,为实时图像处理提供了可行方案。

weixin_30258901的博客 445

Python OpenCV 图像处理之直方图的应用,取经之旅第 26 天

Python OpenCV 365 天学习计划,与橡皮擦一起进入图像领域吧。

梦想橡皮擦,专栏100例写作模式先行者,现象级专栏 《Python 爬虫 100 例》作者、《滚雪球学 Python 专栏》原创者 2万+

点云处理指南介绍

指南目录,Open3D与PCL内容介绍

NNNNNathan的博客 1万+

使用直方图比较图像的相似度

目的:   直方图在cv领域到处可见,因为其功能在cv算法的实现中比不可少。Opencv库中也集成了关于直方图的不少函数,比如直方图的计算,均衡,归一化,相似度比较等等。 为了体验这些函数,做了个小实验,功能是:打开摄像头,鼠标选定一个框,框内图像作为标准图像,计算出其直方图并显示出来;然后继续鼠标选定框,该框内的图像的直方 图与标准图像的进行相似度计算,计算结果在终端输出,数值越大表示相似

暂时为空 1万+

Unity零基础到入门 ☀️| 近万字教程 对 Unity 中的 动画系统基础 全面解析+实战演练,你确定要错过吗?

Unity动画系统,Animation,Animator。 本文对Unity中的动画系统基础做了一个全面解析,还包括实战演练。近万字教程让你对Unity的动画系统有一个系统的了解,敬请品尝!

努力前行,总会成为自己心中的那道光 9万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Python3+OpenCV3+Pycharm编程:图像直方图

matplotlib生成单通道histtogram def plot_demo(image): plt.hist(image.ravel(), 256, [0, 256]) # numpy的ravel函数功能是将多维数组降为一维数组 plt.show("histogram") calcHist生成三通道histtogram def image_hist_demo(...

iloveluoluo一个小白程序员 1557

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

上一篇: 25-直方图计算
下一篇: 27-直方图反向投影
hellohake
博客等级 码龄10年 4543粉丝 108原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值