概述
背景:将彩色图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)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复