#include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include <iostream> using namespace cv; using namespace std; int main() { Mat srcImage = imread("F://19.jpg"); imshow("原圖", srcImage); if (!srcImage.data) { cout << "fail to load image" << endl; return 0; } MatND dstHist;//得到的直方圖 int dims = 1;//得到的直方圖的維數 灰度圖的維數為1 float hranges[2] = { 0, 255 }; const float *ranges[1] = { hranges }; // 這里需要為const類型,二維數組用來指出每個區間的范圍 int size = 256;//直方圖橫坐標的區間數 即橫坐標被分成256份 int channels = 0;//圖像得通道 灰度圖的通道數為0 //計算圖像的直方圖 calcHist(&srcImage, 1, &channels, Mat(), dstHist, dims, &size, ranges); int scale = 1; Mat dstImage(size * scale, size, CV_8U, Scalar(0)); //獲取最大值和最小值 double minValue = 0; double maxValue = 0; minMaxLoc(dstHist, &minValue, &maxValue, 0, 0); //找到直方圖中的最大值和最小值 //繪制出直方圖 int hpt = saturate_cast<int>(0.9 * size);//防止溢出 for (int i = 0; i < 256; i++) { float binValue = dstHist.at<float>(i); int realValue = saturate_cast<int>(binValue * hpt / maxValue); line(dstImage, Point(i*scale, size - 1), Point((i + 1)*scale - 1, size - realValue), Scalar(255)); } imshow("一維直方圖", dstImage); waitKey(0); return 0; }