5.9灰度直方图

news2024/12/26 11:11:57

目录

实验原理

实验代码

运行结果


实验原理

calcHist 函数通常是指在计算机视觉和图像处理中用于计算图像直方图的一个函数。

cv:calcHist () 用于计算一个或多个数组的直方图。它可以处理图像数据并返回一个表示像素强度分布的向量(对于灰度图像)或颜色分布(对于彩色图像)。用于计算一个或多个数组的直方图。它可以处理图像数据并返回一个表示像素强度分布的向量(对于灰度图像)或颜色分布(对于彩色图像)。

calcHist 函数原型

C++: void calcHist(const Mat* arrays, int narrays, 
    const int* channels, InputArray mask, OutputArray hist, 
    int dims, const int* histSize, const float** ranges, 
    bool uniform=true, bool accumulate=false );


C++: void calcHist(const Mat* arrays, int narrays,
    const int* channels, InputArray mask, SparseMat& hist, 
    int dims, const int* histSize, const float** ranges, 
    bool uniform=true, bool accumulate=false );


参数解释:
arrays: 指向输入图像数组的指针。这些数组通常是图像数据。
narrays: 输入数组的数量。
channels: 指定要处理的通道索引数组。对于每个输入数组,可以指定一个或多个通道。
        表示要处理的图像通道数。例如,在 RGB 图像中,[0] 表示蓝色通道,[1] 表示绿色通道,[2] 表示红色通道。
mask:  可选的掩码,用于指定感兴趣的区域(ROI)。如果未提供掩码,则使用整个输入数组(整个图像)。
hist: 输出直方图。可以是一个密集矩阵 (OutputArray) 或稀疏矩阵 (SparseMat)。
dims: 直方图的维度数量。对于单通道直方图,维度为 1;对于多通道直方图,维度等于通道数量。
histSize: 每个维度上的直方图区间数量(bins 数量)。
ranges:  每个维度上的直方图区间范围。通常是一个包含两个元素的数组,表示区间起始值和结束值。
uniform : 如果为 true,则 ranges 是均匀间隔的。默认为 true。
accumulate: 如果为 true,则将计算出的直方图累加到已有的 hist 上;如果为 false,则覆盖 hist。默认为 false。

说明
calcHist 函数用于计算一个或多个数组的直方图。它可以处理图像数据,并生成一个表示像素强度分布(对于灰度图像)或颜色分布(对于彩色图像)的直方图。

密集直方图 (OutputArray hist): 当输出为密集矩阵时,hist 将是一个包含直方图数据的一维或多维矩阵。
稀疏直方图 (SparseMat& hist): 当输出为稀疏矩阵时,hist 将是一个稀疏矩阵,适用于数据稀疏的情况。
你可以根据需要选择密集矩阵或稀疏矩阵作为输出,以便优化内存使用和处理速度。

实验代码

#include "pch.h"
#include <iostream>
#include<opencv2/opencv.hpp>
#include <opencv2\imgproc\types_c.h> //for CV_RGB2GRAY
using namespace cv;  //所有opencv类都在命名空间cv下
using namespace std;
//#pragma comment(lib, "opencv_world450d.lib")  //引用引入库 
//绘制灰度直方图
int main()
{
	Mat src, gray;
	src = imread("027.jpeg");  //读取工程目录下的图片
	

	if (src.empty()) //判断原图是否加载成功
	{
		cout << "图像加载失败" << endl;
		return -1;
	}
	cvtColor(src, gray, CV_RGB2GRAY);   //转换为灰度图
	int bins = 256;  //定义直方图的参数,包括 bin 数量(这里是256),范围是从0到256,表示灰度级的范围。 定义直方图的 bins 数量 bins 变量定义了直方图的 bins(区间)数量。在这里,我们设置为 256,意味着我们将灰度值区间 [0, 255] 分成 256 个等宽的小区间。
	int hist_size[] = { bins };//定义直方图尺寸 hist_size 是一个整数数组,用于指定直方图的尺寸。在这里,只有一个维度(因为我们计算的是单通道直方图),尺寸为 bins。
	float range[] = { 0, 256 };//定义直方图范围 range 是一个浮点数数组,用于指定直方图的范围。在这里,我们设置了从 0 到 256 的范围,这是因为我们的灰度值是从 0 到 255。
	const float* ranges[] = { range }; //定义直方图的范围指针数组 ranges 是一个指针数组,其中包含了指向 range 的指针。这是因为 calcHist 函数需要一个指针数组来接收每个维度的范围。在这种情况下,我们只有一个维度,所以只需要一个指针。
	MatND hist;//定义输出直方图矩阵,hist 是一个 MatND 类型的变量,用于存储计算得到的直方图数据。MatND 是一个多维矩阵类型,可以存储任意维度的数据。在这里,它是一个一维的直方图数据。
	int channels[] = { 0 }; //定义通道索引数组 channels 是一个整数数组,用于指定要处理的图像通道。在这里,我们只处理第一个通道(即灰度图像的唯一通道),索引为 0。
	//计算出灰度直方图
	calcHist(&gray, 1, channels, Mat(), // do not use mask
		hist, 1, hist_size, ranges,
		true, // the histogram is uniform
		false);
	//画出直方图
	double max_val;
	minMaxLoc(hist, 0, &max_val, 0, 0);  //定位矩阵中最小值、最大值的位置
	int scale = 2;//scale 是一个缩放因子,用于调整直方图图像的宽度。
	int hist_height = 256;//hist_height 是直方图图像的高度。在这个例子中,hist_height 被设定为 256。
	Mat hist_img = Mat::zeros(hist_height, bins*scale, CV_8UC3); //创建一个全0的特殊矩阵
//bins * scale 计算了直方图图像的宽度,即 256 * 2 = 512。
//这行代码创建了一个高度为 hist_height(256)、宽度为 bins * scale(512)的三通道 RGB 图像。所有的像素都被初始化为黑色(因为所有通道的值都是 0)。
	for (int i = 0; i < bins; i++)
	{
		float bin_val = hist.at<float>(i); //获取当前 bin (i) 的值。
		int intensity = cvRound(bin_val*hist_height / max_val);  //要绘制的高度 计算当前 bin 在图像上应绘制的高度。
		rectangle(hist_img, Point(i*scale, hist_height - 1),  //画矩形
			Point((i + 1)*scale - 1, hist_height - intensity),
			CV_RGB(255, 255, 255));
//使用 rectangle 函数在 hist_img 上绘制一个矩形,表示当前 bin 的直方图柱状图。矩形的位置和高度决定了直方图的形状:
//注意此处的原点坐标 位于左上角
//左下角位于 (i*scale, hist_height - 1)。
//右上角位于 ((i + 1)*scale - 1, hist_height - intensity)。
//每个 bin 的宽度为 scale 个像素,高度为 intensity 像素,颜色为白色。
	}
	//显示原图和直方图
	namedWindow("原图片", WINDOW_NORMAL);
	imshow("原图片", src);
	namedWindow("灰度图片", WINDOW_NORMAL);
	imshow("灰度图片", gray);
	namedWindow("灰度直方图", WINDOW_NORMAL);
	imshow("灰度直方图", hist_img);

	waitKey(0);
	return 0;
}

运行结果

示例扩展

尚需后续调整完善

//#include <cv.h>
//#include <highgui.h>
#include "pch.h"
#include <iostream>
#include<opencv2/opencv.hpp>
using namespace std;

using namespace cv;

int main(int argc, char** argv)
{
	Mat src, hsv;
	
	src = imread("A.jpg");
	if (src.empty()) //判断原图是否加载成功
	{
		cout << "图像加载失败" << endl;
		return -1;
	}


	cvtColor(src, hsv, CV_BGR2HSV);

	// Quantize the hue to 30 levels
	// and the saturation to 32 levels
	int hbins = 30, sbins = 32;
	int histSize[] = { hbins, sbins };
	// hue varies from 0 to 179, see cvtColor
	float hranges[] = { 0, 180 };
	// saturation varies from 0 (black-gray-white) to
	// 255 (pure spectrum color)
	float sranges[] = { 0, 256 };
	const float* ranges[] = { hranges, sranges };
	MatND hist;
	// we compute the histogram from the 0-th and 1-st channels
	int channels[] = { 0, 1 };

	calcHist(&hsv, 1, channels, Mat(), // do not use mask
		hist, 2, histSize, ranges,
		true, // the histogram is uniform
		false);
	double maxVal = 0;
	minMaxLoc(hist, 0, &maxVal, 0, 0);

	int scale = 10;
	Mat histImg = Mat::zeros(sbins*scale, hbins * 10, CV_8UC3);

	for (int h = 0; h < hbins; h++)
		for (int s = 0; s < sbins; s++)
		{
		float binVal = hist.at<float>(h, s);
		int intensity = cvRound(binVal * 255 / maxVal);
		rectangle(histImg, Point(h*scale, s*scale),
			Point((h + 1)*scale - 1, (s + 1)*scale - 1),
			Scalar::all(intensity),
			CV_FILLED);
		}

	namedWindow("Source", 1);
	imshow("Source", src);

	namedWindow("H-S Histogram", 1);
	imshow("H-S Histogram", histImg);
	waitKey();
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java:集合的相关汇总介绍

主要包含Set(集&#xff09;、 List(列表包含 Queue&#xff09;和 Map(映射)。 1、Collection&#xff1a; Collection 是集合 List、 Set、 Queue 的最基本的接口。 2、Iterator&#xff1a;迭代器&#xff0c;可以通过迭代器遍历集合中的数据。 3、Map&#xff1a;是映射表的…

VTK随笔十三:QT与VTK的交互

一、基于 Ot的 VTK 应用程序 以 VTK 读入一幅 JPG 图像&#xff0c;然后在 Qt 界面上使用 VTK 显示该图像为例&#xff0c;演示QT与VTK的交互。 1、创建QT项目QT_VTK_Demo 2、配置VTK库 在CMakeLists.txt中添加如下代码&#xff1a; 配置完成后重新打开工程加载VTK库。 3、编…

制裁下的转型:俄罗斯加密货币战略布局与人民币挂钩BRICS稳定币的崛起

在国际制裁重压下&#xff0c;俄罗斯正在积极推进加密货币政策改革&#xff0c;通过设立加密货币交易所和推动与人民币挂钩的BRICS稳定币&#xff0c;试图在全球金融体系中谋求新的生存与发展路径。这一系列举措标志着俄罗斯在数字经济领域的重大转向&#xff0c;既是对当前经济…

Linux【5】远程管理

目录 shutdown关机 ifconfig输出网卡信息 ping ip地址——检测连接正常 ssh 【-p port】 userip scp不同主机之间的文件copy 当前文件复制到远程 远程文件复制到本地 复制文件夹 -r shutdown关机 shutdown -r 重启 ifconfig输出网卡信息 ping ip地址——检测连接正常…

集成电路学习:什么是PCB印刷电路板

一、PCB&#xff1a;印刷电路板 PCB&#xff0c;全称为Printed Circuit Board&#xff0c;即印刷电路板&#xff0c;是现代电子设备中不可或缺的基础构件。它作为电子元器件的载体和连接体&#xff0c;在电子设备中发挥着至关重要的作用。以下是对PCB的详细解析&#xff1a; 二…

【C++初阶】一、C++入门(万字总结)

「前言」 「专栏」C详细版专栏 &#x1f308;个人主页&#xff1a; 代码探秘者 &#x1f308;C语言专栏&#xff1a;C语言 &#x1f308;C专栏&#xff1a; C &#x1f308;喜欢的诗句:无人扶我青云志 我自踏雪至山巅 目录 一、关于C 1.1 什么是C 1.2 C 发展史 二、C关键字(C…

5.8幂律变换

目录 示例代码1 运行结果1 示例代码2 运行结果2 补充示例原理 示例&#xff1a;使用cv::pow进行图像处理 代码 运行结果 ​编辑 补充 实验代码3 运行结果3​编辑 在OpenCV中&#xff0c;幂律变换&#xff08;Power Law Transformations&#xff09;是一种常用的图像…

集成电路学习:什么是MOSFET(MOS管)

一、MOSFET&#xff1a;MOS管 MOSFET&#xff0c;全称Metal-Oxide-Semiconductor Field-Effect Transistor&#xff0c;即金属-氧化物半导体场效应晶体管&#xff0c;也常被称为MOS管或金氧半场效晶体管。它是一种可以广泛使用在模拟电路与数字电路的场效应晶体管&#xff08;f…

【游戏安全】CheatEngine基础使用——如何对不同类型的数值进行搜索?如何破解数值加密找到想修改的数值?

游戏安全 不同数值类型的搜索破解简单数值加密 不同数值类型的搜索 可以在游戏中看到很精确的物品数量&#xff0c;但是在CE中却什么都扫不到。 这是因为他的数值类型可能并不是四字节的&#xff0c;在游戏中这个数值的机制是一个慢慢增长的数值&#xff0c;所以他很有可能是…

【重学 MySQL】八、MySQL 的演示使用和编码设置

【重学 MySQL】八、MySQL 的演示使用和编码设置 MySQL 的使用演示登录 MySQL查看所有数据库创建数据库使用数据库创建表插入数据查询数据删除表或数据库注意事项 MySQL 的编码设置查看 MySQL 支持的字符集和排序规则服务器级别的编码设置数据库级别的编码设置表级别的编码设置列…

Python3.8绿色便携版嵌入式版制作

Python 的绿色便携版有两种:官方 Embeddable 版本(嵌入式版);安装版制作的绿色版。Embeddable 版适用于需要将 Python 集成到其他应用程序或项目中的情况,它不包含图形界面的安装程序,只提供了 Python 解释器和必要的库文件。安装版包含了 Python 解释器、标准库和其他一些…

基于ssm+vue+uniapp的高校课堂教学管理系统小程序

开发语言&#xff1a;Java框架&#xff1a;ssmuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;M…

8. GIS数据分析师岗位职责、技术要求和常见面试题

本系列文章目录&#xff1a; 1. GIS开发工程师岗位职责、技术要求和常见面试题 2. GIS数据工程师岗位职责、技术要求和常见面试题 3. GIS后端工程师岗位职责、技术要求和常见面试题 4. GIS前端工程师岗位职责、技术要求和常见面试题 5. GIS工程师岗位职责、技术要求和常见面试…

Ferrari求解四次方程

参考&#xff1a; 1&#xff09; https://proofwiki.org/wiki/Ferrari’s_Method#google_vignette 2&#xff09;https://blog.csdn.net/qq_25777815/article/details/85206702

【精彩回顾·成都】COC 成都阿里云 CMeet:AIGC 创新应用技术实践!

文章目录 前言一、活动介绍二、精彩分享内容及活动议程2.1、《COC 成都社区情况和活动介绍》2.2、《浅谈 AIGC 商业化》2.3、《通义大模型与 AI 技术在各行业领域的实践与探索》2.4、《话题一&#xff1a;AIGC 在内容创作领域的革新》2.5、《话题二&#xff1a;AIGC 在技术与工…

【ubuntu使用笔记】nvme磁盘挂载失败问题记录

no object for d-bus interface 问题 no object for d-bus interface 解决方法 systemctl --user restart gvfs-udisks2-volume-monitor文件格式错误 问题 解决方法 sudo ntfsfix /dev/nvme4 sudo mount /dev/nvme4 soft/

828华为云征文|基于Flexus X实例云服务器的实际场景-等保三级服务器设置

&#x1f534;大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂 先看这里 写在前面3️⃣mysql创建安全管理员、审计管理员✅解决方法增加安全管理员增加审计管理员账户❌问题描述✅解决方法 3️⃣linux登录失败问题❌问题描述✅解决方法 3️…

ARM N2微架构介绍

简介 之前在“ARM V2处理器微架构介绍”一文中介绍了面向服务器、云计算等应用的ARM V2处理器微架构&#xff0c;V系列具有更强性能&#xff0c;N系列强调性能和功耗等方向的平衡&#xff0c;本文就将介绍一下ARM N2处理器微架构相比较前代的一些提升。尽管ARM还具备一代N1/V1…

【论文阅读】CiteTracker: Correlating Image and Text for Visual Tracking

paper&#xff1a;NorahGreen/CiteTracker: [ICCV23] CiteTracker: Correlating Image and Text for Visual Tracking (github.com) code&#xff1a;NorahGreen/CiteTracker: [ICCV23] CiteTracker: Correlating Image and Text for Visual Tracking (github.com) 简介 现有…

我与Linux的爱恋:Linux的基本指令

​ ​ 🔥个人主页:guoguoqiang. 🔥专栏:Linux的学习 Linux的指令介绍 1.1 pwd pwd用来查看当前目录 1.2 ls指令 ls[选项][目录或文件] 对于目录,该命令列出该目录下的所有子目录与文件。对于文件,将列出文件名以及其他信息 -a 列出目录下的所有文件,包括以 …