我是靠谱客的博主 儒雅嚓茶,最近开发中收集的这篇文章主要介绍opencv c++ 二维直方图(25),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

背景:将彩色图BGR转换为HSV时,原来的三通道会被转换为两通道亮度控制通道,由此可以对转换后的HSV图像进行二维直方图绘制。

步骤:

1、转换输入图像为HSV。(注:H通道取值范围0~180,S通道的范围为0~255)定义bin参数,将H通道的bin尺寸定为30,每个bin长度6个像素值,S通道bin尺寸定为32,每个bin长度为8个像素值。其余calcHist函数所需参数定义。

2、逐个bin来获取对应bin区域的密度值,并绘制对应的矩形。

 代码:

void QuickDemo::histogram_2d_demo(Mat& image)
{
	//1、转换输入图像为HSV。(注:H通道取值范围0~180,S通道的范围为0~255)
	//定义bin参数,将H通道的bin尺寸定为30,每个bin长度6个像素值,S通道bin尺寸定为32,每个bin长度为8个像素值。其余calcHist函数所需参数定义。
	Mat hsv, hs_hist;
	cvtColor(image, hsv, COLOR_BGR2HSV);
	int hbins = 30, 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 };//定义处理通道索引
	//地址,只有1张图,通道索引,mask区域,输出图像,2通道,bins传入,通道取值范围
	calcHist(&hsv, 1, hs_channels, Mat(), hs_hist, 2, hist_bins, hs_ranges, true, false);
	double maxVal = 0;
	minMaxLoc(hsv, 0, &maxVal, 0, 0);
	int scale = 10;
	Mat histImg = Mat::zeros(sbins * scale, hbins * 10, CV_8UC3);
	//2、逐个bin来获取对应bin区域的密度值,并绘制对应的矩形。
	for (int h = 0; h < hbins; h++)
		for (int s = 0; s < sbins; s++)
		{
			float binVal = hs_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),
				-1);
		}
	applyColorMap(histImg, histImg, COLORMAP_JET);
	namedWindow("H-S Histogram", 1);
	imshow("H-S Histogram", histImg);

}

运行结果:

 

最后

以上就是儒雅嚓茶为你收集整理的opencv c++ 二维直方图(25)的全部内容,希望文章能够帮你解决opencv c++ 二维直方图(25)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部