#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
//绘制H-S直方图。色调(H),饱和度(S),明度(V)。
//以H为横坐标,S为纵坐标来进行绘制直方图。
int main()
{
//1 载入源图,转换为hsv图。
Mat srcimage = imread("放牛图.jpg");
Mat hsvimage;
cvtColor(srcimage,hsvimage,CV_BGR2HSV);
//2参数,准备调用calcHist函数。
int nhsize = 30;
int nssize = 32;
int hist_size[] = {nhsize,nssize};
int channels[] = {0,1};
MatND hs_hist;//输出的结果,需要统计。
float hrange[2] = {0,180};//0-179色调
float srange[2] = {0,256};//saturation饱和度0-255
const float* range[] = {hrange,srange};
//3参数准备完毕,开始调用calcHist函数。
calcHist(&hsvimage,1,channels,Mat(),hs_hist,2,hist_size,range,true,false);
//4.然后开始画图参数的准备。
double maxvalue=0;
minMaxLoc(hs_hist,0,&maxvalue,0,0);//找出最大的maxvalue。
//5.开始绘图。
int x;
float t;
Mat result = Mat::zeros(nssize*10,nhsize*10,CV_8UC3);//结果的图。
for(int i=0;i<nhsize;i++)
for (int j = 0; j < nssize; j++)
{
t = hs_hist.at<float>(i, j);
x = cvRound((t*255.0)/maxvalue);//注意,次数不能为doulbe
//以方格为单位来绘制。
rectangle(result,Point(i*10,j*10),Point((i+1)*10-1,(j+1)*10-1),Scalar::all(x),FILLED);
}
//6.显示图片
imshow("rsc",srcimage);
imshow("result",result);
waitKey(0);
return 0;
}
绘制H-S直方图
最新推荐文章于 2023-10-12 14:55:55 发布