首页 > 其他分享 >25 二维直方图

25 二维直方图

时间:2023-01-15 10:22:26浏览次数:61  
标签:25 int hs image 二维 直方图 参数

25 二维直方图

opencv知识点:

  • 计算直方图数据 - calcHist
  • 四舍五入浮点数 - cvRound
  • 寻找最小/最大值 - minMaxLoc

本课所解决的问题:

  • 如何绘制HSV图像的二维直方图?

1.二维直方图

上节课中,我们学习了一维直方图的绘制,那我们该如何绘制二维直方图呢?

关于二维直方图的绘制,我们通常选择HSV模式下的图像

我们回顾HSV的知识,可以发现

  • H(色调)范围是[0,180]

  • S(饱和度)范围是[0,255]

  • V(明度)范围是[0,255]

即HS两个通道就可以表示颜色,非常方便二维直方图的绘制

opencv中,如果我们想绘制二维维直方图,要用到三个API

  • calcHist
  • cvRound
  • minMaxLoc

介绍如下

calcHist

calcHist
	计算一维数组的直方图(输入图像可以有多通道)
		共10个参数
			第1个参数 图像数组
			第2个参数 输入图像数量
			第3个参数 通道数组
			第4个参数 可选mask
			
			第5个参数 输出直方图数据(值与对应频次)的n维数组
			第6个参数 直方图维数

					当通道为1个时,我们选择维度为1维,此时直方图数据就为一维数组
					当维度为2个时,我们选择维度为2维,此时直方图数据就为二维数组
					………………
					最大支持32维
					
					也就是说,n张图像 每张图像m个通道 可以计算出相应的直方图数据
					
					但对于绘制来说,一般都只绘制到2维,3维及以上就很复杂了

			第7个参数 histSize( bins数组,x轴长度)
			第8个参数 ranges(取值范围数组)
			
			//以下参数暂时用不到
			第9个参数 指示直方图bin间隔是否一致
						默认为true,即等间隔取值
						如果为false,则range不能写{0,255}这种,就要写{1,1,……,1}这种
								
			第10个参数 累计标志(默认为false)
				    	当多张图像的时候,
				    		如果为true,则绘制直每张方图的时候,不会从头清空
				    		会在前者直方图的基础上继续

cvRound

cvRound
	将浮点数四舍五入到最近的整数
		共1个参数
			第1个参数 要处理的浮点数

minMaxLoc

minMaxLoc
	寻找最小/最大值
		共5个参数 
			第1个参数 输入
			第2个参数 输出的最小值
			第3个参数 输出的最大值
			第4个参数 最小值下标
			第5个参数 最大值下标

2.绘制二维直方图

本课中计算的直方图维数为2维,采取方式为

  • 先转换色彩空间为HSV
  • 然后进行每个通道的直方图数据计算,得到二维数组
  • 最后利用直方图二维数组绘制直方图

我们先来输出一下得到的直方图数据

//函数定义
void histogram_2d_demo(Mat& image);

//函数实现
void QuickDemo::histogram_2d_demo(Mat& image) {
	
	// 2D 直方图
	Mat hsv, hs_hist;
	cvtColor(image, hsv, COLOR_BGR2HSV);

	int hbins = 30;
	int sbins = 32;
	int hist_bins[] = { hbins, sbins };
	
	float h_range[] = { 0, 180 };
	float s_range[] = { 0, 256 };
	const float* hs_ranges[] = { h_range, s_range };
	
	int hs_channels[] = { 0, 1 };
	
	calcHist(&hsv, 1, hs_channels, Mat(), hs_hist, 2, hist_bins, hs_ranges);

	std::cout << hs_hist;
}

可以看见,不同于上一课的256 * 1的列矩阵,这里变成了30 * 32的二维矩阵

465a41698861441ebe8a8a89549f3193

接下来,我们开始绘制二维直方图

//函数实现
void QuickDemo::histogram_2d_demo(Mat& image) {
	
	// 2D 直方图
	Mat hsv, hs_hist;
	cvtColor(image, hsv, COLOR_BGR2HSV);


	int hbins = 30;
	int sbins = 32;
	int hist_bins[] = { hbins, sbins };
	
	float h_range[] = { 0, 180 };
	float s_range[] = { 0, 256 };
	const float* hs_ranges[] = { h_range, s_range };
	
	int hs_channels[] = { 0, 1 };
	
	calcHist(&hsv, 1, hs_channels, Mat(), hs_hist, 2, hist_bins, hs_ranges);

	std::cout << hs_hist;

	double maxVal = 0;//寻找直方图数据中的最大值
	minMaxLoc(hs_hist, 0, &maxVal, 0, 0);


	int scale = 10;
	//行320 列300
	Mat hist2d_image = Mat::zeros(sbins * scale, hbins * scale, CV_8UC3);

	//h30行,s32列,一行一行的绘制矩形
	for (int h = 0; h < hbins; h++) {
		for (int s = 0; s < sbins; s++)
		{
			float binVal = hs_hist.at<float>(h, s);//位于横h,列s处的频次

			int intensity = cvRound(binVal * 255 / maxVal);//白色的强度,频次越大,小矩形越接近白色

			Point p1(h * scale, s * scale);
			/*
				矩形左上角的点
			*/
			Point p2((h + 1) * scale - 1, (s + 1) * scale - 1);
			/*
				矩形右下角的点
				-1只是为了不与其他矩形的左上角重合,不-1差异也不大
			*/

			rectangle(hist2d_image, p1, p2, Scalar::all(intensity), -1);
		}
	}

	//灰色的图像不容看出差异,这里我们转换色彩风格
	applyColorMap(hist2d_image, hist2d_image,COLORMAP_DEEPGREEN);

	imshow("H-S Histogram", hist2d_image);

}

cb0cfdba4d364e7d9bb53283bdb71570

本课所用API查阅

calcHist

cvRound

minMaxLoc

标签:25,int,hs,image,二维,直方图,参数
From: https://www.cnblogs.com/L707/p/17053146.html

相关文章

  • 24 [图像直方图
    24图像直方图opencv知识点:计算直方图数据-calcHist四舍五入浮点数-cvRound本课所解决的问题:什么是图像直方图?如何绘制彩色图像的一维直方图?1.图像直方图......
  • unable to find local peer: 172.16.26.250:8848
    unabletofindlocalpeer:172.16.26.250:8848☞​​博客导航​​,​​带你有序的阅读和学习!​​文章目录​​问题描述​​​​解决方案​​​​停节点​​问题描述当我......
  • bzoj 2554 Color 期望DP
    期望DP枚举最终能成为哪个颜色,把这个颜色看做白球,其余颜色看成黑球。最后分别把每种颜色的期望加起来就行。考虑当前有i个白球,全变成白球期望步数设为f[i]一次操作可能......
  • php 将二维数组处理成以某一列为key,某一列为value的一维数组
    $list=[0=>['id'=>1001,'name'=>'张三'],1=>['id'=>2091,'name'=>'李四']];array_combine(arr......
  • XnView v2.25
    XnView支持100多种图片格式,安装插件后支持图片格式近500种;除一般的查看、浏览、幻灯显示等功能外,还自带30多种滤镜,方便编辑修改; 可以批量转换文件格式,创建缩略图并生成网......
  • 253. 会议室 II(会员题目)
    题目给你输入若干形如[begin,end]的区间,代表若干会议的开始时间和结束时间,请你计算至少需要申请多少间会议室。函数签名如下://返回需要申请的会议室数量intminMeeting......
  • 【230113-1】解方程:a的立方+a的平方=252(据传为89年高考题)
    ......
  • AcWing257 关押罪犯
    题目大意\(\qquad\)给定一张正权无向图,定义冲突值为一个集合内权值最大的边,将一张图上的点,分成两部分,不同部分的点在原图上的边作废,求最小化最大冲突值,并输出。解题思路......
  • react中二维码生成
    参考文档:https://blog.csdn.net/weixin_45022563/article/details/124843593 awesomeqr/react案例:注意需要给父级div设置高宽下载:yarnadd@awesomeqr/react......
  • 【Python爬虫项目实战】Python爬虫豆瓣Top250电影短评数据保存本地
    前言今天给大家介绍的是Python爬虫豆瓣Top250电影短评数据保存本地,在这里给需要的小伙伴们帮助,并且给出一点小心得。开发工具Python版本:3.6相关模块:requests模块par......