#include <opencv2/opencv.hpp>
#include<opencv2/core/core.hpp>
#include"opencv2/highgui/highgui.hpp"
#include<opencv2/imgproc/imgproc.hpp>
#include<iostream>
#include<time.h>
#include<vector>
using namespace std;
using namespace cv;
int main()
{
Mat srcImage, hsvImage;
srcImage=imread("C:/Users/离子键/source/repos/Project8/1.jpg");
cvtColor(srcImage, hsvImage, COLOR_BGR2HSV);
int hueBinNum = 30;
int saturationBinNum = 32;
int histSize[] = { hueBinNum,saturationBinNum };
float hueRanges[] = { 0,180 };
float saturationRanges[] = { 0,256 };
const float* ranges[] = { hueRanges ,saturationRanges };
MatND disHist;
int channels[] = { 0,1 };
calcHist(&hsvImage, 1, channels, Mat(), disHist, 2, histSize, ranges, true, false);
double maxValue = 0;
minMaxLoc(disHist, 0, &maxValue, 0, 0);
int scale = 10;
Mat hisImage = Mat::zeros(saturationBinNum * scale, hueBinNum * 10, CV_8UC3);
for(int hue=0;hue<hueBinNum;hue++)
for (int saturation = 0; saturation < saturationBinNum; saturation++)
{
float binValue = disHist.at<float> (hue, saturation);
int intensity = cvRound(binValue * 255 / maxValue);
rectangle(hisImage, Point(hue * scale, saturation * scale), Point((hue + 1) * scale - 1, (saturation + 1) * scale - 1), Scalar::all(intensity), FILLED);
}
imshow("素材图", srcImage);
imshow("H-S直方图", hisImage);
waitKey();
}
运行结果如图:
原版介绍: