环境
代码
#include "stdafx.h"
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
using namespace cv;
using namespace std;
void getHistImg(const Mat src, Mat &histimg) {
Mat hue, hist;
int hsize = 16;
float hranges[] = { 0,180 };
const float* phranges = hranges;
int ch[] = { 0, 0 };
hue.create(src.size(), src.depth());
mixChannels(&src, 1, &hue, 1, ch, 1);
calcHist(&hue, 1, 0, Mat(), hist, 1, &hsize, &phranges);
normalize(hist, hist, 0, 255, NORM_MINMAX);
histimg = Scalar::all(0);
int binW = histimg.cols / hsize;
Mat buf(1, hsize, CV_8UC3);
for (int i = 0; i < hsize; i++)
buf.at<Vec3b>(i) = Vec3b(saturate_cast<uchar>(i*180. / hsize), 255, 255);
cvtColor(buf, buf, COLOR_HSV2BGR);
for (int i = 0; i < hsize; i++)
{
int val = saturate_cast<int>(hist.at<float>(i)*histimg.rows / 255);
rectangle(histimg, Point(i*binW, histimg.rows),
Point((i + 1)*binW, histimg.rows - val),
Scalar(buf.at<Vec3b>(i)), -1, 8);
}
}
int main(void)
{
Mat src, histimg = Mat::zeros(540, 540, CV_8UC3);
src = imread("../Da_Yuan.jpg");
if (!src.data)
{
cout << "load image failed" << endl;
return -1;
}
getHistImg(src, histimg);
imshow("histImage", histimg);
imshow("srcImage", src);
waitKey(0);
return 0;
}
结果