用C和opencv实现图像的直方图显示
时间: 2023-05-31 20:02:13 浏览: 53
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
Mat image = imread("image.jpg", CV_LOAD_IMAGE_GRAYSCALE); //读取灰度图像
if (image.empty())
{
cout << "Can not load image" << endl;
return -1;
}
namedWindow("Image", WINDOW_AUTOSIZE); //创建窗口
imshow("Image", image); //显示图像
int histSize = 256; //直方图中条目的数量
float range[] = { 0, 256 }; //像素值的范围
const float* histRange = { range };
bool uniform = true, accumulate = false;
Mat hist; //存储直方图
calcHist(&image, 1, 0, Mat(), hist, 1, &histSize, &histRange, uniform, accumulate); //计算直方图
int hist_w = 512, hist_h = 400;
int bin_w = cvRound((double)hist_w / histSize);
Mat histImage(hist_h, hist_w, CV_8UC3, Scalar(0, 0, 0)); //创建直方图图像
normalize(hist, hist, 0, histImage.rows, NORM_MINMAX, -1, Mat()); //将直方图归一化到图像高度
for (int i = 1; i < histSize; i++)
{
line(histImage, Point(bin_w*(i - 1), hist_h - cvRound(hist.at<float>(i - 1))),
Point(bin_w*(i), hist_h - cvRound(hist.at<float>(i))), Scalar(255, 0, 0), 2, 8, 0); //绘制直方图
}
namedWindow("Histogram", WINDOW_AUTOSIZE); //创建直方图窗口
imshow("Histogram", histImage); //显示直方图
waitKey(0); //等待任意键按下
return 0;
}