#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
Mat img = imread("C:/visp-ws/opencv-4.5.1/sources/samples/data/leuvenB.jpg");
Mat gray;
cvtColor(img, gray, COLOR_BGR2GRAY);
Mat hist, hist2;
const int channels[1] = { 0 }; // 通道索引
const int bins[1] = { 256 }; // 直方图的维度
float inRanges[2] = { 0, 255 };
const float* ranges[1] = { inRanges };
calcHist(&gray, 1, channels, Mat(), hist, 1, bins, ranges); // hist类型: cv::Mat
// 绘制直方图
int hist_w = 512;
int hist_h = 400;
int width = 2;
Mat histImage = Mat::zeros(hist_h, hist_w, CV_8UC3);
Mat histImage2 = Mat::zeros(hist_h, hist_w, CV_8UC3);
//for (int i = 1; i <= hist.rows; i++)
//{
// rectangle(histImage, Point(width * (i - 1), hist_h - 1),
// Point(width * i, hist_h - cvRound(hist.at<float>(i - 1) / 15)),
// Scalar(255, 255, 255), -1);
//}
Mat hist_INF;
normalize(hist, hist_INF, 1, 0, NORM_INF, -1, Mat());
for (int i = 1; i <= hist_INF.rows; i++)
{
rectangle(histImage, Point(width * (i - 1), hist_h - 1), // 矩形的一个顶点pt1(左下)
Point(width * i, hist_h - cvRound(hist_h * hist_INF.at<float>(i - 1)) - 1), // pt1相对的顶点
Scalar(255, 255, 255), -1);
}
Mat equalizedImage;
equalizeHist(gray, equalizedImage);
calcHist(&equalizedImage, 1, channels, Mat(), hist2, 1, bins, ranges);
Mat hist_INF2;
normalize(hist2, hist_INF2, 1, 0, NORM_INF, -1, Mat());
for (int i = 1; i <= hist_INF2.rows; i++)
{
rectangle(histImage2, Point(width * (i - 1), hist_h - 1),
Point(width * i, hist_h - cvRound(hist_h * hist_INF2.at<float>(i - 1)) - 1),
Scalar(255, 255, 255), -1);
}
imshow("gray", gray);
imshow("equalizedImage", equalizedImage);
imshow("histImage", histImage);
imshow("histImage2", histImage2);
waitKey(0);
return 0;
}